簡體   English   中英

為什么分別堅持get-set而不是car.speed()和car.speed(55)?

[英]Why stick to get-set and not car.speed() and car.speed(55) respectively?

除了明確的清晰度,我們為什么要堅持:
car.getSpeed()car.setSpeed(55)
什么時候也可以使用: car.speed()car.speed(55)

我知道get()和set()對於通過將所有內容保存在一個地方來保持對數據成員的任何更改都是有用的。

另外,顯然,我知道car.speed()car.speed(55)相同的函數,這使得這個錯誤,但是在PHP和Zend Framework中,同樣的操作用於GET,POST,postbacks 。
在VB和C#中有“屬性”,並且被許多人使用,很多是我聽過的純粹主義者的厭惡,而且Ruby中有些東西像5 5.times.each.to_i等。
而且你在C ++中有運算符重載,多重繼承,虛函數,其中某些組合可以驅使任何人瘋狂。

我的意思是說,有太多的范例和方法可以完成任務,似乎沒有人嘗試過我提到的特定組合。

至於我,我的理由是閱讀代碼簡短而清晰
我錯了,稍微錯了,這只是奇怪的,所以不使用,或者還有什么?

如果我仍然決定保持正確,我可以使用car.speed()car.setSpeed(55)
這有什么不對(只是省略“獲取”)?

謝謝你的任何解釋。

如果我打電話給car.speed(),我可能會認為我告訴汽車加速,換句話說就是提高速度並打破速度限制。 這顯然不是一個吸氣劑。

某些語言允許您聲明const對象,然后將您限制為僅調用不修改對象數據的函數。 因此,必須具有用於修改和讀取操作的單獨功能。 雖然你可以在參數上使用重載來實現兩個功能,但我認為這會令人困惑。

此外,當你說它更清楚時,我可以爭辯說我必須先去了解如何閱讀它:

car.speed()

我讀了“汽車速度......”,然后我看到沒有號碼,所以我修改並想“獲得車速”。

car.getSpeed()

我讀過“這輛車,速度快”

car.setSpeed(55)

我讀過“這輛車,速度設定為55”

你似乎已經基本上引用了該語言的其他功能令人困惑,然后用它作為防止讓getter / setter更加混亂? 這幾乎聽起來像是承認你提出的建議更令人困惑。 這些功能有時令人困惑,因為它們具有一般的用途。 有時抽象可能更令人困惑,但最終它們通常用於更可重用的目的。 我想如果你想爭論速度()和速度(55),你需要展示如何為程序員提供新的可能性。

另一方面,C#確實具有您所描述的內容,因為屬性的行為與getter或setter不同,具體取決於它們的使用環境:

Console.WriteLine(car.Speed); //getter

car.Speed = 55 //setter

但是雖然它是單個屬性,但是有兩個單獨的代碼段用於實現獲取和設置,很明顯這是一個getter / setter而不是函數速度,因為它們省略了屬性的()。 所以car.speed()顯然是一個函數,car.speed顯然是一個屬性getter。

恕我直言,具有作為get和set方法的合成糖屬性的C#樣式是最具表現力的。

我更喜歡封裝操作而不是getter和setter的活動對象,因此你可以獲得語義更豐富的對象。

例如,雖然ADT而不是業務對象,但即使是C ++中的vector也具有成對函數:

size_type capacity() const // how many elements space is reserved for in the vector  
void reserve(size_type n)  // ensure space is reserved for at least n elements 

void push_back ( const T& ) // inserts an element at the end
size_type size () const     // the number of elements in the vector

如果你駕駛汽車,你可以設置加速器,離合器,制動器和檔位選擇,但你沒有設置速度。 您可以讀取速度表的速度。 在行為對象上同時想要一個setter和getter是相對罕見的。

僅供參考,Objective-C使用car.speed()car.setSpeed(55) (除了不同的語法, [car speed][car setSpeed:55]

這都是關於慣例的。

沒有正確答案,這是一種風格問題,最終無關緊要。 在別處花費你的大腦周期。

FWIW我更喜歡的setter的吸氣劑class.noun(),class.verb()。 有時動詞只是setNoun(),但有時則不是。 這取決於名詞。 例如:

my_vector.size() 

返回大小,和

my_vector.resize(some_size) 

改變大小。

對於屬性的groovy方法非常出色恕我直言, http://groovy.codehaus.org/Groovy+Beans

您的代碼的最終基准應該是這樣的:

  1. 它運作正常嗎?
  2. 如果它破裂,它是否容易修復?
  3. 將來添加新功能是否容易?
  4. 其他人是否容易進入並修復/增強它?

如果這4點被覆蓋,我無法想象為什么有人會遇到這個問題。 大多數“最佳實踐”通常都是為了達到這4點。

使用適合你的風格,只要保持一致,你應該沒事。

這只是一個慣例問題。 在Smalltalk中,它按照你建議的方式完成,我不記得曾經聽過有人抱怨它。 獲得汽車的速度是car speed ,並將汽車的速度設置為55是car speed:55

如果我冒險猜測,我會說這種風格沒有流行的原因是因為面向對象編程的兩條線路已經出現在我們面前:C ++和Objective-C。 在C ++中(在其歷史中更早),方法與C函數密切相關,而C函數通常按照setWhatever()方式命名,並且不會對不同數量的參數進行重載,因此一般樣式命名保持不變。 Objective-C在很大程度上由NeXT(后來成為Apple)保留,而NeXT傾向於支持其API中的冗長,特別是區分不同類型的方法 - 如果你做的只是訪問一個屬性,NeXT想要一個動詞說清楚。 因此,這成為Cocoa的慣例,這是目前Objective-C的事實上的標准庫。

它的慣例Java有getter和setter的約定C#有屬性,python有公共字段,JavaScript框架傾向於使用field()來獲取和字段(值)來設置

除了明確的清晰度之外,為什么我們應該堅持:car.getSpeed()和car.setSpeed(55),當它也可以使用時:car.speed()和car.speed(55)

因為在我遇到的所有語言中, car.speed()car.speed(55)在語法方面都是相同的。 只要這樣看待它們,兩者都可以返回一個值,如果它本身就是一個制定者,那么后者就不會這樣。

如果你想打電話給二傳手而忘記參加辯論怎么辦? 代碼是有效的,因此編譯器不會抱怨,並且它不會立即引發運行時錯誤; 這是一個無聲的錯誤。

。()表示它是動詞。 no()表示它是名詞。

   car.Speed = 50;
   x = car.Speed
   car.Speed.set(30)
   car.setProperty("Speed",30)

   car.Speed()

意味着命令超過速度限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM