Nasıl bir nesne yöntemi içinde Nesne özelliklerine erişmek ki?

oy
81

Bir alıcı / ayarlayıcı yöntemi değildir bir nesne yöntemi içinde bir nesnenin özelliklerine erişmek için pürist ya da doğru yolu nedir?

Ben nesnenin dışından bir alıcı / ayarlayıcı kullanması gerektiğini biliyorum ama içinden sadece yapardın:

Java:

String property = this.property;

PHP:

$property = $this->property;

ya yapardın:

Java:

String property = this.getProperty();

PHP:

$property = $this->getProperty();

Benim Java biraz kapalıysa Bağışlayın ben Java programlanmış beri bir yıl geçti ...

DÜZENLE:

İnsanların Ben özel veya korumalı değişkenler / okunur özellikler bahsediyorum varsayıyoruz görünüyor. Ben OO öğrendiğimde ben kamu olsa her özellik için getters / ayarlayıcılar kullanmaya öğretildi (ve aslında herhangi bir değişken / özellik herkese açık hale getirmeyi asla söylendi). Yani, gidip almak bir yanlış varsayım yola başlangıç ​​olabilir. Belki bu kadar tartışılması gereken rağmen, bu soruya cevap insanlar belki ben öğretildi şeye karşı gider, alıcıları ve ayarlayıcıları gerekmez kamu özellikleri ve bu o olması gerektiğini söylediklerini, ben neden bahsettiğini görünür iyi. Gerçi muhtemelen farklı soru için iyi bir konu var ...

Oluştur 01/08/2008 saat 17:10
kaynak kullanıcı
Diğer dillerde...                            


18 cevaplar

oy
58

Bu dini savaş potansiyeline sahiptir, ama bir alıcı / ayarlayıcı kullanıyorsanız, siz de dahili olarak kullanması gerektiğini bana öyle geliyor - ikisini de kullanarak yolda bakım problemlerine yol açacaktır (örn Biri bir setter için kod ekler ihtiyacı özelliği) ayarlanır ve özellik / o ayarlayıcı o çağrılan ağırlık dahili ayarlı olduğu her zaman çalıştırmak için.

Cevap 01/08/2008 saat 17:13
kaynak kullanıcı

oy
41

tutarlı kalması önemlidir gibi Şahsen ben hissediyorum. alıcıları ve ayarlayıcıları varsa, bunları kullanın. erişimci yükü bir sürü sahip olduğunda doğrudan bir alan erişmek istiyorum tek zamandır. gereksiz yere kodunuzu şişkinlik gibiler hissedebilirsiniz, ama kesinlikle gelecekte baş ağrısı bir sürü kaydedebilirsiniz. Klasik örnek:

Daha sonra, söz konusu alan çalışma şeklini değiştirmek isteyebilirler. Belki on-the-fly hesaplanmalıdır ya da belki destek mağaza için farklı bir türünü kullanmak istiyorum. doğrudan özelliklerini erişiyorsanız, böyle bir değişiklik bir şişme foop kod çok şey kırabilir.

Cevap 01/08/2008 saat 19:23
kaynak kullanıcı

oy
25

Ben duyguları Bunun ne kadar oybirliği ile oldukça şaşırdım gettersve ayarlayıcılar ince ve iyi. Ben "Allen Holub tarafından yangın makaleyi öneririz Alıcılar ve ayarlayıcılar Evil ". Verilen başlık şok açısından değerli olduğunu, ama yazar geçerli puan yapar.

Esasen, varsa gettersve settersher özel alan için, toplu kadar iyi bu alanları yapıyoruz. Çok çağrıları her sınıfa dalgalanma etkileri almadan özel alanın türünü değiştirmek için işi çok zor olurdu getter.

Bunun da ötesinde, bir katı OO açıdan, nesneler (umutla) Tek sorumluluk uygun mesajları (yöntem) yanıt olmalıdır. Büyük çoğunluğu gettersve settersonların kurucu nesneler için anlam ifade etmeyen; Pen.dispenseInkOnto(Surface)daha bana daha mantıklı Pen.getColor().

Alıcılar ve ayarlayıcılar da, bazı veriler için nesneyi sormak bir hesaplama yapmak ve sonra daha iyi prosedürel programlama olarak bilinen nesnenin diğer bazı değerini ayarlamak için sınıfın teşvik eder. Sen en iyisi basitçe ilk etapta gittiğini ne yapacağını nesneyi anlatmak için hizmet olacağını; olarak da bilinen bilgiler Uzman deyim.

Benzeri UI, sebat ve - Alıcılar ve ayarlayıcılar, ancak, tabakaların sınırında gerekli kötülüklerdir. Böyle C ++ 'ın arkadaşı anahtar kelime olarak bir sınıfın iç yapısı, erişimin Kısıtlı Java'nın paket korumalı erişim, .NET'in iç erişimi ve Arkadaş Sınıf Desen sen görünürlüğünü azaltmaya yardımcı olabilir gettersbunları ihtiyacı olan sadece olanlarda ve ayarlayıcılar.

