c++|题目1

有人将面向对象设计原则简单归为三条:

1)封装变化点_ 2)对接口进行编程_ 3)多使用组合,而不是继承? 请查阅相关资料并结合本章所学内容,谈谈对这三条的理解?

隔离变化点的好处在于,将系统中经常变化的部分和稳定的部分隔离,有助于增加复用性,并降低系统耦合度。很多设计模式的意图中都明显地指出了其对问题的解决方案,学习设计模式的要点是发现其解决方案中封装的变化点。
对接口编程的一个好处在于客户端程序并不需要了解具体的实现,而只需要了解接口中声明的方法。更大的好处在于能够使用多态性执行动态性的行为。
继承是静态行为,也就是编译时行为。这种设计缺乏灵活度,并且具有比组合更高的耦合度。而组合是动态行为,即运行时行为。可以通过使用组合的方式在设计上获得更高的灵活性。
结合面向对象设计原则_ 谈谈对类与接口“粒度”的理解?
【c++|题目1】粒度就像代码分层的单位,代码被分的越细,粒度就越小。但是在面向对象的语言中,应该以复用对象为前提,所以类粒度就是必不可少的,如果继续被分到方法或函数那一块,虽然粒度更小了,但是代码就不会简洁了。
结合李氏代换原则讨论:正方形是否是长方形的子类? 圆是否是椭圆的子类?
不是,因为长方形或者椭圆的实体类并不一定适合正方形或者园,new出对象时,前者传入两个参数,然后后者接收时,就是报运行时错误。显然不符合LSP。
下面的类是否违反了迪米特法则?为什么?
class NewsPaper { public: Color getColor() { return ariticle.getTitle().getColor(); } private: Article article; } //说明_1)Color, Article为二个类的类名,且类的实现省略了,不影响理解 //2)从代码可以看出, Articlel类有个方法为 getTitle()_ 其返回值为Ariticle对象_ //getColor()是Color类的方法,返回值为Color

违反了,因为迪米特法则是一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,而ariticle.getTitle().getColor(); 显然是调用了另一个类的方法,显然违反了迪米特法则。

    推荐阅读