一段逻辑既可以做一个 module,也可以做一个 class 老早之前就在纠结这个问题,实在找不出个界限
最近和同事讨论了一下,有了新的认识,和大家讨论一下 1.module 比较关注的是功能方面,它把方法收集在一起,组成一个特殊的上下文,通常表示一种能力,比如 Enumerable。 2.class 就是我们所理解的经典的类,它可以创建实例对象,包含实例变量和类变量,一般通过对象来与外界交流。
除了这些,我认为 class 通常都是逻辑完整的,甚至能在现实世界中找到对应物,而对 module 来说却很难是逻辑完整的,因为 module 只能描述一个特殊的上下文,而这个上下文通常无法组成一个完整的对象,需要被找一个宿主,而这个宿主有可能是 class,也有可能是 module
不知道大家有什么看法?欢迎讨论
当 class 中或多个 class 中有重复代码需要抽象出来时,你会想要一个 module 的东东。 因为不能多重继承,只好用 module 来补偿一下。
另一点我觉得更容易解耦,继承哪个类,你只能选一个,但具体要 include 哪几个 module 你可以根据不同需求选择不同的 module. 有了 autoload 更加能优化性能。
总的一点来说,顺其自然,你当前用什么能达到目的就用啥,过几个月或几个星期,觉得以前的写法不爽时你会自己回来重构的。
@hhuai 我的意思,就是楼上说的,实例化吧 在 cpp 里面 抽象类是不能实例化的,就像 ruby 里面的 module 一样 当然 这两种语言差别很大,只是一个不恰当的比喻而已
我认同楼主的观点,但是我想说说自己的看法: 我认为,先用 class 去写代码, 当多个 class 的代码逻辑相似的时候, 可以考虑用基类/继承来提取相似的逻辑。
当继承无法实现提取的时候, 比如,有时候,两个 class 代码逻辑相似, 但是,两个 class 的基类不同,而 ruby 又不支持多继承。
所以,这个时候, 就可以考虑使用 module 来实现,相似代码的提取。