【讨论】关于什么时候使用module,什么时候使用class
一段邏輯既可以做一個(gè)module,也可以做一個(gè)class
老早之前就在糾結(jié)這個(gè)問(wèn)題,實(shí)在找不出個(gè)界限
最近和同事討論了一下,有了新的認(rèn)識(shí),和大家討論一下
1.module比較關(guān)注的是功能方面,它把方法收集在一起,組成一個(gè)特殊的上下文,通常表示一種能力,比如Enumerable。
2.class就是我們所理解的經(jīng)典的類(lèi),它可以創(chuàng)建實(shí)例對(duì)象,包含實(shí)例變量和類(lèi)變量,一般通過(guò)對(duì)象來(lái)與外界交流。
除了這些,我認(rèn)為class通常都是邏輯完整的,甚至能在現(xiàn)實(shí)世界中找到對(duì)應(yīng)物,而對(duì)module來(lái)說(shuō)卻很難是邏輯完整的,因?yàn)閙odule只能描述一個(gè)特殊的上下文,而這個(gè)上下文通常無(wú)法組成一個(gè)完整的對(duì)象,需要被找一個(gè)宿主,而這個(gè)宿主有可能是class,也有可能是module
?
huacnlee?·?#1?·?2 年前?1 人喜歡?需要用于做命名空間或用于 mixin 的時(shí)候用 module, 其他時(shí)候用 class
hhuai?·?#2?·?2 年前?喜歡?當(dāng)class中或多個(gè)class中有重復(fù)代碼需要抽象出來(lái)時(shí),你會(huì)想要一個(gè)module的東東。
因?yàn)椴荒芏嘀乩^承,只好用module來(lái)補(bǔ)償一下。
另一點(diǎn)我覺(jué)得更容易解耦,繼承哪個(gè)類(lèi),你只能選一個(gè),但具體要include哪幾個(gè)module你可以根據(jù)不同需求選擇不同的module. 有了autoload更加能優(yōu)化性能。
總的一點(diǎn)來(lái)說(shuō),順其自然,你當(dāng)前用什么能達(dá)到目的就用啥,過(guò)幾個(gè)月或幾個(gè)星期,覺(jué)得以前的寫(xiě)法不爽時(shí)你會(huì)自己回來(lái)重構(gòu)的。
firsthym?·?#3?·?2 年前?喜歡?module就像是工具箱,里面的各種工具,就是class
xuluan?·?#4?·?2 年前?喜歡?module 感覺(jué)有點(diǎn)像cpp里面的抽象類(lèi)
當(dāng)然只是類(lèi)似,其間還是有很多差別的
#4樓?@xuluan?跟抽象類(lèi)沒(méi)關(guān)系,ruby中不搞這概念。ruby來(lái)的是ducking type。抽象和接口更多的作用是強(qiáng)制約束,目的不是代碼復(fù)用。
jjym?·?#6?·?2 年前?喜歡?class比module多兩個(gè)功能,1)繼承,2)實(shí)例化
所以用到這兩功能的就class
用不到就module
@hhuai?我的意思,就是樓上說(shuō)的,實(shí)例化吧
在cpp里面 抽象類(lèi)是不能實(shí)例化的,就像 ruby里面的module一樣
當(dāng)然 這兩種語(yǔ)言差別很大,只是一個(gè)不恰當(dāng)?shù)谋扔鞫?/p> 6233843?·?#8?·?2 年前?喜歡?
#1樓?@huacnlee?這倒是一個(gè)不錯(cuò)的建議。那該如何判斷某段代碼需要mixin么?簡(jiǎn)單的觀察別的類(lèi)是否需要mixin么?
6233843?·?#9?·?2 年前?喜歡?#2樓?@hhuai?你說(shuō)的我明白,但總是在糾結(jié)用class或module,尤其是一段代碼既可以用調(diào)用module,也可以調(diào)用class的類(lèi)方法,就更加糾結(jié),呵呵
huacnlee?·?#10?·?2 年前?喜歡?#9樓?@6233843?不了解的時(shí)候暫時(shí)用 Class 好了,等你 Ruby 再熟悉一些的時(shí)候你會(huì)慢慢發(fā)現(xiàn),你需要用 Module,那個(gè)時(shí)候再去了解也不遲
ery?·?#11?·?2 年前?喜歡?我認(rèn)同樓主的觀點(diǎn),但是我想說(shuō)說(shuō)自己的看法:
我認(rèn)為,先用class去寫(xiě)代碼,
當(dāng)多個(gè)class的代碼邏輯相似的時(shí)候,
可以考慮用基類(lèi)/繼承來(lái)提取相似的邏輯。
當(dāng)繼承無(wú)法實(shí)現(xiàn)提取的時(shí)候,
比如,有時(shí)候,兩個(gè)class代碼邏輯相似,
但是,兩個(gè)class的基類(lèi)不同,而ruby又不支持多繼承。
所以,這個(gè)時(shí)候,
就可以考慮使用module來(lái)實(shí)現(xiàn),相似代碼的提取。
#6樓?@jjym?那怎么確定我需要繼承和實(shí)例化呢?
6233843?·?#13?·?2 年前?喜歡?#10樓?@huacnlee?你的意思是當(dāng)我需要module mixin到別的類(lèi)時(shí),再抽取module,現(xiàn)在我也是這樣做的。但有些情況是模棱兩可的,module可以,class也可以,這時(shí)候我總是靠自己的感覺(jué)來(lái)判斷是否需要module,但始終覺(jué)得這種‘飄渺’的感覺(jué)很難說(shuō)服我自己,所以我希望能找到一個(gè)界限。
6233843?·?#14?·?2 年前?喜歡?#11樓?@ery?同意,從最簡(jiǎn)單的開(kāi)始,一步一步重構(gòu)到最優(yōu)。
jjym?·?#15?·?2 年前?喜歡?#12樓?@6233843?
你智商這么高,肯定能確定的,要相信自己
#10樓?@huacnlee?在 Class 中 include module 是不是好方法呢?
轉(zhuǎn)載于:https://www.cnblogs.com/I-Tegulia/p/4554985.html
總結(jié)
以上是生活随笔為你收集整理的【讨论】关于什么时候使用module,什么时候使用class的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Hadoop学习之路一 Single N
- 下一篇: JPA 不在 persistence.x