这篇文章讲述的是,我们在编程的过程中以一种什么样的价值观作为导向,遵守一些什么样的规则。就能编写出比较优秀的代码。
先说一下三个概念
模式:也就是我们通常所说的解决方案,比如要写一个循环遍历有很多实现方案。模式表达的是我们要做什么和怎么做出来。
价值观:也就是我们编程应该实现的目的,统一支配我们编程的过程。比如我们实现的模式要很灵活。
原则:实现解决方案的准则。价值观为我们实现解决方案提供了方向,原则就是告诉我们在实现这种解决方案的过程中应该遵守怎么样的规则。
他们三者之间的关系是:模式描述了要做什么,价值观提供了动机,原则把动机转变成了实际行动。
也就是我们在编写一种解决方案的时候,应该有一种价值观导向(我们要编写出什么样的程序),在编写的过程中应该遵守一定的规则来实现这种价值观。(比如变量命名要规范之类)
价值观
有3个价值观与优秀的编程血脉相连。它们分别是:沟通,简单与灵活。
1.沟通
在编程的时候,我们很容易从计算机的角度进行思考,但只有一面编程一面考虑其他人的感受,才能编写出好的代码。也就是我们在编写代码的时候,想想别人看到这段代码会怎么想?Knuth提出过一种文学编程理论:程序应该读起来像一本优秀的小说,它需要有情节与韵律,句子之间应该有优雅的小小跌宕起伏。
2. 简单
尽量使程序的逻辑简单。去掉多余的复杂性可以让那些阅读,使用与修改代码的人更容易理解。有些复杂性是内在的,它们准确地反映出所有解决问题的复杂性。但有些复杂性的产生完全是因为我们忙着让程序跑起来,在摆弄过程中留下来的“指甲印”没有擦干净。所以回顾自己做过的事情,把麦子和糠分开,是编程不可或缺的一部分。
其实这个目的与沟通是相辅相成的,程序逻辑越简单,与读者沟通也就越方便。
3. 灵活
在三个价值观中,灵活是衡量那些低效编码与设计实践的一把标尺。程序越灵活,后面维护起来也就越方便。但是灵活性的提高是以复杂性提高为代价的,这就需要我们好好权衡一下利弊了。不要盲目追求程序的灵活性而增加程序的复杂度。
原则
我们在编程的过程中应该遵守的一些准则。
1. 局部化影响
组织代码结构的时候,要保证变化只会产生局部化影响。如果这里的一个变化引起那里的一个问题,那么变化的代价就会急剧上升了。把影响范围缩到最小,代码就会有极佳的沟通效果。它可以被逐步深入理解,而不必一开始就要鸟瞰全图。
2. 最小化重复
如果相同的代码出现在多个地方,那么改动一处副本的时候,就不得不考虑是否需要修改其他的副本。这样变动不在发生在局部了,代码重复的越多,变化的代价就越高。所以我们要把重复的代码抽出来形成一小段代码或者方法,保证变化只会带来局部化影响。
3. 将逻辑与数据捆绑
把逻辑与逻辑所处理的数据放在一起,在发生变化的时候,数据和逻辑可能同时需要改动。如果把他们放在一起,那么修改它们所造成的影响只会停留在局部。
4. 对称性
程序中处处充满了对称性,比如add()方法总是伴着remove()方法。识别出对称性,把它清晰表达出来,代码将更加容易阅读。一但阅读者理解了对称性所涵盖的某一半,它们就会很快理解另外一半。程序中的对称性指的是概念上的对称性,无论在什么地方,同样的概念都以同样的形式呈现。
比如: 缺少对称性的例子:
void process() {
input();
count++;
output();
}
第二条语句更加具体。应该跟第一条与第三条语句一样使用方法的形式展示。
void process() {
input();
incrementCount();
output();
}
但是这个方法依然违反了对称性。第一个方法和第三个方法都是以方法意图来命名的,而第二个方法是以实现方式来命名的。我们应该想到我count++是为了干什么,于是就像如下的结果:(tally: 记账)
void process() {
input();
tally();
output();
}
5. 声明式表达
实现模式背后另一条原则是尽可能声明式地表达出你的意图。(这个地方没看得很明白,不详述了,今后补充!)
6. 变化率
把具有相同变化率的逻辑,数据放在一起,把具有不同变化率的逻辑与数据分离。一个对象中所有成员变量的变化率应该差不多相同。两个同时变化但又和其他成员的变化步调不一致的变量应该属于某一个辅助对象。比如金融票据的数值和币种会同时变化,那么这两个变量最好放到一个辅助对象里面:
setAmount(int value, String currency) {
this.value = value;
this.currency = currency;
}
调整为:
setAmount(Money money) {
this.money = money;
}
变化率原则也是对称性的一个应用,不过是时间上的对称。在上面的例子中value与currency是对称的,它们会同时变化。但它们与其他字段不对称,把它们放到属于自己的对象中,让新的对象向阅读者传递它们的对称关系,这样就更可以在将来消除重复,进一步达到影响的局部化。
分享到:
相关推荐
书中的重点之一可能是对Gang of Four(GoF)23种经典设计模式的讲解,如工厂模式、单例模式、建造者模式、原型模式、适配器模式、装饰器模式、桥接模式、组合模式、装饰模式、代理模式、命令模式、责任链模式、解释...
总之,《C++设计新思维:泛型编程与设计模式之应用》是一本将理论与实践完美结合的作品,它不仅适合那些初入编程领域的新人,也适用于那些希望提高自身技能的资深开发者。通过这本书,读者将能够更好地利用C++的泛型...
总之,C++ AOP编程理论的研究和应用,能够帮助开发者在面对庞大的代码库维护挑战时,提供更加灵活和高效的解决方案。通过模拟或者采用专门的AOP工具,可以将横切关注点从核心业务逻辑中分离出来,从而提高代码的整洁...
总之,《编程之道-IOS设计模式解析》是一本全面且实用的iOS设计模式指南,它不仅能提升开发者对设计模式的理解,也能帮助他们更好地应对iOS开发中的各种挑战。通过深入学习和实践,开发者可以提升自己的编程技巧,...
《Objective-C编程之道:iOS 设计模式解析》是一本深入探讨Objective-C编程语言在iOS开发中的应用,特别是针对设计模式的书籍。这本书结合了理论与实践,提供了丰富的源代码示例,帮助开发者深入理解如何在iOS应用...
在Java语言中,面向对象编程是其核心特性之一,使得Java成为企业级应用开发的首选语言。以下是对"使用Java实现面向对象编程"这一主题的详细阐述。 1. **类与对象**:Java中的所有数据结构都以类的形式存在,类是...
《Objective-C编程之道:iOS设计模式解析 源码与demo》是一本深入探讨Objective-C在iOS开发中的应用,特别是设计模式方面的书籍。通过源码和demo,读者可以直观地理解并实践各种设计模式,提升iOS应用开发的专业技能...
在Java语言中,面向对象编程是其核心特性之一,北大青鸟6.0S2课程针对这一主题进行了深入的教学。 1. **类与对象**: - **类**:类是创建对象的模板,定义了对象的数据属性和行为方法。在Java中,我们使用`class`...
1. **工厂模式**:创建型模式之一,提供了一种创建对象的最佳方式,允许代码在不指定具体类的情况下创建对象。 2. **单例模式**:确保一个类只有一个实例,并提供全局访问点,常用于管理共享资源或配置对象。 3. **...
《C++ 设计新思维:范型编程与设计模式之应用》是一本深入探讨C++编程技巧和设计原则的专业书籍,旨在帮助开发者更好地理解和利用C++的范型编程以及设计模式,提升代码质量和可维护性。书中内容涵盖广泛,不仅涉及...
80386处理器是英特尔公司推出的一款32位微处理器,它引入了一种全新的运行模式——保护模式,这是从实模式向现代操作系统基础的重要转变。保护模式为多任务、内存管理和硬件虚拟化提供了强大的支持,是现代操作系统...
简单工厂模式是创建型设计模式之一,它提供了一种创建对象的最佳方式。在这个章节中,作者分享了简单工厂模式的使用场景和它带来的好处。 随着业务逻辑的扩展,简单工厂模式可能不再适用,这时可以采用策略模式来...
《设计新思维:范型编程与设计模式之应用》是一本深入探讨C++编程思想的著作,由Andrei Alexandrescu撰写,旨在帮助开发者更好地理解和应用范型编程以及设计模式。这本书是C++领域的经典之作,它将抽象的理论与实践...
Java作为一种强大的编程语言,其设计初衷之一就是全面拥抱OOP理念,这不仅体现在语言结构上,更体现在其对软件工程实践的影响上。 #### 封装(Encapsulation) 封装是OOP的核心概念之一,它指的是将数据和操作这些...
《C++ 设计新思维:范型编程与设计模式之应用》是一本深入探讨C++编程技巧和设计理念的专业书籍。本书旨在帮助读者理解和掌握C++中的范型编程(Generic Programming)以及设计模式(Design Patterns)的应用,从而...
创建型模式作为设计模式的五种主要类别之一,它主要关注的是对象的创建过程,通过抽象和封装创建过程中的变化点,使得系统能够更加灵活地应对未来的变化。 创建型模式包括多种不同的模式,例如工厂模式、单态模式、...
机械压力机作为重要的锻压设备之一,其控制方式通常采用PLC进行自动化管理。然而,传统PLC程序的编写和调试过程存在一定的局限性,例如无法脱离实际设备进行程序验证。因此,开发一套能够在计算机上模拟PLC控制的...
同时,MATLAB的可视化功能也是其亮点之一,通过绘制二维和三维图形,可以帮助读者直观理解各种模式识别和智能计算的结果。 此外,书中可能还包含了各种实例分析和实验项目,通过实际操作来加深对理论知识的理解。...
7. **事件驱动编程**:Delphi的事件驱动模型是其特色之一。源代码中会有很多关于响应用户事件、系统事件的处理,如按钮点击、定时器触发等。 8. **单元测试**:Delphi支持DUnit等单元测试框架,源代码可能包含测试...