1.开闭原则:
一个模块的修改,对拓展开放而对修改关闭。
举个例子:有一个类在项目中很多地方被使用了,但是由于需求,想对这个类进行拓展,这里可以使用继承拓展出子类,可以对子类进行修改,尽量不要修改原来的类。
2.里氏代换原则:
子类父类可以替换,子类可以使用父类所有的方法,父类可以使用子类所有的方法。
举个例子:有多个子类继承了父类,并且实现了父类的抽象方法(虽然OC中没有抽象方法或者是虚函数这个概念,但是父类方法不实现,就模拟了没有具体实现的抽象方法或者叫虚函数),在用父类创建实例的时候,声明可以用父类,创建实例可以用父类,也可以用其子类,这样,所调用的方法就会自动切换到相应的实例的方法。这个就是里氏代换原则,和面向对象的多态类似。
3.依赖倒转原则:
抽象不依赖于细节,细节依赖于抽象。(这个指的是接口)
举个例子:一个类的接口方法或者是继承得来的抽象方法,需要通过[self …]调用所在类的自己的具体的方法,这个方法是私有的方法,并不会对外开放的。在OC中,只要这个具体的方法没有写在.h文件中,就不会被外部使用,也可以降低看代码的干扰。如果把这个具体的方法写在.h文件中,也就是暴露出来了,这样会破坏封装性,而且会直接影响里氏代换原则的操作。而且如果某一个类继承这个类,又会造成额外的差异。我们尽量要做到,抽象的方法(比如这里是接口的方法)用具体实现的方法来实现,但是这个具体实现的方法不应该暴露出来,这就叫做抽象不依赖细节,细节依赖于抽象。
4.接口隔离原则:
一些接口尽量只做必要的事情,而不要做太多和这个接口无关的事情。严格遵守会让源码复用性很高。
举个例子:不要让接口做一些超出它范围的没用的事情。
5.合成/聚合复用
如果从一个类扩展出另外一个方法,尽量不要使用继承,而是要使用组合。
举个例子:如果原来的一个类已经满足不了需求了,需要添加方法,一般来说,可以用继承,如果不到万不得已,最好不用这么做,其实可以将这个类当作一个组件在新建的一个类中来使用,然后这个新建的类,可以多建立几个满足需求的方法。在这里,新的类就相当于一个容器的作用。