Bir sınıfta ortak özellikleri adil bir miktarda olması mantıklı mı?

5 Cevap php

Ya da daha spesifik bir deyişle, bu belirleyiciler ve alıcılar üzerinde güvenerek değil "Tamam"?

Ben odalarının kullanılabilirliğini denetler ve daha bir düzine var olan ortak özelliklerini ayarlar bir sınıf ile uğraşıyorum. : Gibi şeyler

  • unitNumber
  • RoomTypes (dizi)
  • codeCorporate
  • Codegroup
  • numberKids
  • numberAdults
  • numberRooms
  • para
  • minRate
  • maxRate
  • SoapServer
  • birimleri (dizi)
  • hotelId

Bir nesne örneği sonra ve bu özellikler $this-> çeşitli yöntemlerle iç ile ayarlanır. Nesne ile ilgilenen kod yerine genellikle alıcı / ayarlayıcı yöntemleri kullanarak, doğrudan kamu özelliklerini ayarlar Ancak:

$object->something = 3;

foreach ($object->things as $thing ) { }

Ben bu sınıf refactor zamanınız varsa ..

  • Ben bir özel mülkiyet olan bir veri dizisinde tüm bu özellikleri, sopa ve __set ve __get yöntemlerini tanımlamak gerekir?
  • Ben özelliklerin her biri için bir tek alıcı bir yöntem yapmak gerekir?

5 Cevap

Benim görüşüme göre, nadiren herhangi bir ortak üye olması iyi bir fikirdir. Bu sınıflar arasındaki bağlantıyı artırır ve çok karmaşık üstlenmeden yapar (ihtiyacınız olmalıdır.)

Belirleyiciler / Alıcılar gitmek için yol ve genellikle ya uzak optimize edilmiş veya zerafet tarafından uydurma sen ödemek için çok küçük bir performans cezası vardır.

Tek alıcı başına var vs dizi hakkında sorunuzu yanıtlamak için, bu zevk meselesi. Sadece bir dizi içinde benzer Çeşidi değişkenler tutmak ve geri kalan ayrı eğilimindedir.

:-) Öneri için im açık ama ben şahsen, bir kamu malına için gerçekten iyi bir neden bulmak zorunda

I kadar (ki bir genelleştirilmiş get($name) ya da değil bir vekil olsun) her özellik için belirtilen alıcılar / ayarlayıcıları tercih rağmen. Ben bu durumda ben sihirli __get/__set yöntemleri kullanılarak devam etmek söyleyebilirim böylece doğrudan atama kullanır zaten diğer kodu var varsayalım.

Ben çoğu insan belirleyiciler kullanarak tavsiye düşünüyorum & alıcılar. Şu anda sadece ayar ve sınırlı konum özelliği getiriliyor, ama ne bu özellik erişildiğinde oturum isterseniz? Ya da belki de (e-posta, phonenumber, posta kodu, vb) ilk doğrulama fonksiyonu ile değerini çalıştırmak istiyorum. Belki başka bir fonksiyon çağırmak zorunda, ya da başka bir özelliği ayarlamak olacak. Ben bu ile gidiyorum nerede görüyorum. Ayarlayıcıları & kullanarak alıcılar, size sınıflar için kapsülleme değerli bir katman ekleyin, ve% 99 zaman bu ve belirleyiciler olmadan yukarıda örneklerini yapmaya çalışıyorum düşünün ;) yapmanız gereken ekstra yazarak değer alıcılar. Bu az söylemek için büyük bir baş ağrısı olur.

Düzenleme: Ben Doktrini söylemeyi unutmuşum. Bu bir nesne ilişkisi mapper (ORM) olduğunu ayarlayabilirsiniz belirleyiciler ve otomatik (diğer şeyler arasında) sizin için alıcılar. Sen http://www.doctrine-project.org/ adresinden kontrol edebilirsiniz

Ben bir adım geri almak ve biraz daha genel sorular sorardım:

  • Neden bu kadar çok bilgi ortaya çıkarmak için yaşıyorum; ne kullanıyor ve neden?
  • Bu sınıf gerçekten diğer bazı sınıfı için özel bir sınıf olması gerekir bu durumda davranış olmadan sadece bir veri yapısı, var mı?
  • Bu sınıf, tek bir amaca hizmet, ya da monolitik olma yolunda olduğunu mu?

Eğer "Builder" ile başlatmak için "acyclic Ziyaretçi" desenleri Çıkış bir formda bir veritabanı, ekran, vb ihracat için bir sınıf örneğine görüşlerini oluşturmak mümkün olduğunu keşfedebilir.

