• 知行合一
    2019-12-23
    目的都是实现高内聚低耦合,但是出发的角度不一样,单一职责是从自身提供的功能出发,迪米特法则是从关系出发,针对接口而非实现编程是使用者的角度,殊途同归。
    
     65
  • Ken张云忠
    2019-12-23
    “高内聚、松耦合”“单一职责原则”“接口隔离原则”“基于接口而非实现编程”“迪米特法则”,它们之间的区别和联系吗?
    区别:
    高内聚、松耦合:是一个重要的设计思想,能够有效地提高代码的可读性和可维护性,缩小功能改动导致的代码改动范围.
    单一职责原则:A class or module should have a single reponsibility.提供的功能上要单一.
    接口隔离原则:Clients should not be forced to depend upon interfaces that they do not use.与外部关系上只依赖需要的抽象.
    基于接口而非实现编程:Program to an interface, not an implementation.是一条比较抽象、泛化的设计思想,为了提高代码的灵活性/扩展性/可维护性.
    迪米特法则:Each unit should have only limited knowledge about other units: only units “closely” related to the current unit. Or: Each unit should only talk to its friends; Don’t talk to strangers.每个单元只该依赖与它关系密切的单元,最少知道,只与关系密切的单一交互.
    联系:
    职责越单一越容易做到接口隔离,也越容易做到最少知道的迪米特法则.
    基于抽象编程抽象的知识越顶层越脱离具体实现,相对知道的内容就越少,也容易实现迪米特法则.
    接口隔离原则与迪米特法则都强调只依赖需要的部分,接口隔离原则是相对偏上层来说的,迪米特法则是相对偏具体实现来说的.
    单一职责原则/接口隔离原则/基于接口而非实现编程/迪米特法则都以实现代码的"高内聚、松耦合"为目的,提高代码的可读性和可维护性,缩小功能改动导致的代码改动范围,降低风险.
    展开
    
     23
  • 下雨天
    2019-12-25
    1.单一职责原则    
    适用对象:模块,类,接口
    侧重点:高内聚,低耦合    
    思考角度:自身

    2.接口隔离原则
    适用对象:接口,函数    
    侧重点:低耦合    
    思考角度:调用者

    3.基于接口而非实现编程
    适用对象:接口,抽象类    
    侧重点:低耦合
    思考角度:调用者

    4.迪米特法则    
    适用对象:模块,类    
    侧重点:低耦合    
    思考角度:类关系
    展开
    
     17
  • 辣么大
    2019-12-23
    关于LoD,请记住一条:方法中不要使用ChainMethods。

    坏的实践:
    Amount = customer.orders().last().totals().amount()
    和
    orders = customer.orders()
    lastOders = orders.last()
    totals = lastOders.totals()
    amount = totals.amount()

    上面的例子中,chain中的方法改变会影响很多地方。这里注意区别建造者模式和pipeline管道,这两种的chain中的方法不易改变。

    出现这样的代码,需要考虑可能是设计或实现出了问题。

    LoD如何使用:
    一个类C中的方法只能调用:
    1、C中其他实例方法
    2、它自己的参数方法
    3、它创建对象的方法
    4、不要调用全局变量(包括可变对象、可变单例)
    例如:
    class HtmlDownloader{
      Html html;
      public void downloadHtml(Transporter trans, String url){
        if(checkUrl(url)){// ok 自己的实例方法
          // return
        }
        rawData = trans.send(uri);// ok 参数对象的方法
        Html html = createHtml(rawData); // ok 它创建的对象
        html.save();// ok  它创建对象的方法
      )
      private boolean checkUrl(String url){
        // check
      }
    }

    参考:
    The Pragmatic Programmer 1st edition and 2nd edition
    展开
     16
     15
  • 刘浒
    2019-12-23
    “高内聚、松耦合” 是衡量好代码的标准之一,为了实现这样的目标,我们需要遵循如下原则:
    “基于接口而非实现编程”,接口本身就是一层抽象,接口是稳定的,实现是易变的,强调的是基于契约编程,这样能够隔离变化。实现细节代码的变化,不影依赖该接口的对象,到从而达到松耦合的目的。
    “迪米特法则”,定义的是发布的接口(类、模块等)能不能依赖,如何依赖的问题。使用者去除不必要的依赖,只依赖必要的接口。这样即使接口一旦发生变化,需要了解这一变化的类就会比较少,达到松耦合的目的。
    “接口隔离原则”,从使用者的角度考虑如何设计接口,让使用者只依赖必要的接口,不会被迫依赖不用的接口。这样即使接口一旦发生变化,需要了解这一变化的类就会比较少,这样就能符合 “迪米特法则” 。
    “单一职责原则”,针对模块、类、接口的设计,将功能相关性很强的代码抽取到一起,达到高内聚的目标。
    展开
    
     3
  • 落叶飞逝的恋
    2019-12-23
    课后讨论:代码的最终目的是高内聚、松耦合的。而为了达到这个目的,就需要利用到迪米特法则。而迪米特法则的实现,又需要利用单一职责将单个类定义职责单一化,并且为了解决多个类之间的关系,又需要用到基于接口编程而非实现编程。这样类与类之间就相当于契约化,也就是不关心类的具体实现。
    
     3
  • 小刀
    2019-12-28
    高内聚-低耦合
    单一职责-自身功能出发
    迪米特法则 类与类之间关系
    接口而非实现编程-依赖必要的抽象
    
     2
  • 黄林晴
    2019-12-23
    打卡
    所有的设计原则都相辅相成
    
     2
  • ismind
    2019-12-27
    前几天没抽出时间,今天补上。
    1,感觉还是要做笔记,现在才知道要做一下笔记,不然前面学的基本上只是留个大概的印象,效率低
    2,感觉开始有难度了,综合性更高了,开始加速了么?哈哈
    课后思考:
    1,这五个原则与思想,联系就是:都是为了提高代码的可读性、扩展性、灵活性等,这也是这些原则产生的原因之一,我觉得应该把握这个主要的目的,再去应用这些原则或者设计模式,否则单纯为了使用这些原则,那很可能适得其反,我又想起那句话:“不忘初心方得始终”,学习设计模式也要这样吧。
    老师的代码实战二,简单的序列化使用LOD原则,感觉过度设计了,不过一看后面功能变复杂了,觉得设计才合理。
    2,区别:应该是关注点不同吧,“高内聚、低耦合”关注的是类,也就是考虑类与类之间的关系;单一职责则是关注前几天没抽出时间,今天补上。
    1,感觉还是要做笔记,现在才知道要做一下笔记,不然前面学的基本上只是留个大概的印象,效率低
    2,感觉开始有难度了,综合性更高了,开始加速了么?哈哈
    课后思考:
    1,这五个原则与思想,联系就是:都是为了提高代码的可读性、扩展性、灵活性等,这也是这些原则产生的原因之一,我觉得应该把握这个主要的目的,再去应用这些原则或者设计模式,否则单纯为了使用这些原则,那很可能适得其反,我又想起那句话:“不忘初心方得始终”,学习设计模式也要这样吧。
    老师的代码实战二,简单的序列化使用LOD原则,感觉过度设计了,不过一看后面功能变复杂了,觉得设计才合理。
    2,区别:应该是关注点不同吧,“高内聚、低耦合”关注的是类,也就是考虑类与类之间的关系;单一职责则是关注某一个类或者函数的功能是否单一;接口隔离则关注不要依赖不需要的接口;基于接口而非实现编程就考虑将实现替换为接口。
    自己感觉这些还没有彻底理解,只是大概知道,感觉离掌握与熟悉还有一段距离。
    展开
    
     1
  • 戒惜舍得
    2019-12-27
    相近的功能。 怎么算相近啊。学晕了。

    作者回复: 咋这么能抬杠呢 你说我问你怎么相近 你能回答上来吗 这个也没法量化 设计模式不是算法 什么都能定量 更多的是教你思想 你自己去感受

    
     1
  • QQ怪
    2019-12-24
    老师讲的真棒👍
    
     1
  • 岁月
    2019-12-23
    如果说高内聚、松耦合等价于"中国特色社会主义", 那么“单一职责原则”“接口隔离原则”“基于接口而非实现编程”“迪米特法则”这几个原则就像是在说如何才能做到做到这样的社会? 答案就是我们要"倡导富强、民主、文明、和谐, 自由、平等、公正、法治,爱国、敬业、诚信、友善"
    
     1
  • 逆风星痕
    2019-12-23
    感觉所有设计原则和模式,都是为了代码的可读性,复用和扩展而总结出来的。好多原则可能是针对某个场景下提高代码的复用和扩展,这样有时也会辅助其他原则。迪米特原则描述类之间的关系,尽量减少依赖,但也需要类遵循单一职责原则。设计代码的时候,可以根据自己的目的,从参考相应原则的设计
    
     1
  • 再见孙悟空
    2019-12-23
    “单一职责原则”“接口隔离原则”“基于接口而非实现编程”“迪米特法则”都是为了实现 “高内聚、低耦合”的手段。做到了接口隔离,一般情况下职责也比较单一,基于接口而非实现编程,往往也会降低耦合性。有的时候使用了迪米特法则或者单一职责原则,可能会破坏高内聚原则,这种情况就要具体分析场景,以及使用接口来实现。
    
     1
  • 失火的夏天
    2019-12-23
    接口隔离感觉就是为了迪米特法则的应用,接口隔离开不需要依赖的类,只引入需要的接口和方法。

    高内聚低耦合,是针对具体的实现类的,实现类实现多个接口,相似的功能都在同一个实现类中完成。

    接口的隔离又保证对外只暴露了调用方需要的方法,外部也不能直接看到不需要的方法。代码结构也更加整洁,逻辑更清晰
    
     1
  • 不记年
    2020-02-09
    一个设计良好的软件看上去是高内聚,低耦合的。每一个模块得职责足够单一, 从逻辑上足够一致,并且提供的功能根据接口隔离原则切分得更细。模块之间的依赖做到了最小化,并且模块的依赖是根据接口去描述的,只依赖所必须的接口。
    
    
  • 不记年
    2020-02-09
    “高内聚、松耦合” 描述了模块本身与模块之间的性质
    “单一职责原则” 描述了模块本身的性质
    “接口隔离原则” 描述了模块应该以一种怎样的方式提供接口,即提供最小化依赖
    “基于接口而非实现编程” 描述了模块的开发过程
    迪米特法则 与接口隔离原则类似,不过是从调用者的角度去看该如何做到最小化依赖


    “迪米特法则”


    展开
    
    
  • STAND ALONE COMPLE...
    2020-02-04
    王老师,您好!对于最后一个例子,我有个疑问,Serializable只负责序列化,Deserializable只负责反序列化,Serialization接口实现这两个接口,我们无论是序列化还是反序列化时,实际用到的都是Serialization接口实现类,那么如果在Spring中定义Spring Bean时,需要定义Serializable和Deserializable的两个接口的Bean,但他们实际引用的都是Serialization接口实现类,总觉得对于一个实现类定义了两个Bean,只是接口不同,这样很别扭,实际开发中,这种情况又是怎样做的呢?
    
    
  • Treasure
    2020-01-19
    单一职责原则:一个类,只有一个引起它变化的原因。
    接口隔离原则:不应该强迫用户依赖它们不需要的方法。(调用者)
    迪米特法则 :强调类之间的关系,依赖应该最小花。(模块/类 的依赖关系)
    基于接口编程而非实现编程:通用原则,一个比较笼统的思想。
    都是为了实现高内聚,低耦合。
    
    
  • 沐夜星光
    2020-01-16
    序列和反序列的类通过interface拆分成两个类后,两个类的实现不是相互依赖的吗?两个类必定一起改动的吧,没有减少测试工作量啊。
    
    
我们在线,来聊聊吧