İşte özellikler ve karşı argümanlarım için bazı argümanlar:
Alıcı ve ayarlayıcı yöntemleri yazmaktan daha kolay
Getter ve setter yöntemi çiftleri bir kod kokusudur. Bunları yazmayı kolaylaştırmak, Scantron formunu kullanarak ve tüm 'C'leri doldurarak bir matematik testinde başarısız olmayı kolaylaştırmak gibidir. Kalıcılık için yalnızca durum içeren nesneler alıcılar / ayarlayıcılar kullanmamalı ve kalıcılık anında değişmez nesneler oluşturmalıdır.
Bir nesnenin tüketicisi için önemli olan, nasıl yaptığı değil, yaptığı şeydir. Davranışı yaptığı şeydir; onun durumu nasıl yapıyor. Kendinizi bir nesnenin durumu hakkında önemsiyorsanız (kalıcılık hariç, bu aynı zamanda OO'yu da kırıyorsa), sadece OOP yapmazsınız ve avantajlarını kaybedersiniz.
Tüketicilere kabaca bir performans göstergesi veriyorlar
Bu, herhangi bir mülk için gelecekte değişebilecek bir şeydir. 1.0 sürümünde, PropertyX'e erişmenin yalnızca bir alan döndürdüğünü varsayalım. Sürüm 1.5'te, alan null ise, PropertyX yeni bir null nesne oluşturmak için Null Nesne desenini kullanır. Sürüm 2.0, alan PropertyX içindeki getter yöntemi ile daha da doğrulanıyor.
Mülk gittikçe karmaşıklaştıkça, bir mülkü kullanmanın performans göstergesi gittikçe daha az doğru görünüyor.
Kamusal alanlardan daha iyidirler
Bu doğru. Ama yöntemler de öyle.
Bir nesnenin yöntemden çok farklı bir yönünü temsil ederler ve nesnenin tüm tüketicileri bunu önemsemelidir
Yukarıdaki ifadelerin her ikisinin de doğru olduğundan emin misiniz?
Yazmak daha kolay, adamım
Elbette, yazmak yazmaktan myObject.Length
daha kolaydır myObject.Length()
, ancak bu biraz sözdizimsel şekerle düzeltilemez mi?
Neden özellikler yerine yöntemler kullanılmalı?
Performans garantisi yoktur. Yöntem daha karmaşık hale gelse bile API doğru kalacaktır. Tüketici, performans sorunlarıyla karşılaşıyorsa ve API kelimesine güvenmiyorsa kodunu profille oluşturması gerekir.
Tüketicinin düşünmesi için daha az. Bu tesiste bir pasör var mı? Emin bir yöntem değildir.
Tüketici uygun bir OOP zihniyetinden düşünüyor. Bir API'nin tüketicisi olarak, bir nesnenin davranışıyla etkileşime girmekle ilgileniyorum. API'de özellikler gördüğümde, duruma çok benziyor. Aslında, özellikler çok fazla işliyorsa, özellik olmamalı, hatta gerçekte bir API ARE'deki özellikler tüketicilere göründüğü haliyle.
API programcısı dönüş değerlerine sahip yöntemler hakkında daha derin düşünecek ve mümkünse bu yöntemlerde nesnenin durumunu değiştirmekten kaçınacaktır. Komutların sorgulardan ayrılması mümkün olan her yerde uygulanmalıdır.
Size soruyorum, neden yöntemler yerine özellikleri kullanalım? Üzerindeki noktaların çoğu MSDN kod içinde ve kendileri kokuyor, ve ya özellik ve yöntemlerle ait değil.
(Bu düşünceler CQS'yi düşündükten sonra bana geldi.)
type GetFoo() void SetFoo()
On bin kez yazdıysanız, mantıklı geliyor . Tüm zaman C # kod yazma hiç bir özellik tarafından karıştırılmamış.