“Mülkiyet” i oluşturan, dile özgü bir soru olduğu ve bir “mülkün” arayıcısının ne beklediği, dile özgü bir soru olduğu için buna dille ilgili yanıt olmadığını düşünüyorum. Bunun hakkında düşünmenin en verimli yolunun, arayanın bakış açısından neye benzediğini düşünmektir.
C # 'da, özellikler (geleneksel olarak) büyük harf kullanımı (benzer yöntemler), ancak parantez (kamu örneği değişkenleri gibi) olmaları bakımından belirgindir. Aşağıdaki kodu görürseniz, dokümantasyon yoksa, ne bekliyorsunuz?
var reciprocalHeading = myHeading.Reciprocal;
Göreceli bir C # acemi, ama Microsoft'un okumuş biri olarak Mülkiyet Kullanım Kuralları , ben beklenebilir Reciprocal
diğer şeylerin yanı sıra için:
Heading
sınıfın mantıksal veri üyesi olmak
- aramaya ucuz olmak, böylece değeri önbelleğe almama gerek kalmayacak
- gözlemlenebilir yan etkilerin olmaması
- art arda iki kez çağrılırsa aynı sonucu verir
- (belki) bir
ReciprocalChanged
etkinlik teklif et
Bu varsayımlardan, (3) ve (4) muhtemelen doğrudur ( Ewan'ın cevabındaHeading
olduğu gibi değişmez bir değer olduğu varsayılmaktadır ), (1) tartışılabilir, (2) bilinmemektedir ancak aynı zamanda tartışmalı ve (5) muhtemel değildir. (her ne olsa semantik anlam vardır bir başlık belki olması gereken olay). Bu, bir C # API, “olsun ya da tersi ile hesaplamak” gerektiğini bana gösteriyor değil bir özellik olarak uygulanacak, ancak hesaplama en ucuz ve özellikle değişmez, bu sınırda bir dava.HeadingChanged
Heading
(Bununla birlikte, bu kaygılardan hiçbirinin mülkün çağrılmasının bile yeni bir örnek yaratıp yaratmadığına dair bir şey olmadığını unutmayın.
Java'da, özellikler bir adlandırma kuralıdır. Görürsem
Heading reciprocalHeading = myHeading.getReciprocal();
Beklentilerim yukarıdakilere benzer (daha az açık bir şekilde belirtilmişse): Çağrının ucuz, cüretkar ve yan etkilerden yoksun olmasını bekliyorum. Bununla birlikte, JavaBeans çerçevesi dışında bir “mülkiyet” kavramı Java'da pek de anlamlı değildir ve özellikle buna karşılık gelmeyen değişmez bir özellik söz konusu olduğunda setReciprocal()
, getXXX()
sözleşme şimdi biraz eski modadır. Gönderen Etkili Java , ikinci baskısında (şimdi zaten fazla sekiz yaşında):
Çalıştıkları boolean
nesnenin işlevsiz veya özniteliğini döndüren yöntemler genellikle isim, isim veya fiil ile başlayan bir fiil cümlesi olarak adlandırılır get
. Sadece üçüncü formun (başlangıçtan itibaren get
) kabul edilebilir olduğunu iddia eden vokal bir koşul vardır, ancak bu iddia için çok az temel vardır. İlk iki form genellikle daha okunabilir kodlara yol açar… (s. 239)
Çağdaş, daha akıcı bir API'de görmeyi beklerdim
Heading reciprocalHeading = myHeading.reciprocal();
- bu da çağrının ucuz olduğunu, önemsiz olduğunu ve yan etkilerin bulunmadığını, ancak yeni bir hesaplamanın yapılıp yapılmayacağına ya da yeni bir nesnenin yaratılıp yaratılmadığına dair hiçbir şey söylemediğini gösterir. Bu iyi; iyi bir API’de umrumda olmamalı.
Ruby'de mülk diye bir şey yoktur. “Nitelikler” var, ama görürsem
reciprocalHeading = my_heading.reciprocal
Örnek bir değişkene basit bir erişimci yöntemi @reciprocal
ile mi erişiyorum attr_reader
, yoksa pahalı bir hesaplama yapan bir yöntem mi aradığımı bilmenin hiçbir yolu yok . Yöntem adının basit bir isim olması gerçeği, söylemekten ziyade calcReciprocal
, çağrının en azından ucuz olduğunu ve muhtemelen yan etkileri olmadığını öne sürüyor.
Scala’da, adlandırma kuralı, yan etkileri olan yöntemlerin parantez alıp almadıklarını belirtir.
val reciprocal = heading.reciprocal
herhangi biri olabilir:
// immutable public value initialized at creation time
val reciprocal: Heading = …
// immutable public value initialized on first use
lazy val reciprocal: Heading = …
// public method, probably recalculating on each invocation
def reciprocal: Heading = …
// as above, with parentheses that, by convention, the caller
// should only omit if they know the method has no side effects
def reciprocal(): Heading = …
(Scala'nın yine de stil rehberi tarafından önerilmeyen çeşitli şeylere izin verdiğine dikkat edin . Bu, Scala'daki en büyük sıkıntılarımdan biri.)
Parantez eksikliği, çağrının yan etkileri olmadığını söylüyor; isim, yine görüşmenin nispeten ucuz olması gerektiğini ileri sürüyor. Bunun ötesinde, bana değeri nasıl elde edeceği umrumda değil .
Kısacası: Kullandığınız dili ve diğer programcıların API'nize ne gibi beklentiler getireceğini bilin. Geriye kalan her şey bir uygulama detayıdır.
Heading
değişmez bir türe sahip olmak vereciprocal
yeni birHeading
şey döndürmek , "başarı çukuru" iyi bir uygulamadır. (iki çağrıdaki ihtiraslareciprocal
"aynı şeyi" geri getirmeli, yani eşitlik testini geçmelidirler.)