Özellikler ve Yöntemler


135

Hızlı soru: Ne zaman (C # 'da) özellikleri kullanmaya karar verirsiniz ve yöntemleri ne zaman kullanmaya karar verirsiniz?

Bu tartışmayı yapmakla meşgulüz ve bir mülk veya yöntem kullanmamızın tartışmalı olduğu bazı alanlar bulduk. Bir örnek şudur:

public void SetLabel(string text)
{
    Label.Text = text;
}

Örnekte, Labelbir ASPX sayfasındaki bir kontrol yer almaktadır. (Bu durumda) bunu bir yöntem veya mülk haline getirme kararını yönetebilecek bir ilke var mı?

En genel ve en kapsamlı yanıtı vereceğim, ancak verdiğim örneğe de değineceğim.


2
-1 Bu soru daha önce sorulmuş ve cevaplanmıştır: stackoverflow.com/questions/164527/…
Element

Yöntem / alan / mülkiyet artıları ve eksileri uzun tartışmalar üretebilir; özellikler için bazı genel kullanım: özel / korumalı alanları istediğinizde ancak aynı zamanda bunları ortaya çıkarmak istediğinizde. Başka bir kullanım sadece ifadeleri değil, aynı zamanda ifadeleri (isterseniz eylemler) bile if()kontrol etmek (MSDN'e göre). Ancak bu, kullanıcı her zaman bir değişkene (mülke) erişmenin arkasındaki işlem maliyetinin farkında olmadığından (yani kod mevcut olmadığından) zordur ve katı nedenlerden ötürü mülkün karşılaştırılması gerekir. Oh, ve bir "bonus" özellikleri ile işaretçiler kullanamazsınız.
mireazma

Yanıtlar:


146

Gönderen Özellikler ve Yöntemler arasında tercih sınıf kitaplıkları Geliştirme Tasarım Rehberinin bölümü:

Genel olarak, yöntemler eylemleri ve özellikler verileri temsil eder. Özelliklerin alanlar gibi kullanılması amaçlanmıştır, yani özelliklerin hesaplama açısından karmaşık olmaması veya yan etkiler üretmemesi gerekir. Aşağıdaki yönergeleri ihlal etmediğinde, daha az deneyimli geliştiriciler özellikleri kullanımı daha kolay bulduğundan, bir yöntem yerine bir özellik kullanmayı düşünün.


3
Bunların çoğuna katılırken, yan etkilerle ilgili kısmın doğru olduğunu düşünmüyorum. Örneğin, "Renk" genellikle bir nesnenin özelliğidir ve belirgin yan etkilere sahiptir (bir nesnenin rengini değiştirme). Özellikleri değiştirmek, nesne durumunu değiştirmenin bariz yan etkisine sahiptir.
Erik Funkenbusch

46
Mystere Man değişen Renk yan etkisi değil, istenen etkidir. Yan etki, birincil eylemde amaçlanmayan bir şeydir.
Muhammed Hasan Han

2
@Mystere Man: rengi değiştirmek kesinlikle bir yan etki değil, bu cevaba tamamen katılıyorum
Ahmed Said

2
"Çünkü daha az deneyimli geliştiriciler özellikleri daha kolay buluyor." - Gördüğüm gibi özellikleri ortaya çıkarmanın tek nedeni bu. Ama haklı mıyım?
Tsabo

2
Bir mülkün bir yönteme karşı bir yöntemin iç uygulamasındaki fark nedir? Bir özellik kullanıldığında çağrı yığınına herhangi bir şey itiliyor mu? Değilse, başka nasıl ele alınır?
Praveen

58

Evet, yaptığınız tek şey alıp ayarlamaksa bir özellik kullanın.

Birkaç veri üyesini etkileyebilecek karmaşık bir şey yapıyorsanız, yöntem daha uygundur. Veya alıcınız parametre alıyorsa veya ayarlayıcınız bir değer parametresinden daha fazlasını alıyorsa.

Ortada, çizginin biraz bulanık olabileceği gri bir alan var. Zor ve hızlı bir kural yoktur ve farklı insanlar bazen bir şeyin mülk mü yoksa yöntem mi olduğuna karar vermezler. Önemli olan sadece bunu nasıl yaptığınız (ya da ekibinizin nasıl yaptığı) ile (göreceli olarak) tutarlı olmaktır .

Büyük ölçüde değiştirilebilirler, ancak bir özellik kullanıcıya uygulamanın nispeten "basit" olduğunu bildirir. Oh ve sözdizimi biraz daha temiz.

Genel olarak, benim felsefem, get veya set ile başlayan ve sıfır veya bir parametre (sırasıyla) alan bir yöntem adı yazmaya başlarsanız, o zaman bir özellik için birincil adaydır.


1
Aşağı oy kullandı. Bu doğru değil. Alıcı veya ayarlayıcının karmaşıklığı alıcı / ayarlayıcı kodunda kapsüllenir. Ne kadar karmaşık olduğu, ne kadar karmaşık olduğu ya da "birkaç veri üyesini etkilediği" ise, standart olmayan ya da çoklu parametrelerin bir yöntem gerektireceği doğrudur, aksi takdirde bu cevap doğru değildir.
Hal50000

İlk cümle her şeyi açıklıyor. Bravo.
SWIIWII

13

Özellikler, bir nesneye veri enjekte etmenin veya bir nesneden veri almanın bir yoludur. Sınıf içindeki değişkenler veya veriler üzerinde bir soyutlama yaratırlar. Java'daki alıcılara ve ayarlayıcılara benzerler.

Yöntemler bir operasyonu kapsüllemektedir.

Genel olarak, tek veri parçalarını veya sınıfta satış vergisi gibi küçük hesaplamaları göstermek için özellikleri kullanırım. Hangi bir alışveriş sepeti ürün sayısı ve maliyetlerinden elde edilir.

Veritabanından veri almak gibi bir işlem oluştururken yöntemleri kullanıyorum. Hareketli parçaları olan herhangi bir işlem, bir yönteme adaydır.

Kod örneğinizde, sınıf içerdiği dışında erişmeniz gerekiyorsa bir özellikte sararım:

public Label Title 
{
   get{ return titleLabel;}
   set{ titleLabel = value;}
}

Metni ayarlama:

Title.Text = "Properties vs Methods";

Yalnızca etiketin Text özelliğini ayarlıyorsanız, bunu nasıl yaparım:

public string Title 
{
   get{ return titleLabel.Text;}
   set{ titleLabel.Text = value;}
}

Metni ayarlama:

Title = "Properties vs Methods";

12

Nesnenizin gerçek bir özelliğini ayarlıyorsanız, bir özellik kullanırsınız.

Bir görev / işlev gerçekleştiriyorsanız, bir yöntem kullanırsınız.

Örneğin, ayarlanan belirli bir özelliktir.

Ancak, işlevselliğiniz AppendToLabel içinse, bir yöntem kullanırsınız.


11

MSDN'de arama yaparken , yöntemler oluşturmak için bazı harika yönergeler sağlayan Özellikler ve Yöntemler hakkında bir başvuru buldum :

  • İşlem gibi bir dönüşümdür Object.ToString.
  • İşlem, sonucu önbelleğe almayı düşünmeleri gerektiğini kullanıcıya bildirmek istediğiniz kadar pahalıdır.
  • Get erişimcisini kullanarak bir özellik değeri elde etmenin gözlemlenebilir bir yan etkisi olacaktır.
  • Üyeyi art arda iki kez çağırmak farklı sonuçlar doğurur.
  • Yürütme sırası önemlidir. Bir türün özelliklerinin herhangi bir sırada ayarlanabilmesi ve alınabilmesi gerektiğini unutmayın.
  • Üye statiktir ancak değiştirilebilecek bir değer döndürür.
  • Üye bir dizi döndürür. Dizileri döndüren özellikler çok yanıltıcı olabilir. Genellikle dahili dizinin bir kopyasını döndürmek gerekir, böylece kullanıcı dahili durumu değiştiremez. Bu, kullanıcının kolayca dizine alınmış bir özellik olduğunu varsayabilir ve verimsiz bir koda yol açar.

Bunun mümkün olan her yerde mantıklı olduğunu kabul ediyorum. Ama doğru muyum, WPF'de XAML bağlaması yoluyla özelliklerin kullanılmasının ayarlayıcıda uygun eylemleri yapmaktan başka seçeneği kalmaması mı? (özellikle ComboBox'lar, ListBox'lar vb. için yeni bir SelectedItem üzerine)
Nicolas

9

Sadece ismine bakmalısın ... "Mülkiyet". Bu ne demek? Sözlük bunu birçok yönden tanımlar, ancak bu durumda "bir şeyin temel veya ayırt edici bir niteliği veya kalitesi" en uygunudur.

Eylemin amacını düşünün. Aslında, "önemli veya farklı bir özellik" i değiştiriyor musunuz veya geri alıyor musunuz? Örneğin, metin kutusunun bir özelliğini ayarlamak için bir işlev kullanıyorsunuz. Bu biraz aptalca görünüyor, değil mi?

Özellikler gerçekten işlevlerdir. Hepsi getXXX () ve setXXX () için derlenir. Onları sözdizimsel şekerde gizler, ancak sürece anlamsal bir anlam sağlayan şekerdir.

Nitelikler gibi özellikleri düşünün. Bir arabanın birçok özelliği vardır. Renk, MPG, Model vb. Tüm özellikler seçilemez, bazıları hesaplanabilir.

Bu arada, bir Yöntem bir eylemdir. GetColor bir özellik olmalıdır. GetFile () bir işlev olmalıdır. Diğer bir başparmak kuralı, nesnenin durumunu değiştirmezse, o zaman bir işlev olmalıdır. Örneğin, CalculatePiToNthDigit (n) bir işlev olmalıdır, çünkü aslında bağlı olduğu Math nesnesinin durumunu değiştirmez.

Bu belki biraz saçma, ama gerçekten nesnelerinizin ne olduğuna ve neyi temsil ettiklerine karar vermek için kaynar. Bir özellik veya işlev olup olmadığını anlayamıyorsanız, belki hangisinin önemli olduğu önemli değildir.


9

Symantically özellikleri, nesnelerinizin özellikleridir. Yöntemler, nesnenizin davranışlarıdır.

Etiket bir özelliktir ve onu bir özellik haline getirmek daha mantıklıdır.

Nesneye Dayalı Programlama açısından, davranışın neyin parçası ve neyin sadece nitelik olduğu konusunda net bir anlayışa sahip olmalısınız.

Araba {Renk, Model, Marka}

Bir otomobilin Renk, Model ve Marka nitelikleri vardır, bu nedenle SetColor veya SetModel yöntemine sahip olmak mantıklı değildir, çünkü Symantically, Car'dan kendi rengini ayarlamasını istemiyoruz.

Dolayısıyla, mülk / yöntem vakasını gerçek hayat nesnesiyle eşlerseniz veya şematik bakış açısından bakarsanız, karışıklığınız gerçekten ortadan kalkacaktır.


4

Ayrıca Özellikler için büyük bir artı özelliği değeri hata ayıklama sırasında Visual Studio'da görülebilir olmasıdır.


3

1 parametre ile ekleme / ayarlama yöntemleri için özellikleri kullanmayı tercih ederim . Parametreler daha fazlaysa yöntemleri kullanın.


3

Özellikler sadece basit ayarlanmalı ve bir astar alınmalıdır. Daha fazla bir şey ve gerçekten bir yönteme taşınmalıdır. Karmaşık kod her zaman yöntemlerde olmalıdır.


3

Özellikleri yalnızca değişken erişim için, yani bağımsız değişkenleri almak ve ayarlamak veya kontrollerde veri almak ve ayarlamak için kullanırım. Herhangi bir veri manipülasyonuna ihtiyaç duyulduğunda / yapılır yapılmaz yöntemleri kullanırım.


3

Tasarım gereği Özellikler sınıf nesnesinin Veri veya Niteliklerini temsil ederken, yöntemler sınıf nesnesinin eylemleri veya davranışlarıdır.

Net'te, dünyada Özellikleri kullanmanın başka etkileri de vardır:

  • Özellikler Veritabanında kullanılırken get_ / set_ yöntemleri kullanılmaz.
  • Doğal serilizasyon mekanizması olarak XML serileştirme kullanıcı özellikleri.
  • Özelliklere, özel bir kitaplık yazıyorsanız etkili bir şekilde kullanılabilen PropertyGrid denetimi ve stajyer ICustomTypeDescriptor ile erişilir .
  • Özellikler Öznitelikler tarafından kontrol edilir , Aspect Oriented yazılımları tasarlamak için akıllıca kullanılabilir.

Mülklerin kullanımı ile ilgili yanılgılar (IMHO):

  • Küçük hesaplamaları göstermek için kullanılır: ControlDesigner.SelectionRules blok satırları 72 satıra alınır !!
  • Dahili Veri yapılarını göstermek için kullanılır: Bir özellik bir dahili veri üyesiyle eşleşmese bile, sınıfınızın bir özniteliği ise özellik olarak kullanılabilir. Viceversa, sınıf özelliklerinizin bir özniteliği tavsiye edilmese bile, veri üyeleri gibi dizi döndürmek için (üyelerin derin kopyasını döndürmek için yöntemler kullanılır.)

Buradaki örnekte daha fazla iş anlamı ile yazılmış olabilir:

public String Title
{
    set { Label.Text = text; }
}

2

Özellikler gerçekten güzel çünkü görsel stüdyoların görsel tasarımcısında erişilebilir olmaları şartıyla erişilebilirler.

Sadece ayar ve alma ve belki de önemli miktarda koda erişmeyen bazı doğrulama kullanıldıklarında kullanılırlar. Dikkatli olun çünkü doğrulama sırasında karmaşık nesneler oluşturmak basit değildir.

Başka herhangi bir yöntem tercih edilen yöntemdir.

Bu sadece anlambilimle ilgili değil. Görsel stüdyo görsel tasarımcısında gariplik ortaya çıkmaya uygun olmayan özellikleri kullanmak.

Örneğin, bir sınıfın özelliği içinde bir yapılandırma değeri alıyordum. Yapılandırma sınıfı aslında bir dosya açar ve bu yapılandırmanın değerini almak için bir sql sorgusu çalıştırır. Bu benim uygulamada yapılandırma dosyası sadece benim uygulama değil, (setter yöntemi ile) yapılandırma değeri okumak değil, çünkü benim uygulama yerine visual studio kendisi tarafından açılacak ve kilitlenir sorunlara neden oldu. Bunu düzeltmek için sadece bir yönteme değiştirmek zorunda kaldım.


1

İşte iyi bir dizi Bill Wagner'in özelliklerini vs yöntemlerini ne zaman kullanacağınız için kılavuz

  • Tüm bunlar doğru olduğunda bir Özellik kullanın: Alıcılar basit olmalı ve bu nedenle istisnalar atma olasılığı düşük olmalıdır. Bunun ağa (veya veritabanına) erişim anlamına gelmediğini unutmayın. Her ikisi de başarısız olabilir ve bu nedenle bir istisna atar.
  • Birbirlerine bağımlılıkları olmamalıdır. Bunun bir özelliği ayarlamayı ve başka bir özelliği etkilemeyi içereceğini unutmayın. (Örneğin, FirstName özelliğinin ayarlanması, ad ve soyadı özelliklerini oluşturan salt okunur bir FullName özelliğini etkiler, bu tür bir bağımlılığı ima eder)
  • Herhangi bir sırayla ayarlanabilir olmalıdırlar.
  • Alıcının gözlemlenebilir bir yan etkisi yoktur Not Bu kılavuzun, bir mülkteki bazı tembel değerlendirme biçimlerini engellemediğini unutmayın.
  • Yöntem daima derhal geri dönmelidir. (Bunun, veritabanı erişim çağrısı, web hizmeti çağrısı veya benzer bir işlem yapan bir özelliği engellediğini unutmayın).
  • Üye bir dizi döndürürse bir yöntem kullanın.
  • Alıcıya tekrarlanan çağrılar (müdahale eden kod olmadan) aynı değeri döndürmelidir.
  • Ayarlayıcıya tekrarlanan çağrılar (aynı değerde) tek bir çağrıdan fark vermemelidir.

  • Get, dahili veri yapılarına bir referans döndürmemelidir (Bkz. Madde 23). Bir yöntem derin bir kopyasını döndürebilir ve bu sorunu önleyebilir.

* Yinelenen bir soruya cevabımdan alınmıştır.


Burada en çok oylanan ve kabul edilen cevaplar stackoverflow.com/a/1294189/1551 Neden inişli çıkışlı?
Chris Ballance

2
Partiye biraz geç kaldığımı anlıyorum, ancak cevabınızı kopyaladığınız için büyük olasılıkla bu aşağılık ortaya çıktı. Kopya yapıştırarak, bu sorunun temelde diğerinin kopyası olduğunu kabul ettiniz. Bu nedenle, yanıtlamak yerine kopya olarak işaretlemelisiniz. Yinelenen soruların nasıl ele alınması gerektiğine ilişkin Meta'daki bir makaleye bakmanızı öneririm .
Joshua

0

Bu basit.

1: alana kaydetmeden önce verilerinizin doğrulanmasını istediğinizde özelliği kullanın. Böylece bu şekilde mülkiyet alanlarınız için kapsülleme sağlar. Eğer alanlarınızı herkese açık bırakırsanız son kullanıcı yaş olarak 18'den büyük olmalıdır. Bu şekilde özellikler verileri temsil eder.

2: Parametre olarak bazı veriler sağladığınız gibi bazı eylemler gerçekleştirmek istediğinizde yöntemi kullanın ve yönteminiz sağlanan değerlere göre bazı işlemler yapıyor ve işlenen değeri çıktı olarak döndürüyor. Veya bu hesaplama ile bir alanın değerini değiştirmek istersiniz. "Bu şekilde yöntem eylemi temsil eder".


-1

Bir süre java an i get .. set .. yöntemi kullanılır.

Kod yazarken, kendime sormuyorum: "bu verilere erişmek basit mi yoksa ağır bir işlem mi gerektiriyor?" işler değişebileceğinden (bugün bu mülkü geri almak basittir, tomonrow bazı veya ağır bir süreç gerektirebilir).

Bugün ben bir yöntem SetAge (int yaş) tomonrow i ayrıca doğum tarihi kullanarak yaşını hesaplamak yöntemi SetAge (tarih doğum tarihi) olacaktır.

Derleyici get ve set özelliği dönüştürmek ama aynı Get ... ve Set .. yöntemleri dikkate almayın çok hayal kırıklığına uğradım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.