关于AOP,Delphi这方面完全不能与Java或.NET相比,所能用的技术也就只能是动态代理或Hook来实现,虽然也出现了MeAOP之类的框架,我还是建议从设计上去解决这类AOP的需求,或者也可以考虑采用在DailyBuild的时候做编译前预处理(比如设计成{LogAction}类似于.NET的属性特性来修饰特定的方法,当然预处理器必须自己开发)。
与开发有关的文件都应该被管理起来,而不仅仅是只管理代码,一开始就要做好目录规划,特别要注意将代码与运行时所需的资源分隔开,一般来说,可以分为Doc,Src,Res,Misc四大类,Doc存放全部相关的
文档,里面建立具体的分类目录;Src存放编译所需的文件,比如源代码和帮助的源文件;Res存放制作安装包与发布软件所需的各种资源文件,比如图片、网页等。这样做将为接下来的DailyBuild做好准备。
Delphi没有Package与Namespace的概念,因此只能利用目录上的物理划分代替逻辑划分,将同一性质的单元放置到同一目录,根据需要再划分更多子目录来存放单元。
程序的界面上的控件最好都重新规范命名,切忌在代码中出现类似Label1.txt:='abc';之类的代码。开发者应该熟悉Delphi所提供的
系统函数,切忌自己去实现Delphi已经提供了的函数,一则这样做的效率不高,二则你自己所写的代码没有经过完全的测试,很有可能存在未妥善处理的情况。我们不提倡重复发明轮子,特别是在正式的开发中这样做。开发中把握面向对象设计的原则:单一职责、开放封闭、里氏替换、依赖倒置、接口隔离、高内聚低耦合。代码就是最好的注释,变量命名尽可能的表达其本身的意义,最好的注释就是不需要注释也能很容易的看懂代码,只在需要的地方加上注释。开发人员应该将自己所写的代码视之为供别人使用的产品,不要随意的将方法声明为公开方法,只提供给别人需要的方法,每个公用方法上都应该用注释标明其功能。程序编译过程中出现的任何警告或提示都应该认真对待,争取消除每一个警告或提示,这样做是避免一些代码中可能存在的隐患。
有经验的程序员完成特定的功能会充分考虑可变的情况,将这些地方提取出来,定义为方法参数或者从配置文件中读取,这样即使需求发生变化,也能轻松应对。要写出易维护的程序应该在软件配置化和程序动态化上下功夫。特别提一提程序动态化,现在开发
网络游戏的很多,而且一般都会用到脚本引擎Lua来实现部分逻辑,这样在开发后期的调整相对变得轻松一点,以后在服务器上做修改也不会要求重新启动程序。当然在一般的项目或产品中一样可以考虑使用脚本引擎,当然不一定要用Lua,还可以有很多别的选择。比如:DelphiWebScript,RemObjectsPascalScript,AUTOMAatPASCALSCRIPTER,FastScript,InnerfusePascalScript。如果还有更高的要求,还可以考虑利用COCO/R(ParserBuilder)来实现自己的语法解析器。
开发中通常会遇到自己不能解决的问题,要知道你遇到的问题别人可能早就遇到过并解决,因此请教他人或者请教Google通常是最好的选择。上论坛提问是没有效率的方法。本地的知识库也能派上用场,比如www.delphi3000.com的离线库CodeFinder,大富翁离线资料库,
--------
控件开发
--------
控件分为不可视控件与可视控件,不可视控件其实与一般的类没什么太大的区别,只需要公布需要公布的属性为Published,如有需要也可以设计并
注册自己的属性编辑器。
开发控件也有专业的开发工具EagleCDK和EaglereAct,您不仅可以很方便的创建类,还可以在运行期测试控件,可以很方便的修改属性,即时看到效果,大大提高了开发效率。
--------
软件破解
--------
愈来愈多的开发者开始采用RSA来作为注册的加密算法,效果还算不错,虽然仍不能防止被爆破,但是至少不会出现(内存)注册机。对软件加壳也不是什么防弹衣,对于有经验的破解者几分钟就可以用OllyDbg从内存Dump(先用ProcessExplorer杀掉屏蔽调试工具的线程),接着就是用ImportREConstructor修复IAT,再用LordPE对EXE进行优化。
DeDe可以让破解者看到程序内的资源,事件,既可以静态分析,也可以在OllyDbg中对分析出的地址进行动态调试。
破解Delphi控件当然也可以用DeDe,但是我们有更好的选择,那就是DCUcu与Dcu2Pas,可以将Dcu直接反编译成汇编代码,通过静态分析其中的字符串以及调用的API,破解真的是很容易。
只有做到知己知彼,才能做到有的放矢,反破解就是做到以最小的保护代价来使得破解者付出极大的破解行动。