2015-04-28 15 views
5

Her zaman Symfony2'deki varlıkları, yalnızca setçiler ve alıcılar içeren düz PHP nesneleri olarak kullanırız. Ancak bir varlığın içinde koleksiyonumuz varsa, hasSomeProperty ($ name) veya isSomething ($ someType) gibi yöntemleri yerleştirmek yararlı olabilir. bu yöntem kişiler yer gereken mantığı içerirKurumlarda hasSomething() veya isSomething gibi yöntemleri yerleştirmek tamam mı?

class User 
{ 
    /** @var ArrayCollection */ 
    private $friends; 

    public function hasFriend($name) 
    { 
     foreach ($this->friends as $friend) { 
      if ($friend->getName() === $name) { 
       return true; 
      } 
     } 

     return false; 
    } 
} 

Bir bakış kaynaktan: Örneğin. Fakat bu mantık SADECE bu varlık ile ilgilidir, bu nedenle Demeter yasasına göre, varlık yazmak için doğru yer burasıdır. Bunun hakkındaki düşüncelerin neler?

+1

Özgün işlevler, varlık sınıfınızın sonuna yerleştirebilirsiniz. –

+1

Bu soru, iyi bir soru olmasına rağmen, aynı zamanda doğru bir StackOverflow sorusu da dayanmaktadır. Bunun dışında: Ben sizin varlığınızda tüm üyeler/izleyiciler olması çok iyi olduğunu düşünüyorum. –

+0

@WouterJ, tamamen size katılıyorum, muhtemelen tek bir doğru cevap yoktur. Ancak, insanların projelerinde kullandıkları konvansiyonları duymakla ilgileniyorum çünkü ekibimizde bu konuyla ilgili tartışmalarımız var. –

cevap

5

Bu hasX() veya isX() yöntemlerini varlığınıza eklemek kesinlikle iyi bir yöntemdir ve bizzat kendisinin bunları yerleştirmek için doğru olduğunu düşünüyorum.

sizin varlığınızın içine bu yöntemleri tutmak için ana argümanı Eğer hasX() veya isX() sonucunu hesaplamak için private ve protected özelliklerine erişimi olmasıdır. Aksi takdirde - yansımayı bir kenara koyma - başka bir amaca hizmet etmeyen bir özellik için bir alıcı işlevi oluşturarak genel API'ye bilgi (muhtemelen duyulabilir) vermeniz gerekir.

Çok fazla miktarda getter işlevi ekleyerek sonlandırabilirsiniz ... bu da yalnızca sonucu harici olarak hesaplama amacına hizmet eder.

FOSUserBundle'in Model\User sınıfında bir örnek görebilirsiniz. (Code)