日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【讨论】关于什么时候使用module,什么时候使用class

發(fā)布時(shí)間:2024/4/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【讨论】关于什么时候使用module,什么时候使用class 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一段邏輯既可以做一個(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)似,其間還是有很多差別的

hhuai?·?#5?·?2 年前?喜歡?

#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

xuluan?·?#7?·?2 年前?喜歡?

@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),相似代碼的提取。

6233843?·?#12?·?2 年前?喜歡?

#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?
你智商這么高,肯定能確定的,要相信自己

yangman_wenzhu?·?#16?·?3 月前?喜歡?

#10樓?@huacnlee?在 Class 中 include module 是不是好方法呢?

轉(zhuǎn)載于:https://www.cnblogs.com/I-Tegulia/p/4554985.html

總結(jié)

以上是生活随笔為你收集整理的【讨论】关于什么时候使用module,什么时候使用class的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。