• 【讨论】关于什么时候使用module,什么时候使用class


    一段逻辑既可以做一个module,也可以做一个class
    老早之前就在纠结这个问题,实在找不出个界限

    最近和同事讨论了一下,有了新的认识,和大家讨论一下
    1.module比较关注的是功能方面,它把方法收集在一起,组成一个特殊的上下文,通常表示一种能力,比如Enumerable。
    2.class就是我们所理解的经典的类,它可以创建实例对象,包含实例变量和类变量,一般通过对象来与外界交流。

    除了这些,我认为class通常都是逻辑完整的,甚至能在现实世界中找到对应物,而对module来说却很难是逻辑完整的,因为module只能描述一个特殊的上下文,而这个上下文通常无法组成一个完整的对象,需要被找一个宿主,而这个宿主有可能是class,也有可能是module

     
    huacnlee · #1 · 2 年前 1 人喜欢 

    需要用于做命名空间或用于 mixin 的时候用 module, 其他时候用 class

     
    hhuai · #2 · 2 年前 喜欢 

    当class中或多个class中有重复代码需要抽象出来时,你会想要一个module的东东。
    因为不能多重继承,只好用module来补偿一下。

    另一点我觉得更容易解耦,继承哪个类,你只能选一个,但具体要include哪几个module你可以根据不同需求选择不同的module. 有了autoload更加能优化性能。

    总的一点来说,顺其自然,你当前用什么能达到目的就用啥,过几个月或几个星期,觉得以前的写法不爽时你会自己回来重构的。

     
    firsthym · #3 · 2 年前 喜欢 

    module就像是工具箱,里面的各种工具,就是class

     
    xuluan · #4 · 2 年前 喜欢 

    module 感觉有点像cpp里面的抽象类
    当然只是类似,其间还是有很多差别的

     
    hhuai · #5 · 2 年前 喜欢 

    #4楼 @xuluan 跟抽象类没关系,ruby中不搞这概念。ruby来的是ducking type。抽象和接口更多的作用是强制约束,目的不是代码复用。

     
    jjym · #6 · 2 年前 喜欢 

    class比module多两个功能,1)继承,2)实例化
    所以用到这两功能的就class
    用不到就module

     
    xuluan · #7 · 2 年前 喜欢 

    @hhuai 我的意思,就是楼上说的,实例化吧
    在cpp里面 抽象类是不能实例化的,就像 ruby里面的module一样
    当然 这两种语言差别很大,只是一个不恰当的比喻而已

     
    6233843 · #8 · 2 年前 喜欢 

    #1楼 @huacnlee 这倒是一个不错的建议。那该如何判断某段代码需要mixin么?简单的观察别的类是否需要mixin么?

     
    6233843 · #9 · 2 年前 喜欢 

    #2楼 @hhuai 你说的我明白,但总是在纠结用class或module,尤其是一段代码既可以用调用module,也可以调用class的类方法,就更加纠结,呵呵

     
    huacnlee · #10 · 2 年前 喜欢 

    #9楼 @6233843 不了解的时候暂时用 Class 好了,等你 Ruby 再熟悉一些的时候你会慢慢发现,你需要用 Module,那个时候再去了解也不迟

     
    ery · #11 · 2 年前 喜欢 

    我认同楼主的观点,但是我想说说自己的看法:
    我认为,先用class去写代码,
    当多个class的代码逻辑相似的时候,
    可以考虑用基类/继承来提取相似的逻辑。

    当继承无法实现提取的时候,
    比如,有时候,两个class代码逻辑相似,
    但是,两个class的基类不同,而ruby又不支持多继承。

    所以,这个时候,
    就可以考虑使用module来实现,相似代码的提取。

     
    6233843 · #12 · 2 年前 喜欢 

    #6楼 @jjym 那怎么确定我需要继承和实例化呢?

     
    6233843 · #13 · 2 年前 喜欢 

    #10楼 @huacnlee 你的意思是当我需要module mixin到别的类时,再抽取module,现在我也是这样做的。但有些情况是模棱两可的,module可以,class也可以,这时候我总是靠自己的感觉来判断是否需要module,但始终觉得这种‘飘渺’的感觉很难说服我自己,所以我希望能找到一个界限。

     
    6233843 · #14 · 2 年前 喜欢 

    #11楼 @ery 同意,从最简单的开始,一步一步重构到最优。

     
    jjym · #15 · 2 年前 喜欢 

    #12楼 @6233843 
    你智商这么高,肯定能确定的,要相信自己

     
    yangman_wenzhu · #16 · 3 月前 喜欢 

    #10楼 @huacnlee 在 Class 中 include module 是不是好方法呢?

  • 相关阅读:
    NOIP2018游记
    NOIP2018T1DAY1——Road(并查集做法??)
    UVA11021 Tribles——概率dp
    捡石头——(期望递推)
    USACO2008mar-gold牛跑步(第k短路:A-star)
    Java中的异常处理
    Java学习手册
    各种应用层注入手段整理 【转载】
    正则表达式学习
    Run-Time Check Failure #0,The value of ESP was not properly saved 错误解决
  • 原文地址:https://www.cnblogs.com/I-Tegulia/p/4554985.html
Copyright © 2020-2023  润新知