【讨论】关于什么时候使用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 是不是好方法呢?

时间: 2024-10-04 02:26:16

【讨论】关于什么时候使用module,什么时候使用class的相关文章

Chromium插件(Plugin)模块(Module)加载过程分析

在Chromium中,每一个Plugin都对应一个Module,称为Plugin Module.一个Plugin Module可创建多个Plugin Instance.每一个Plugin Instance对应于网页中的一个<embed>标签.在为<embed>标签创建Plugin Instance之前,先要加载其对应的Plugin Module.本文接下来分析Plugin Module的加载过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注

Angularjs Module类的介绍及模块化依赖

后面的学习我们会遵循一个控制器管理一个视图,一个路由对应一个视图的单一原则,所以再不会将controller控制器代码直接写到 index.html 中. 我们会应用到angular.js中强大的模块来开发,比如路由,服务,过滤器,指令等模块. 所以这一篇博客很有必要把各个模块之间的依赖关系,定义,使用等问题陈述一下. 那么angular.js 到底是如何加载启动起来的呢. <!DOCTYPE html> <html ng-app="YIJIEBUYI"> &l

eclipse中Cannot change version of project facet Dynamic Web Module to 3.0的问题解决

在做web配置的时候,希望将web Module(Web模块)更换为3.0,发生如下错误: cannot change version of project facet Dynamic Web Module to 3.0. 解决方案是: 1 找到当前项目所在的文件夹 2 找到setting文件夹下的org.eclipse.wst.common.project.facet.core.xml 打开后将标红的地方改为3.0 然后在项目上右键->刷新 然后在菜单上选择project->clean 再次

阿里的开源思想:与世界讨论中国的互联网技术与场景

自从2015年11月阿里巴巴集团宣布正式加入Apache基金会以来,阿里技术已经向Apache捐赠了三个开源项目,分别是JStorm.RocketMQ和Weex.其中Weex于2016年12月15日正式捐赠给Apache基金会.而RocektMQ有望成为首个来自中国的Apache互联网中间件顶级子项目,Weex则有望成为来自中国的移动开发顶级子项目. 截止到2016年9月,阿里已经开源115个项目,加入了FSF基金会.Apache基金会.Linux 基金会和Xen顾问团队.阿里云还是MySQL开

关于angular js中ng-view的一些问题讨论

声明:该篇是一个讨论问题的,不是解决问题的,希望对这方面比较了解的朋友能看一下,或许你们能帮到我 ng-view is a directive that complements the $route service by including the rendered template of the current route into the main layout (index.html) file. Every time the current route changes, the incl

js-ES6学习笔记-module(4)

1.<script>标签打开defer或async属性,脚本就会异步加载.渲染引擎遇到这一行命令,就会开始下载外部脚本,但不会等它下载和执行,而是直接执行后面的命令. defer与async的区别是:前者要等到整个页面正常渲染结束,才会执行:后者一旦下载完,渲染引擎就会中断渲染,执行这个脚本以后,再继续渲染.一句话,defer是"渲染完再执行",async是"下载完就执行".另外,如果有多个defer脚本,会按照它们在页面出现的顺序加载,而多个async

Arch Linux sudo: PAM authentication error: Module is unknown [Solved!]

问题描述: 我的 Arch Linux 已经用了快半年多,由于 Arch Linux 的滚挂问题,我从没有直接升级过系统.软件版本以及库自然落后了一些. 就在我准备需要用到 NFS 时,挂载网络文件系统时由于 librpc 太旧而失败了.所以看来我得更新 librpc 了.用 yaourt -Ss 查看了一下源上的版本. 最新的 NFS 需要 libtirpc.so.3 而我的却是 libtirpc.so.1 .最后安装了 libtirpc-1.0.1-2 后.悲剧发生了.任何用到 sudo ,

AngularJS Module类的方法

AngularJS Module类的方法 AngularJS中的Module类负责定义应用如何启动,它还可以通过声明的方式定义应用中的各个片段.我们来看看它是如何实现这些功能的. 一.Main方法在哪里 如果你是从Java或者Python编程语言转过来的,那么你可能很想知道AngularJS里面的main方法在哪里?这个把所有东西启动起来,并且第一个被执行的方法在哪里?JavaScript代码里面负责实例化并且把所有东西组合到一起,然后命令应用开始运行的那个方法在哪里? 事实上,AngularJ

Prism 学习:从本地目录加载 Module

在 Prism 中,将外部模块加载到主程序有以下几种方式:Code.XAML.配置文件.指定模块目录:其中,如果要使用 Code 方式来加载 Module,则需要将该 Module 引用到当前项目中:而后面两种通过 XAML与配置文件,在原理上大体一致:本文主要讨论第四种方法,即通过指定 Module 所在的目录来加载 Module. 首先,我们需要在 Bootstrapper 类中重载 CreateModuleCatelog 方法,在该方法中定义一个 DirectoryModuleCatalo