《程序员修炼之道》笔记(五)

*续 第五章弯曲,或折断

4 它只是试图

a) 以一个电子表格应用举例,除了显示表格,还要能把数值显示为柱状图,还有总计功能。实现的大概过程为:首先创建一个模型(数据自身),以及用于对其操纵的常用操作;然后创建不同的视图,以不同方式显示数据,作为表格、柱状图、总计框,每个视图都有自己的控制器。

b) 让视图与模型分离,可以用低廉的代价为自己换来许多灵活性,MVC是最为重要的维护可撤销性的途径之一。

c) MVC

模型,表示目标对象的抽象数据模型。模型对任何视图或控制器都没有直接的了解

视图。解释模型的方式。它订阅模型中的变化和来自控制器的逻辑事件。

控制器。控制视图、并向模型提供新数据的途径。它既向模型、也向视图发布事件。

(但MVC在Web应用中,受限于HTTP连接的特性,控制器无法向视图发布事件。)

d) 除了一般意义上的MVC,我们还可以超越GUI,组成模型-查看器网络。查看器对象可以是更高级对象的模型,而后者自己可能又是不同的格式化查看器的模型。



5 黑板

a) 关于黑板方法,可以用侦探的工作来举例。每个侦探都随时可以在黑板上增加各种事实、证人陈述等,以促成发现某些关联,最终破案。黑板方法有一些关键特性:

没有侦探需要知道其他任何侦探的存在

侦探可能接受过不同的训练,具有不同程度的教育背景和专业经验。但他们都渴望破案,这就是全部的共同点。

在这个过程中,不同侦探可能来来去去,并且工作班次也可能不同。

对放在黑板上的内容没有什么限制,可以是图片、判断、物证等。

基于计算机的黑板系统最初是为在人工智能中的应用而发明的,解决的问题大而复杂,如语言识别、推理系统等。现代的分布式类黑板(blackboard-like)系统有JavaSpaces和T Spaces等。



第六章 当你编码时

传统看法认为,项目一旦进入编码阶段,工作主要就是机械地把设计转换为可执行语句。但作者认为,这种态度是许多程序丑陋、低效、结构糟糕、不可维护和完全错误的最大原因。

编程不是机械工作。相反,编程时每一分钟都需要作出决策,如果要让程序享有长久、无误和富有生产力的“一生”,就必须对这些决策进行仔细地思考和判断。

不主动思考他们的代码的开发者是在靠巧合编程。

1. 靠巧合编程

a) 士兵起初没有探测到地雷,但这不过是侥幸,但他由此得出了错误的结论,认为这里没有地雷,最终导致了灾难性的结果。作为开发者,我们也工作在雷区中,应该保持警惕,不要得出错误的结论。我们应该避免靠巧合编程——依靠运气和偶然的成功——而要深思熟虑地编程。

b) 实现的偶然。实现的偶然是那些只是因为代码现在的编写方式才得以发生的事情,你最后会依靠没有计入文档的错误或是边界条件。

虽然靠巧合编程,但代码已经能工作,但这种做法很危险。因为它也许不是真的能工作,只是看起来能工作;而且我们依靠的边界条件也许只是一个偶然。在不同的情形下(比如不同的屏幕分辨率),它的表现可能就会不同;此外没有计入文档的行为可能会随着库的下一次发布而变化;而多余的和不必要的调用也会使你的代码变慢;多余的调用还会有引入新bug的风险。

对于你编写给别人调用的代码,要进行良好的模块化以及把实现隐藏在撰写了良好文档的小接口之后。

对于你调用的例程,要只依靠计入了文档的行为。

c) 语境的偶然。比如GUI,是否在依靠说英语的用户、有文化的用户,或者别的什么没有保证的东西。

d) 项目可以在所有层面上让人误入歧途,从生成需求直到测试。人们常常在头脑中带着许多假定,但这些假定很少被计入文档,而且在不同的开发者之间常常是冲突的。所以最好不要假定,而是要证明。

e) 怎样深思熟虑地编程

总是意识到你在做什么,不要做温水中的青蛙。

不要盲目地编程,试图构建你不完全理解的应用,或是使用你不熟悉的技术,就是希望自己被巧合误导。

一定要按照计划行事。

依靠可靠的事物,而不是巧合或假定。如果你不得不依靠假定,就依靠最坏的假定。

为你的假定建立文档。这有助于你澄清头脑中的假定,并把它们传达给别人。

不要只是测试你的代码,还要测试你的假定。不要猜测,要实际尝试它。编写断言测试你的假定。

为你的工作划分优先级,把时间花在重要的方面。

不要做历史的奴隶,不要让已有的代码支配将来的代码,随时准备好就进行重构。

下次如果有什么东西看起来能工作,而你却不知道为什么时,要确定它不是巧合。

时间: 2024-08-07 21:18:22

《程序员修炼之道》笔记(五)的相关文章

《OC疯狂讲义》笔记(五)

