大多数初学者都会有这样的问题,就是碰到问题就直觉地用计算机能够理解的逻辑来描述和表达待解决的问题及具体的求解过程。这其实是用计算机的方式去思考,但这样的思维却使得我们的程序只为满足实现当前的需求,不容易维护,不容易扩展,更不容易复用,从而达不到高质量代码的要求。
面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。
单一职责原则,就一个类而言,应该仅有一个引起它变化的原因。
如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭到意想不到的破坏。
面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码,这就是“开放-封闭原则”的精神所在。
说明世间万物都是遵循某种类似的规律,谁先把握了这些规律,谁就最早成为了强者。
里氏代换原则:子类型必须能够替换掉它们的父类型。
程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是过程化的设计了。
用了继承,用了抽象类就算是用好了面向对象了吗?
装饰模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
装饰模式的好处,把类中的装饰功能从类中搬移去除,这样可以简化原有的类,有效地把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。
代理模式,为其他对象提供一种代理以控制对这个对象的访问。
代理模式的几种应用场景:1、远程代理;2、虚拟代理;3、安全代理;4、只能指引。
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法是一个类的实例化延迟到其子类。
原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
MemberwiseClone()方法是这样,如果字段是指类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象,因此原始对象及其复本引用同一对象。
Dataset就是典型,有Clone()方法和Copy()方法,对应浅复制和深复制。
模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。
迪米特法则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
“一个程序员如果从来没有熬夜写程序的经历,不能算是一个好程序员,因为他没有痴迷过,所以他不会有大成就。”
两个类所做的事情相同或相似,但是具有不同的接口时要使用它。
DataAdapter就是典型的适配器模式。
IEumerator是.NET框架准备好的非泛型集合的简单迭代接口。
“复制粘贴是最容易的编程,但也是最没有价值的编程。”
单例模式,声明一个静态的类变量,将构造方法私有,外部不能直接实例化,提供一个提供实例的方法。
单例模式和多线程,需要加lock,确保当一个线程位于代码临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待,直到该对象被释放。
中介者模式,用一个中介对象来封装一些列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互。