[记录]编程思想(一):提供"mechanism"还是"policy"
2009-07-23 15:12
357 查看
程序员不是一天练成的,但是遵循一些编程思想,可以使我们少走很多弯路。
今天看《Linux Device Drivers》,在第一章中提到了编程思想。我做过很多开发项目,由于不是在大团队开发的公司,例如华为,某些外企,很多项目人手很少,基本上需要独立负责,回想起来,我在系统设计结构方面确实有很大的进步。不过一直没有认真的总结。当时看Thinking in J***A,前言写得太好了,就是涉及编程思想,可以具体讲了什么,现在却也想不起来了。所以我想将看到的或者想到的,记录下来。
我记得前年有个大项目,用J***A提供的应用,在性能方面一直无法突破,做了N多的尝试和实验,什么线程分拆等等都没有用,最后我认为是J***A VM的限制,只能绕开解决。我使用了多进程的方式,当然没有进程里面也是多线程的,模拟了多个板卡工作方式,进程可以在本机或者其他机器上运行,虽然J***A VM对单个进程有限制,但是多个进程,效率可以线性增长。采用模块的方式来修改我的系统,一开始觉得工作量会很大但是真正组织起来,发现还可以。由于里面功能模块编写得完整和独立,只是换个架构,换个马甲罢了。
我觉得测试对于开发人员是很重要的,虽然有时公司可能有专门的测试人员,但是开发人员自己要给自己把关,编写测试工具是非常重要的。测试工具虽然只是辅助性质,例如我写的一个SIP的流程小程序,可能根据脚本来设置流程方式,以及增加里面SIP消息的参数header,一开始只是缺少调测编译,后来这个程序成了模拟各种环境,包括异常流程一个很重要的调测工具。还有一个我自己写的性能测试的小程序,后来有一个项目很紧急,合作小组搞了很久,在大容量上面真是越急越出问题,解决一个问题,发现一个问题。后来没有办法,通宵了几天,我以测试小程序为主体顶了上去,最后成了一个大程序。
回归正题,今天话题:提供"mechanism"还是"policy"。
这是系统设计包括OS的关键。"mechanism"解决的问题是:有什么功能提供,而"policy"解决的问题是:这些功能如何使用。这两个部分至少应该放在程序的不同位置,或者放置在不同的程序模块中。这样软件包就容易开发并且能适合特定的需求。我们也可以这么说将功能提供和实际的(特定的)应用区分开来。对于功能部分要做到policy-free。
还有一种情况,我们的程序需要通过宏定义#ifdef xxxx,来屏蔽OS的差异。这个差异包括linux和windows的通用代码,也包括某个OS不同版本之间的差异。和这些相关的代码可以视为程序中的low-level,而high-level部分的代码通过调用low-level的函数,而无须考虑版本或者平台之间差异。在编写代码的时候,我们应该区分组织他们,使得程序不仅易懂,容易维护,具有更好伸缩性和适应性。
相关链接:
我的与编程思想相关的文章
今天看《Linux Device Drivers》,在第一章中提到了编程思想。我做过很多开发项目,由于不是在大团队开发的公司,例如华为,某些外企,很多项目人手很少,基本上需要独立负责,回想起来,我在系统设计结构方面确实有很大的进步。不过一直没有认真的总结。当时看Thinking in J***A,前言写得太好了,就是涉及编程思想,可以具体讲了什么,现在却也想不起来了。所以我想将看到的或者想到的,记录下来。
我记得前年有个大项目,用J***A提供的应用,在性能方面一直无法突破,做了N多的尝试和实验,什么线程分拆等等都没有用,最后我认为是J***A VM的限制,只能绕开解决。我使用了多进程的方式,当然没有进程里面也是多线程的,模拟了多个板卡工作方式,进程可以在本机或者其他机器上运行,虽然J***A VM对单个进程有限制,但是多个进程,效率可以线性增长。采用模块的方式来修改我的系统,一开始觉得工作量会很大但是真正组织起来,发现还可以。由于里面功能模块编写得完整和独立,只是换个架构,换个马甲罢了。
我觉得测试对于开发人员是很重要的,虽然有时公司可能有专门的测试人员,但是开发人员自己要给自己把关,编写测试工具是非常重要的。测试工具虽然只是辅助性质,例如我写的一个SIP的流程小程序,可能根据脚本来设置流程方式,以及增加里面SIP消息的参数header,一开始只是缺少调测编译,后来这个程序成了模拟各种环境,包括异常流程一个很重要的调测工具。还有一个我自己写的性能测试的小程序,后来有一个项目很紧急,合作小组搞了很久,在大容量上面真是越急越出问题,解决一个问题,发现一个问题。后来没有办法,通宵了几天,我以测试小程序为主体顶了上去,最后成了一个大程序。
回归正题,今天话题:提供"mechanism"还是"policy"。
这是系统设计包括OS的关键。"mechanism"解决的问题是:有什么功能提供,而"policy"解决的问题是:这些功能如何使用。这两个部分至少应该放在程序的不同位置,或者放置在不同的程序模块中。这样软件包就容易开发并且能适合特定的需求。我们也可以这么说将功能提供和实际的(特定的)应用区分开来。对于功能部分要做到policy-free。
还有一种情况,我们的程序需要通过宏定义#ifdef xxxx,来屏蔽OS的差异。这个差异包括linux和windows的通用代码,也包括某个OS不同版本之间的差异。和这些相关的代码可以视为程序中的low-level,而high-level部分的代码通过调用low-level的函数,而无须考虑版本或者平台之间差异。在编写代码的时候,我们应该区分组织他们,使得程序不仅易懂,容易维护,具有更好伸缩性和适应性。
相关链接:
我的与编程思想相关的文章
相关文章推荐
- 好文章——C# 4.0新特性-"协变"与"逆变"以及背后的编程思想
- C# 4.0新特性-"协变"与"逆变"以及背后的编程思想
- C#4.0新特性-"协变"“.NET研究”与"逆变"以及背后的编程思想
- 一起谈.NET技术,C#4.0新特性-"协变"与"逆变"以及背后的编程思想
- 2009北海市"东盟杯"导游大赛,渤锐软件为其提供了计分及抽奖整体解决方案
- model name更改为不允许重复, 原来重复的model name则需要提供sql script处理(可加后缀"_"區分)
- 怎样才能成为PHP高手?学会"懒惰"的编程
- 整理的chm教程-"VC和VC++编程教程整理CHM"
- 由cache"引起"的内存问题——记录Linux的Cache Memory(缓存内存)机制
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(六)之Initialization & Cleanup
- 数据库"***"的媒体集有两个家族成员,但只提供了一个。必须提供所有的成员。”
- 关于 "java中常量定义在interface中好还是定义在class中好" 的一些思考
- java中int转string该用+""还是String.valueOf
- 是雏还是鹰——编程规范之变量命名
- 2、LV编程风格之非严格意义的"智能更新"-----labview编程宝典
- 集体智慧编程chapter 2提供推荐<寻找相似性的用户>
- 寻找数组中最小的k个数 "利用快速排序的思想"
- iOS企业发布问题记录一(为什么iOS的应用安装到一半时提示"无法下载应用程序"?)
- oracle数据中报错"记录被另一个用户锁住"
- vc串口编程之指令引用的内存,该内存不能为 "read "