(delphi11最新学习资料) Object Pascal 学习笔记---第10章第6节(关于混合RAD和OOP的15个技巧)

10.6 关于混合RAD和OOP的15个技巧

​ 在本章中,我介绍了与快速应用程序开发(RAD)或可视化开发或事件驱动编程(这个三个术语都指的是同一个概念模型)相关的核心语言特性,包括属性、事件和published关键字。虽然这是一个非常强大的模型,但它有坚实的面向对象编程(OOP)架构作为后盾。有时,RAD方法可能会使开发人员忘记良好的OOP惯例。与此同时,回到纯粹的代码编写而忽略RAD方法通常又适得其反。在本章的最后一节中,我列举了一些混合这两种方法的技巧和建议。换句话说,这是“超越RAD的面向对象编程”的一个章节。

注意:本章最后一节的内容最初发表在《The Delphi Magazine》第17期(1999年7月),标题为“Delphi中的面向对象编程的20条规则”。现在我删减一些规则,对其他规则也进行了修订,但精髓任然保留。

技巧1:窗体是一个类

​ 程序员经常将窗体视为对象,而实际上它们是类。区别在于,您可以基于相同的窗体类创建多个窗体对象。令人困惑的是,IDE创建一个默认的全局变量,并且(根据您的设置)还可以在启动时为您在项目中定义的每个窗体类创建一个窗体对象。这对新手来说当然很方便,但对于任何规模大一点的应用程序来说通常是一个不好的习惯。

​ 当然,为每个窗体(及其类)和每个单元命名是非常重要的。不幸的是,这两个名称必须不同,但您可以使用一种约定以一致的方式映射这两个名称(例如,AboutForm和About.pas)。

​ 在下面的步骤中,您将看到“窗体是一个类”这个概念的实际效果。

提示2:为组件命名

​ 对于组件,使用描述性的名称很重要,不要使用窗体设计器分配的默认名称。最常见的符号是使用类类型的前几个字母,后跟组件的角色,例如BtnAddCustomer或EditName。实际上,有许多类似的符号遵循这种风格,并且真的没有理由说其中任何一个是最好的,这取决于您的个人喜好。

提示3:为事件命名

​ 为事件处理器命名同样重要。如果您为组件命名,例如,OnClick处理程序的默认名称变为BtnAddCustomerClick。尽管我们可以从按钮名称猜测方法的作用,但我认为最好使用描述方法效果命名,而不是方法触发的时机。例如,按照方法名字就是方法的作用的方式,BtnAddCustomer按钮的OnClick事件可以命名为AddCustomerToList。这使得代码更具可读性,尤其是当你从类的另一个方法中调用事件处理程序时,并有助于开发人员将相同的方法附加到多个事件或不同的组件上;但我不得不说,在任何非小程序中,将单个事件附加到多个用户界面元素时,使用 Actions 是首选。

注意 Actions 和 ActionList 组件是 VCL 和 FireMonkey UI 库的一个非常好的架构特性,它们提供了用户操作(及其状态)与它们关联的用户界面控件之间的概念分离。激活控件即可执行操作。事实上,如果从逻辑上禁用操作,与该操作相关的用户界面元素也会被禁用。这个话题超出了本书的范围,但如果你使用 VCL 或 FMX 库,还是值得研究一下的。

技巧 4:使用窗体方法
如果窗体是类,那么它们的代码就集中在方法中。除了事件处理程序,它们起着特殊作用但仍然可以像其他方法一样调用之外,向窗体类添加自定义方法通常是有用的。您可以添加执行与窗体相关的一般操作和操作的方法,并访问窗体组件的状态。向窗体添加公共方法和属性要比直接从系统的其他部分直接访问窗体组件好得多。

技巧 5:添加窗体构造函数
在运行时创建的辅助窗体可以提供除了默认构造函数(继承自TComponent类)之外的其他特定构造函数。当您需要进行特定的初始化时,我的建议是重载Create方法,添加所需的初始化参数,如下面的代码片段所示:

