zoukankan      html  css  js  c++  java
  • 【讨论】关于什么时候使用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 是不是好方法呢?

  • 相关阅读:
    JavaScript cookie详解
    Javascript数组的排序:sort()方法和reverse()方法
    javascript中write( ) 和 writeln( )的区别
    div做表格
    JS 盒模型 scrollLeft, scrollWidth, clientWidth, offsetWidth 详解
    Job for phpfpm.service failed because the control process exited with error code. See "systemctl status phpfpm.service" and "journalctl xe" for details.
    orm查询存在价格为空问题
    利用救援模式破解系统密码
    SSH服务拒绝了密码
    C# 调用 C++ DLL 中的委托,引发“对XXX::Invoke类型的已垃圾回收委托进行了回调”错误的解决办法
  • 原文地址:https://www.cnblogs.com/I-Tegulia/p/4554985.html
Copyright © 2011-2022 走看看