注重实效的编程(1)
Post on 20-Jul-2015
382 Views
Preview:
TRANSCRIPT
注重实效A Pragmatic Approach
Horky
20/May,2010
http://blog.csdn.net/horkychen
1
Keywords
重复与复用 (Don’t Repeat Yourself)
正交性
曳光弹 & 原型
估算
专业精神
重复与复用
开发者利器Google & BaiduSourceforge & CodeProjectCtrl+C & Ctrl+V
复用不是重复使用,而是如何重复使用!
思考:物以稀为贵,越容易得到的也就越容易失去!在如此开放的网络环境下,我们的知识还有多少价值?
重复的负担
面对变化时,维护成本变大且风险很高
知识是不稳定的!唯一不变的就是变化!
BUG可能隐藏在任何位置,那是噩梦的开始!
对个人知识积累不利
常常消化不良
对策
DRY: 系统中的每一项知识都必须具有单一、无歧
义、权威的表示。
思考:
Unix提供了数量众多的小工具,而不是提供一个无
所不包的集成工具!
重复的类型
强加的重复
无意的重复
无耐性的重复
开发者之间的重复
对策
保持代码的可读性,只对需要详细说明的代码添
加注释。
注重文档表达的完整和准确。
善用设计文档!
讨论
A. 假定在一个自动配送的物流公司,一辆卡车有车型、牌照号、司
机及其他一些属性。与此类似,发运路线的属性包括路线、卡车和
司机。
B. 一天司机A打电话要请假,我们需要安排司机B来代班。
C. 公司发展不错,决定开发两条新的发送路线并且新购置一批新车
正交性 (解耦性)
如果两个或更多事物中的一个发生变化,不会影
响其他事物,这些事物就是正交的。
不要用写程序来锻炼我们的协调能力和记忆力!
我们的追求应当是: 简洁!
A
BFunc.
小故事你正乘坐直升机游览科罗拉多大峡谷,驾驶员—
—他显然犯了一个错误,在吃鱼,他的午餐——突然呻吟起来,晕了过去。幸运的是,他把你留在了离地面100英尺的地方。你推断,升降杆控制总升力,所以轻轻将其压低可以让直升机平缓降向地面。然而,当你这样做时,却发现生活并非那么简单。直升机的鼻子向下,开始向左盘旋下降。突然间你发现,你驾驶的这个系统,所有的控制输入都有次级效应。压低左手的操作杆,你需要补偿性地向后移动右手柄,并踩右踏板。但这些改变中的每一项都会再次影响所有其他的控制。突然间,你在用一个让人难以置信的复杂系统玩杂耍,其中每一项改变都会影响所有其他的输入。你的工作负担异常巨大:你的手脚在不停地移动,试图平衡所有交互影响的力量。
直升机的各个控制器不是是正交的?
正交的实现
解决方案:
1. 把直升机改造,只保留一个操作杆,组件间的连动由中央控制器统一指挥!
2. 为直升机提供一个语音接口,只要直接告诉他:“降落!”
……
思考:
》不可能在这个时候再去看操作说明书了!
》牵一发而动全身不是什么好事情!
》把变化封装起来!
正交的好处
提高生产率
改动得以局部化
促进复用
模块间组合的能力提高
降低风险
变化被限制在特定的范围
提高系统健壮性
使程序更易于进行测试
应用正交原则
项目团队
定义清晰的职能,提取公共代码部分,降低功能的
重叠
对于指定问题,需要参加讨论越多,表示其正交性越
差。
降低程序与现实世界的耦合
策略
让代码保持解耦,尽量少和别人打交道。
避免使用全局变量
单件模式是个选项
避免写相似的函数
策略模式
讨论 (1)
设计一个报表打印程序,用以打印季度
收支报告、月收支报告及日收支报告。
Solution 1 (逻辑内聚)
Function PrintReport(nFlag)
{
If nFlag is 季度
收集季度收支状况
初始化季度报表格式,并打印季度报表
Else if nFlag is 月报
……
}
讨论 (2)
Solution 2: (功能内聚)Function PrintReport(nFlag)
{
If nFlag is 季度
PrintQuarterReport(StartDate,EndDate);
Else if nFlag is 月报
PrintMonthlyReport(StartDate,EndDate);
……}
Function PrintQuarterReport(StartDate,EndDate)
{
CalculateIEAndEx(StarteDate, EndDate); //收集收支状况
初始化季度报表格式,并打印
}
讨论 (3)
Solution 3:
(面向对象的解决方案,简单工厂模式)Function PrintReport(nFlag)
{
CReport * report = NULL;
report = CReportFactory::createReport(StartDate,EndDate, nFlag);
if(report创建成功)
report->Print();
}
*对于Report类,其计算收支状况和打印的部分是相同的,差异仅在输出的格式不同。所以以策略模式来封装这种变化。
附图
曳光弹与原型
曳光弹:快速地建立起一个可以做些事的框架,
然后逐步完善!
为IPv6 TWAIN Driver编写一个可以进行IPv6通讯的小程序,并基于它实现一个公共的库。
原型:快速建立一个可以基本工作的程序。可
以使用非开发语言来制作。
为IPv6 TWAIN Driver写一个GUI程序,以确定它的行为。
建立原型
选择最快的方式来实现
如VB,Delphi,Python,或者Flash,甚至是Visio和小
画家,你首先要熟悉它,并它作为这样一个工具来
使用。
不要过于追求细节
快速形成原型,并加以演示,会帮助我们深入理解
需求。
估算
放弃估算,就是放任不负责任的开发行为。
精确度
PI
美国的议员曾提案要求将PI值定为3。
而NASA将需要12个小数位。
建议估算时以周及月为单位。
如何进行估算估算是专业能力的体现!
新的系统建立系统架构模型分解为组件设计组件的功能依功能对各个组件进行估算
展开及细化汇总
修改的系统识别需要变更的组件定义需变更的组件内容依据变更的内容进行逐项估算汇总
追踪估算,并加以修正误差!
专业精神
讨论:
什么是专业精神?
什么样的人会比较专业?
专业精神
专业精神: 问题到此都有解决之道!
注重细节
答案是清晰可信的
A. 直接给出解答
B. 提供相关的资源进行解答
Q&A
top related