publicconstructor Create(const AText: string); reintroduce; overload;constructor TFormDialog.Create(const AText: string);
begininherited Create(Application);Edit1.Text := AText;
end;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/318201.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity3d 学习之按钮绑定事件

创建测试脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class myTest : MonoBehaviour {// Start is called before the first frame updatepublic Button _codeBindBtn null;void Start(){if (_codeBi…

数字旅游以科技创新为动力:推动旅游服务的智能化、网络化和个性化发展,满足游客日益增长的多元化、个性化需求

目录 一、引言 二、科技创新推动旅游服务智能化发展 1、智能化技术的引入与应用 2、智能化提升旅游服务效率与质量 三、科技创新推动旅游服务网络化发展 1、网络化平台的构建与运营 2、网络化拓宽旅游服务渠道与范围 四、科技创新推动旅游服务个性化发展 1、个性化需求…

Golang | Leetcode Golang题解之第63题不同路径II

题目&#xff1a; 题解&#xff1a; func uniquePathsWithObstacles(obstacleGrid [][]int) int {n, m : len(obstacleGrid), len(obstacleGrid[0])f : make([]int, m)if obstacleGrid[0][0] 0 {f[0] 1}for i : 0; i < n; i {for j : 0; j < m; j {if obstacleGrid[i]…

node应用部署运行案例

生产环境: 系统&#xff1a;linux centos 7.9 node版本&#xff1a;v16.14.0 npm版本:8.3.1 node应用程序结构 [rootRainYun-Q7c3pCXM wiki]# dir assets config.yml data LICENSE node_modules nohup.out output.log package.json server wiki.log [rootRainYun-Q7c…

华为Pura70发布,供应链公司进入静默保密期

保密措施&#xff1a;与华为Pura70发布相关的供应链公司在产品发布前后处于静默保密期。这可能是由于华为对于手机供应链的一些信息处于保密状态&#xff0c;尤其是关于麒麟芯片的代工厂商等敏感信息。这种保密措施有助于保持产品的神秘感&#xff0c;调动用户的好奇心&#xf…

Rust Turbofish 的由来

0x01 什么是 Turbofish 我们运行如下 Rust Snippet&#xff1a; fn main() {let numbers: Vec<i32> vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];let even_numbers numbers.into_iter().filter(|n| n % 2 0).collect();println!("{:?}", even_numbers); }不出意…

react 学习笔记二:ref、状态、继承

基础知识 1、ref 创建变量时&#xff0c;需要运用到username React.createRef()&#xff0c;并将其绑定到对应的节点。在使用时需要获取当前的节点&#xff1b; 注意&#xff1a;vue直接使用里面的值&#xff0c;不需要再用this。 2、状态 组件描述某种显示情况的数据&#…

RAG 的是与非、Rewrite 和 Rerank

有时候,我觉得人类还真是种擅长画地为牢的动物,因为突然发现,当人们以文化/理念的名义形成团体/圈子的时候,其结局都不可避免地走向了筛选和区分的道路。或许,大家都不约而同地笃信,在成年人的世界里,那条不成文的社交潜规则——“只筛选不教育,只选择不改变”。与千百…

踏上R语言之旅:解锁数据世界的神秘密码(三)

多元相关与回归分析及R使用 文章目录 多元相关与回归分析及R使用一.变量间的关系分析1.两变量线性相关系数的计算2.相关系数的假设检验 二.一元线性回归分析的R计算三、回归系数的假设检验总结 一.变量间的关系分析 变量间的关系及分析方法如下&#xff1a; 1.两变量线性相关…

【跟马少平老师学AI】-【神经网络是怎么实现的】(五)梯度消失问题

一句话归纳&#xff1a; 1&#xff09;用sigmoid激活函数时&#xff0c;BP算法更新公式为&#xff1a; 用sigmoid函数&#xff0c;O取值为0~1&#xff0c;O(1-O)最大值为0.25&#xff0c;若神经网络层数多&#xff0c;则会造成更新项趋近于0&#xff0c;称为梯度消失。 2&#…

《ElementPlus 与 ElementUI 差异集合》el-dialog 显示属性有差异

ElementPlus 用属性 v-model ElementUI 用属性 visible 其实也是 Vue2/Vue3 的差异&#xff1a;v-model 指令在组件上的使用已经被重新设计&#xff0c;替换掉了 v-bind.sync

基于Springboot+Vue的Java项目-入校申报审批系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

Python面试十问

一、深浅拷贝的区别&#xff1f; 浅拷⻉&#xff1a; 拷⻉的是对象的引⽤&#xff0c;如果原对象改变&#xff0c;相应的拷⻉对象也会发⽣改变。 深拷⻉&#xff1a; 拷⻉对象中的每个元素&#xff0c;拷⻉对象和原有对象不在有关系&#xff0c;两个是独⽴的对象。 浅拷⻉(c…

【Java从入门到精通】Java 正则表达式

目录 正则表达式实例 &#x1f349;java.util.regex 包 &#x1f349;实例 &#x1f349;捕获组 &#x1f349;实例 &#x1f349;RegexMatches.java 文件代码&#xff1a; &#x1f349;正则表达式语法 &#x1f349;Matcher 类的方法 &#x1f349;索引方法 &#…

K8S哲学 - 资源调度 DaemonSet

应用场景 日志收集 引出&#xff1a; 正常情况下&#xff0c;每个服务都会进行 各自的日志收集、但是因为他们不在 同一台 Node 上&#xff0c;导致一旦查日志就需要 调动各个 机器进行切换&#xff0c;不方便也不高效 低级做法&#xff1a; 在每个需要收集日志的机器上部…

SpringCloud系列(16)--将服务提供者Provider注册进Zookeeper

前言&#xff1a;在上一章节中我们说明了一些关于Eureka自我保护模式&#xff0c;而且自上一章节起关于Eureka的知识已经讲的差不多了&#xff0c;不过因为Eureka已经停更了&#xff0c;为了安全考虑&#xff0c;我们要用还在更新维护的注册中心来取代Eureka&#xff0c;而本章…

2024-05-02 商业分析-杭州小万科技-商业模式分析

摘要: 对杭州小万科技的商业模式进行分析,以对其做出客观的评估。 杭州小万科技的资料: 杭州小万科技有限公司 - 企知道 (qizhidao.com) 杭州小万科技有限公司网站备案查询 - 天眼查 (tianyancha.com) 杭州小万科技有限公司 - 爱企查 (baidu.com) ​ 2023年年报:

【Jenkins】持续集成与交付 (三):有关报错解决(Jenkins (2.387.3) or higher required)

🟣【Jenkins】持续集成与交付 (三):有关报错解决Jenkins (2.387.3) or higher required 一、Jenkins主页报错二、安装Jenkins插件报错三、解决过程(解压替换jenkins.war)四、重新访问登录💖The Begin💖点点关注,收藏不迷路💖 一、Jenkins主页报错 New version …

【51单片机LCD1602显示矩阵键盘原始键值】2023-6-1

缘由https://ask.csdn.net/questions/7955623 #include "reg52.h" sbit LCD1602_RS P3^5;//RS端数据命令选择(H/L) sbit LCD1602_RW P3^6;//RW端读写选择(H/L) sbit LCD1602_EN P3^7;//EN端使能信号上升沿25ns void PanDuan1602(/*LCD1602忙判断*/) { LCD1602…

一周零碎时间练习微服务(nacos,rq,springcloud,es等)内容

目录 1 总览1.1 技术架构1.2 其他1.2.1 数据库1.2.2 后端部分1.2.2.1 复习feign1.2.2.2 复习下网关网关的核心功能特性&#xff1a;网关路由的流程断言工厂过滤器工厂全局过滤器 过滤器执行顺序解决跨域问题 1.2.2.3 es部分复习 1.2.3 前端部分 2 day1 配置网关2.1 任务2.2 网关…