Cevap 19/09/2008 saat 01:13
kaynak kullanıcı

oy
18

Bu özellik nasıl kullanıldığına bağlıdır. Örneğin, özelliğine sahip bir isim bir öğrenci nesnesi olduğunu varsayalım. Sen zaten alınmamışsa eğer veritabanından adını çekmek için sizin Get yöntemi kullanabilirsiniz. Bu şekilde veritabanına gereksiz çağrılar azaltıyoruz.

Şimdi senin adını adı olmuştur sayısını sayar nesnede özel tamsayı sayacı var diyelim. Bunu geçersiz sayımı üretmek çünkü nesnenin içinden alın yöntemini kullanmayın isteyebilirsiniz.

Cevap 01/08/2008 saat 17:19
kaynak kullanıcı

oy
13

PHP sihirli yöntemler dahil bu kontrol etmenin yollarını sayısız sunuyor __getve __setama açık Alıcılar ve ayarlayıcılar tercih ederim. Bunun nedeni şudur:

  1. Doğrulama (bu konuda ve alıcılar) belirleyiciler yerleştirilebilir
  2. Intellisense açık yöntemlerle çalışmaktadır
  3. Bir özellik salt okunur olup olmadığını soru yok, sadece yazmak veya okuma-yazma
  4. (Yani hesaplanan değerler) düzenli özellikleri olarak aynı görünüyor sanal özelliklerini alınıyor
  5. Kolayca sonra belgesiz gider aslında her yerde tanımlanan asla bir nesne özelliği ayarlayabilirsiniz
Cevap 24/09/2008 saat 18:24
kaynak kullanıcı

oy
12

Sadece denize buraya gidiyorum?

Belki de;)

Diğer bir yaklaşım, aslında elde (önbelleğe alma / db / vs) yapmak için özel / korumalı yöntemi kullanmak olacaktır ve bunun için bir kamu sarıcı sayısı artar o:

PHP:

public function getName() {
    $this->incrementNameCalled();
    return $this->_getName();
}

protected function _getName() {
    return $this->name;
}

ve daha sonra nesnenin kendisi içinden:

PHP:

$name = $this->_getName();

Bu şekilde hala (önbelleğe alınmış verileri burada belki kullanılan edip etmeme için bir bayrak göndermek gibi) başka bir şey için ilk argüman kullanabilirsiniz.

Cevap 01/08/2008 saat 17:43
kaynak kullanıcı

oy
11

Ben neden o nesnenin bir özelliğe erişmek için bir nesne içindeki bir alıcı kullanmak istiyorsunuz, burada noktayı eksik gerekir?

onun sonuca gaz giderici bu alarak bir alıcı çağırmalıdır hangi bir alıcı çağırmalıdır.

Yani sadece anlamsız, savurgan egzersizdir özellikle (sadece sonra doğrudan neyse özelliğine erişmek iade edecek olan) o nesnenin başka bir yöntemi çağırmak gibi görerek, bir özellik doğrudan bir nesne yöntemi erişimi içine söylemek (veya Soruyu yanlış olurdu ).

Cevap 04/06/2011 saat 16:42
kaynak kullanıcı

oy
7

i bile nesnenin içinde erişimci yöntemleri kullanmak onun daha iyi söyleyebilirim. İşte hemen aklıma gelen noktalar şunlardır:

1) nesnenin dışında yapılan erişimler ile tutarlılık sağlamak yararına yapılmalıdır.

2) Bazı durumlarda, bu erişimci yöntemleri sadece alanını erişen daha yapıyor olabilirdim; onlar (gerçi nadir) bazı ek işlem yapıyor olabilir. Bu, bu işlem o erişimler sırasında yapılması gereken her zaman ise ek işlem ve program ters gidebileceğini eksik olurdu doğrudan alanını erişerek durum ise

Cevap 20/01/2010 saat 09:32
kaynak kullanıcı

oy
7

Pürist OO yolu hem önlemek ve takip etmektir Demeter Kanunu kullanarak Do not Ask söyle yaklaşım.

Bunun yerine nesnenin özelliği, değerini alma sıkıca çiftler iki sınıfı, bir parametre, örneğin nesneyi kullanmak

  doSomethingWithProperty() {
     doSomethingWith( this.property ) ;
  }

Tesiste yerli tip, örneğin int neredeydi, bir erişim yöntemi kullanmak, sorun etki değil programlama etki alanı için isim o.

  doSomethingWithProperty( this.daysPerWeek() ) ;

Bunlar kapsülleme ve herhangi sonrası koşullar veya bağımlı değişmezleri korumak sağlayacaktır. Ayrıca bununla birlikte onlara ayarlayıcılar adlandırma tuzağına düşmeyin, herhangi bir ön koşul veya bağımlı değişmezleri korumak için ayarlayıcı yöntemi kullanabilirsiniz, deyimden kullanırken adlandırmak için geri Hollywood'un İlke gidin.