1.OC中的点语法 点语法: 对象名.成员变量名   (点语法不是访问成员变量,而是方法的调用) 它是一个编译器特性 点语法作用:可以替换传统的get和set方法的调用 点语法的前提: 首先得先有 get和set方法 点语法实质: 调用get和set方法 如果点语法出现在 = 的左边,表示设置值,相当于调用了set方法 p.age = 10; 替换为:[p setAge:10]; 如果点语法出现在 = 的右边,表示获取值,相当于调用了get方法 int age = p.age; 替换为:int

《OC疯狂讲义》笔记(一)

1.OC简介 Objective-C    继承自C和smalltalk 最小程度增加了面向对象的部分,是一门面向对象编程语言 1986. Next 得到授权 关于 Cocoa 框架(96) Cocoachina.com code4app.com 2.OC HelloWorld OC的文件有哪几种? .h  头文件(声明类) .m  OC源文件(类的实现) #import <Foundation/Foundation.h>  //导入文件 //main函数是OC得主入口函数 int main(

《OC疯狂讲义》笔记(二)

1.NSString的使用 C的字符串保存:1)字符数组      2)字符串的指针 OC中又专门的字符串处理的类(有字符串类型) NSString  不可变的字符串 NSMutableString 可变字符串 NSString 是OC字符串的类 1) NSString保存字符串 NSString *str = @"abc";    //用str保存字符串常量 创建空字符串 NSString *str = [NSString new]; str = @"xxxx";

《OC疯狂讲义》笔记(三)

1.类方法 1)什么是类方法 对象方法: -(返回值类型)方法名:(形参的类型) 形参名; 类方法 +(返回值类型)方法名:(形参的类型) 形参名; 2)类方法怎么去定义 +(返回值类型)方法名:(形参的类型) 形参名; 3)类方法的使用 调用: 对象方法:  [对象名    方法名:实参] 类方法:    [类名      方法名:实参] 4)使用类方法的好处 1)提高效率 2)减少内存空间占用 3)代码更加简洁 缺点:不能访问对象的成员变量 5)对象方法和类方法的对比 类方法        

《OC疯狂讲义》笔记(四)

1.两个关键字:self 和 super self 可以用在对象和类方法中 1)self用在对象方法中:指代的时调用当前对象方法的那个对象 2)self用在类方法中:指代的时当前类(实质是类对象) 总结:当self在方法中使用,谁调用这个方法,self指代的就是谁 super: 使用super的地方,一定存在继承关系 super调用父类的方法 2.面向对象的其他特性:继承 继承概念: 假设有两个类:A   B 继承是两个类之间的关系 假设声明B类的时候, 1)导入父类的头文件 2)设定继承关系

李刚OC语言疯狂讲义笔记

设计一个”学生“类1> 属性* 姓名* 生日用结构体作为类的实例变量(生日) #import <Foundation/Foundation.h> //定义生日的结构体 typedef struct{ int year; int month; int day; }MyDate; @interface Person : NSObject { @public NSString *_name;//定义姓名 MyDate _birthday;//定义生日 } @end @implementatio

java疯狂讲义笔记整理(第二版第一部分)

第一章    java语言概述 1.1    java语言的发展简史 1990末:    sun公司“Green计划”(James Gosling领导)        ----目的是智能家电编写一个通用嵌入式控制系统,为此创建oak 1992夏天:    "Green计划"完成新平台的部分功能 1992年11月:    "Green计划"被转为"FirstPerson有限公司"-一个sun的全资子公司,致力于创建一个高度互动的设备 1994夏天:

疯狂java笔记(五) - 系统交互、System、Runtime、Date类

一.程序与用户交互(Java的入口方法-main方法): 运行Java程序时,都必须提供一个main方法入口:public static void main(String[] args){} public:因为main方法里边可能包含同一包内或其他类的方法,为了保证能够正常执行该方法所以只能用该方法; static:调用主方法的时候不会先创建该主类的对象,而是直接通过该类来调用主方法的,所以使用static修饰; String[]:谁调用方法谁就为这个形参赋值,默认长度为0的数组 运行时:jav

java8--类加载机制与反射(java疯狂讲义3复习笔记)

本章重点介绍java.lang.reflect包下的接口和类 当程序使用某个类时,如果该类还没有被加载到内存中,那么系统会通过加载,连接,初始化三个步骤来对该类进行初始化. 类的加载时指将类的class文件读入内存,并为之创建一个java.lang.class对象,也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象.(几乎所有的类都是java.lang.Class的实例); 所以JVM最先初始化的总是java.long.Object类. 在java中,一个类用

Caliburn.Micro学习笔记(五)----协同IResult

Caliburn.Micro学习笔记(五)----协同IResult 今天说一下协同IResult 看一下IResult接口 /// <summary> /// Allows custom code to execute after the return of a action. /// </summary> public interface IResult { /// <summary> /// Executes the result using the specif