【讨论】关于什么时候使用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里面的抽象類
當然只是類似,其間還是有很多差別的
#4樓?@xuluan?跟抽象類沒關系,ruby中不搞這概念。ruby來的是ducking type。抽象和接口更多的作用是強制約束,目的不是代碼復用。
jjym?·?#6?·?2 年前?喜歡?class比module多兩個功能,1)繼承,2)實例化
所以用到這兩功能的就class
用不到就module
@hhuai?我的意思,就是樓上說的,實例化吧
在cpp里面 抽象類是不能實例化的,就像 ruby里面的module一樣
當然 這兩種語言差別很大,只是一個不恰當的比喻而已
#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來實現,相似代碼的提取。
#6樓?@jjym?那怎么確定我需要繼承和實例化呢?
6233843?·?#13?·?2 年前?喜歡?#10樓?@huacnlee?你的意思是當我需要module mixin到別的類時,再抽取module,現在我也是這樣做的。但有些情況是模棱兩可的,module可以,class也可以,這時候我總是靠自己的感覺來判斷是否需要module,但始終覺得這種‘飄渺’的感覺很難說服我自己,所以我希望能找到一個界限。
6233843?·?#14?·?2 年前?喜歡?#11樓?@ery?同意,從最簡單的開始,一步一步重構到最優。
jjym?·?#15?·?2 年前?喜歡?#12樓?@6233843?
你智商這么高,肯定能確定的,要相信自己
#10樓?@huacnlee?在 Class 中 include module 是不是好方法呢?
轉載于:https://www.cnblogs.com/I-Tegulia/p/4554985.html
總結
以上是生活随笔為你收集整理的【讨论】关于什么时候使用module,什么时候使用class的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop学习之路一 Single N
- 下一篇: JPA 不在 persistence.x