Sınıf özelliklerini ve iç durumu bilgi almak, bir yapı aka: erişimcilerine ilgili, ben açıklayan ne için bunları kullanmak için bir ihtiyaç görmüyorum. Ancak, sınıfın özellikleri için ben bazı durumlarda yarar görebiliyordu, ama daha özelliklerini almak için değil, nesnenin devlet mutasyonlar için.

Ben tuz tahıllarımı birkaç ay sonra ekleyebilirsiniz eğer:

Kamu özelliklere sahip çok un-OO olduğunu. Sadece (diğer nedenler arasındadır) nedeniyle bir doğrudan manipülasyonu kullanarak kolayca Refactor veya bazı dış kaynak alanını değiştirir (daha fazla) kontrol denetimleri gerçekleştirmek için yollar vermez herşey, kapsüllü edilmelidir. Örneğin, bir proje boyunca birkaç kez kullanılan birçok alanları ile bir sınıf var diyelim, ve bu proje dosyalarının binlerce içerir; Çalışıyorsa olmuştur ve şimdi birkaç yıl için genişletilmiş bir proje. Adlı şirketin iş modeli değiştirme, ya da bir sorun alanın veri türünün bazı ve şimdi bazı doğrulama olması gerekir ile bulundu olduğunu olduğunu varsayalım; doğrudan ortak üye erişen kaynak kodunun tüm bu binlerce olduğunu doğrulama yinelenen olacak? PHP, çözüm basit, ama çoğu OO programlama dili (ig Java). Olabilir Aslında OO based on encapsulation. Kısacası, kapsül temiz kod üretmek değil, aynı zamanda değil sadece olmasıdır kodu (maliyet-etkin ve uyumlu demek değil) oldukça yaşatılabilir.

Sette __ __ get / tarafından manipüle ediliyor Özel üye (dizi) sahip Öneriniz iyidir. Bu yolla, yol boyunca bazı ekstra doğrulama gerekiyorsa sadece setter ve / veya getter oluşturmak ve bunun sonu olacak. Bazıları kod tamamlama tekme-açamazsınız __ get / __ set olarak sayaç üretken olmak ile iddia edilebilir. IMHO, kod tamamlama güvenmek sadece tembel kodlama olduğunu. Ama sonra tekrar, her üye bu kendi alıcı ve / veya setter var olan daha kapsamlı bir API belgelerine yazmak için izin verir. Şahsen, ben genelde kullanmak technique, iç ya da çok genel amaçlı sınıflar için. Tüm alanlar herhangi bir doğrulama gerekmez, ya da dediğin gibi bunlardan birkaç düzine sonra kullanarak, varsa sihirli yöntemler bence kabul edilebilir olurdu.

Alt satırı sınıf örnekleri üzerinde doğrudan üyesi erişim, süre kaçınmaktır. Size ulaşmak için karar nasıl bu kesinlikle size kalmış. Sadece API de bunu yapmak daha soyut belgelenmiş olduğundan emin olun.

Son bir not olarak, PHP, zaten gibi bir şey, örneğin, onların alanlarını kapsülleme değildir kullanılmaktadır sınıfları varsa

class SomeObject {
   public $foo;
   public $bar;
   public $baz;
   //...
}

sadece böyle bir şey ile bir şey refactor kalmadan bu sınıf çözebilirsiniz:

class SomeObject {
   private $_foo;   // having underscore as prefix helps to know what's private/protected
   private $_bar;   // inside the code.
   private $_baz;

   public function __get($name) {
      $methodName = 'get'.ucfirst($name);
      if (method_exists($this, $methodName)) {
         return $this->{$methodName}();
      } else {
         throw new Exception("Method '{$methodName}' does not exist");
      }
   }

   public function __set($name, $value) {
      $methodName = 'set'.ucfirst($name);
      if (method_exists($this, $methodName)) {
         $this->{$methodName}($value);
      } else {
         throw new Exception("Method '{$methodName}' does not exist");
      }
   }

   public function getFoo() { return $this->_foo; }
   public function setFoo($value) { $this->_foo = $value; }

   public function getBar() { return $this->_bar; }
   public function setBar($value) { $this->_bar = $value; }

   public function getBaz() { return $this->_baz; }
   public function setBaz($value) { $this->_baz = $value; }

}

Sonra

$obj = new SomeObject();
$obj->foo = 'Hello world';    // legacy code support
$obj->setFoo('Hello world');  // same thing, but preferred

Ve OO paradigma sahip olan ve direct access bir örneğinin niteliklerine de tatmin. Ayrıca __call() öneki 'get' veya 'set' ve çağrı __get() ve __set() buna göre kontrol olabilir, ama ben bu olsa, bu kadar ileri gitmezdim gerçekten ->member ve ->getMember() / ->setMember() aracılığıyla özel üye bulunuyor erişmek için genel amaçlı sınıfları sağlayacak