新手快速自学软件开发的详细步骤 软件设计开发怎么样( 四 )


广义迪米特里定律:指对物体间信息流、流向和信息影响的控制,主要是对信息隐藏的控制 。信息隐藏可以解耦各个子系统,从而允许它们独立开发、优化、使用和修改,同时可以促进软件的重用 。因为每个模块都是独立于其他模块而存在的,所以每个模块都可以在其他地方独立使用 。一个系统的规模越大,信息隐藏就越重要,信息隐藏的重要性就越明显 。
迪米特法则的主要用途:在于控制信息的过载 。在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及; 在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限; 在类的设计上,只要有可能,一个类型应当设计成不变类; 在对其他类的引用上,一个对象对其他对象的引用应当降到最低 。例子
外观立面(结构)
迪米特里定律和设计模式门面模式和中介模式
尽量不要与系统中的其他类进行交互,以减少类之间的耦合,因为在你的系统中,扩展时可能需要修改这些类,而类之间的关系决定了修改的复杂度 。交互越多,修改越困难 。反之,如果交互作用越小,修改难度越小 。比如A类依赖B类,那么B类依赖C类,你修改A类的时候要考虑B类会不会受到影响,B类的影响会不会影响C类,这个时候如果C类又依赖D类,呵呵,我觉得这种修改就吃亏了 。
问答
面向对象设计的其他原则
包装变更
少继承多结合 。
为接口编程不是为实现编程 。
争取交互对象之间的松耦合设计 。
类应该对扩展开发的修改关闭(OCP原则)
抽象,不依赖于具体的类(依赖于倒倾原理)
密友原则:只和朋友说话(最少知识原则,迪米特里定律)
注意:一个对象对其他对象的了解应该尽可能少,将方法调用控制在界限内,只调用属于以下范围的方法:对象本身(局部方法),对象的组件被当作方法参数传入的对象,以及任何由该方法创建或实例化的对象 。
不要打电话给我(打电话给我)我会打电话给你(打电话给你)(好莱坞原则)
一个类只有一个改变的原因(单一任务SRP原则)
能解释一下李希特替换原理吗?
严格定义:如果每一个S类型的对象o1都有一个T类型的对象o2,使得当所有对象用o1替换o2时,T定义的所有程序P的行为不变,那么S类型就是T类型的一个子类型 。
通俗的表述:所有引用基类(父类)的地方都必须能够透明地使用其子类的对象 。也就是说,子类可以扩展父类的功能,但不能改变父类原有的功能 。它包含以下四层含义:
子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法 。
子类可以添加自己独特的方法 。
当子类的方法重载父方法时,方法的前置条件(即方法的参数)比父方法的输入参数宽松 。
子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)比父类的后置条件更严格 。
什么情况下会违反迪米特里定律?为什么会有这个问题?
迪米特法则建议“只和朋友说话,不要和陌生人说话”,以减少班级之间的耦合 。
给我一个开闭原则的设计模式的例子?
开放封闭原则要求你的代码对扩展开放,对修改封闭 。这意味着,如果你想添加一个新的功能,你可以很容易地添加新的代码,而不需要改变已测试的代码 。有几种设计模式是基于开闭原则的,比如策略模式 。如果需要新的策略,只需要实现接口,增加配置,不需要改变核心逻辑 。一个可行的例子是Collections.sort()方法,它基于策略模式并遵循开闭原则 。您不需要为新对象修改sort()方法,您需要做的只是实现您自己的比较器接口 。
什么时候使用分享模式(飞量模式)?[/s2/]
元模式通过共享对象来避免创建太多的对象 。为了使用元共享模式,您需要确保您的对象是不可变的,这样您就可以安全地共享它 。JDK的字符串池、整数池和长池都是使用元共享模式的好例子 。


推荐阅读