2010-05-25 15 views
5

Aşağıda, sınıftaki özellikleri kullanma ile ilgili bir soru vardır.Özellik ve Kapsülleme

Genel olarak üye değişkenlerini açığa çıkarmak yerine public özelliklerini kullanıyorum. Çoğunluk bu yaklaşımın kapsüllemeye yardımcı olduğunu tavsiye ediyor. Ancak, bir özellik haline getirerek kapsülleme avantajını anlamıyorum. Birçok kişi, özelliklerin kullanılmasının gerçek nedenini bilen birisidir. Sadece kodlama standardının bir parçası olarak yapıyorlar.

Bir mülkün bir mülkün kamu üye değişkeninden nasıl daha iyi olduğunu ve kapsüllemeyi nasıl geliştirdiğini açık bir şekilde açıklayabilir mi?

cevap

6

Kapsülleme, çağrı sınıflarını değişikliklerden yalıtarak yardımcı olur.

Bir araba motorunu modelleyen basit bir sınıfa sahip olduğunuzu düşünelim (tüm OO örneklerinin araba benzetimi içermesi gerekir :)). Böyle basit bir alan olabilir:

private bool engineRunning; 

Basitçe bu alan halka açık yapmak veya farklı olsun görünmüyor bir IsEngineRunning() getter sağlanması. Eğer gidip onları değiştirmek zorunda eski engineRunning alanını erişen sınıfların çok var Şimdi eğer

private bool ignitionOn; 
private bool starterWasActivated; 

:

Şimdi bu alanı kaldırmak ve bunu değiştirmek istiyor, kendi sınıf daha sofistike hale varsayalım hepsi (kötü zamanlar).

Eğer başladıysanız yerine ise:

public bool IsEngineRunning() 
{ 
    return this.engineRunning; 
} 

sen şimdi için değişebilir:

public bool IsEngineRunning() 
{ 
    return ignitionOn && starterWasActivated; 
} 

ve sınıfının arayüzü aynı (iyi zamanlar) kalır.

+0

. Yalnızca, engineRunning özelliğini aynı şekilde ve eskisi gibi aynı semantiklerle göstermek zorunda kalacağınızı ima eder. Tek fark, ateşleme ve marş özelliklerinin her güncellemesinin engineRunning özelliğini de güncellemesi gerekmesidir. Daha sık okunan/güncelleştirilene bağlı olarak, bu olumlu veya olumsuz performans etkisine sahip olabilir. –

1

Bazı düşünceler:

  • Sen çağıran sınıfları etkilemeden verilerin iç temsil değiştirebilir.

    E.g. kodunuzu (yani kodunuzu 3. taraf olan) başkaları tarafından kullanılması halinde

    public boolean isActive() { 
        return this.is_active && this.approved && this.beforeDeadline; 
    } 
    

    public boolean isActive() { 
        return this.is_active; 
    } 
    

    (sonra) (önce) bu özellikle önemlidir. Belirli bir dereceye kadar arayüzünüz/API'nizin kararlı kalması gerekiyor. Küçük değişiklikler, onu kullanan diğer kodun kodunu etkilememelidir.

  • Daha karmaşık işlemlere sahip olabilirsiniz. is_active değişkenini düşünün. Belki de bu değişkenin değerini değiştirmek, nesnenin diğer özelliklerini de etkiler. Bir yöntemde erişimi kapsülleyseniz, bu yöntemin içine bu şekilde ilgilenebilirsiniz ve arayanın dikkat etmesi gerekmez.

    E.g.Bu nedenle, belirli bir dizi eylemi zorunlu kılar. Bu nedenle, belirli bir dizi eylemi zorunlu kılar. Bu nedenle, belirli bir dizi eylemi uygulamaktadır. 'un numaralı telefonunu kullanmanız, arayanın bu eylemleri düzgün bir şekilde yürütmesi gerçeğine güvenmektesiniz. Nesneniz her zaman doğru durumda olacaktır.

2

Kısaca yapacağım. Özellikler = esneklik

Özellikler, her zaman bir sınıfta tutmak istemediğiniz veya varolan üyelerin toplamaları/işlevleri olan üyeler oluşturmak için kullanışlıdır.

Ör. yaş çıkış doğum tarihi esas alınabilir, canSwim hasLimbs & & oluşturulabilir beklenmedik değişiklikler ile uğraşırken yararlı olabilir özellikleri olarak

maruz üyelerini yüzen [yaptığımız Aranızda hiç müşterinin tüm istekleri tahmin?] bir ile sistemlerde mevcut veritabanı.

Ör. isAllowed, kullanıcı 18 yılı aştığında ve performans için önbelleğe alındığında doğrudur. Istemci ABD'de hizmeti çalıştırmak istiyor ve yanlış yönlendirilirse false döndürür ve yalnızca önbellek doğru olduğunda yaşı döndürebilir

4

Üye değişkenler yerine özellikleri göstermek daha iyidir, çünkü her türden üye değişkenin değerini belirlerken veya aldığınızı kontrol etmek.

u üye değişkeni olduğunu varsayalım:

private int id; 

ve bir ortak özelliği vardır: Bu değişikliğin istemcileri değiştirilmesi gerekir anlamına gelmez işaret etmek istiyorum

public int ID 
{ 
    get 
    { 
     // do something before returning 
    } 
    set 
    { 
     // do some checking here may be limits or other kind of checking 
    } 
}