Cevap 24/09/2008 saat 18:04
kaynak kullanıcı

oy
7

"Purist" tarafından Eğer o zaman ben genellikle özel olarak tüm alanları ilan edip sonra sınıfın kendi içinden this.field kullanabilirsiniz, ancak alt sınıflara dahil tüm diğer sınıflar, erişim örneği devlet Alıcılar kullanarak, "en encapsulation" demek.

Cevap 22/08/2008 saat 12:15
kaynak kullanıcı

oy
6

Değişir. Bu her şeyden daha bir stil meselesi, ne de somut bir kural yoktur.

Cevap 01/10/2008 saat 11:51
kaynak kullanıcı

oy
6

Ben özelliğini düzenleyin etmezse ben kullanacağız get_property()bunun özel bir durum olmadığı sürece bu tür başka bir nesneye bu durumda ben olacak sadece kamu malı içinde MySQLi nesne olarak kamu yöntem ve olarak bakın $obj->object_property.

Nesnenin İçinde benim için her zaman $ this-> mülkü.

Cevap 22/08/2008 saat 12:34
kaynak kullanıcı

oy
6

kamu veya korumalı özelliklere sahip özel alanlar. değerlere Access özellikleri geçmesi gerektiğini ve onlar bir yöntemde birden fazla kez kullanılacaksa yerel değişkene kopyalanması. ve uygulamanız kalanını varsa SADECE yüzden tamamen tweaked, dışarı sarsıldı ve aksi takdirde daha başlamalıdır (Ve bu HİÇ Ben garanti, asla olmayacak) nerede onların ilişkili olan özellikleri geçmekte değerleri erişen bir darboğaz haline gelmiştir için optimize Eğer özellikleri doğrudan destek değişkenleri dokunmak dışında başka bir şey icar düşünün.

Hatta tasarım zamanında destek değişkenleri göremiyorum çünkü .NET geliştiricileri bu zorlamak için otomatik özelliklerini kullanabilirsiniz.

Cevap 18/08/2008 saat 18:43
kaynak kullanıcı

oy
6

i ayarlayıcılar kullanılarak buldum / alıcıları okumak benim kod kolaylaştırdı. Ayrıca diğer sınıflar yöntemleri kullanmak ve i verileri değiştirmek durumunda mülkiyet saklayacak zaman verir kontrole sahip olmak.

Cevap 18/08/2008 saat 18:37
kaynak kullanıcı

oy
6

Ben autodidact çünkü ben yanlış olabilir, ama dışarıda kod getters / belirleyiciler tarafından erişmesi gereken böylece benim Java sınıfları içinde ben asla kullanıcının genel özellikleri, onlar, hep özel veya korumalıdır. Bu bakım / modifikasyon amaçları için daha iyi. Ve içeride sınıf kodu için ... alıcı yöntemi önemsiz ise doğrudan özelliğini kullanın, ancak kolayca İstersem yangın olaylarının kodu ekleyin çünkü hep setter yöntemleri kullanın.

Cevap 06/08/2008 saat 15:43
kaynak kullanıcı

oy
5

Ben tarafından cevabını cmcculloh , ancak en doğru tarafından cevap gibi görünüyor Greg Hurlman . Eğer getgo bunları kullanmaya başladı ve / veya onlarla birlikte çalışmak için kullanılırsa alıcı / ayarlayıcıları her zaman kullanın.

bir kenara, ben şahsen alıcı / ayarlayıcıları kullanarak okuma ve daha sonra hata ayıklamak için kod kolaylaştıracağını.

Cevap 15/09/2008 saat 10:46
kaynak kullanıcı

oy
5

Eh, karar sizin için alınır, C # 3.0 özellikleri varsayılan uygulama ile görünüyor; Eğer (muhtemelen özel) mülkiyet ayarlayıcı kullanarak özelliğini ayarlamak VAR.

Ben şahsen ancak böyle başlatılıyor veya önbelleğe alma / geç yükleme söz konusu olduğunda olarak nesne arzu devlet, daha bir sürede düşmesine neden olur arkada üyesini bunu yaparken değilken özel kullanın.

Cevap 01/08/2008 saat 17:56
kaynak kullanıcı

oy
4

Bazı yorumlar belirtildiği gibi: Bazen, should bazen atlatma. Özel değişkenlerle ilgili büyük bir bölümü size bir şey değiştirdiğinizde kullanıldıkları yerleri görmek mümkün olmasıdır. senin alıcı / ayarlayıcı ihtiyacınız şey yaparsa, onu kullanın. farketmez Eğer karar verin.

tersi durumda yapılabileceğine Eğer alıcı / ayarlayıcı kullanın ve biri onlar alıcı ve ayarlayıcı bir şeyler karıştıran biridir olmadığını görmek için uygulama içinde kullanılan tüm yerleri analiz etmek zorunda alıcı / ayarlayıcı değiştirirse.

Cevap 01/08/2008 saat 18:01
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more