2012-01-18 17 views
5

Node adlı soyut bir dersim var. Veritabanımdan bir satır alan ve temel bilgileri toplayan bir kurucu içerir. Bu uzanan sınıflarınBu PHP sınıf yapısında kullanmak için uygun tasarım deseni ne olurdu, çoklu miras almadıkça?

3 özeldir Person, Event, Project vb - - web sitemdeki içeriğin tüm parçaları bu sınıfı genişletir onlar inşa edildiğinde, veritabanından değerleri çekerek ek olarak, onlar da sorgulamak gerekir bir web servisi; Web hizmeti, DB'de verilenlerden farklı değerler sağlıyorsa, DB'ye kaydetmeleri gerekir. Çok-devingen yetenekli bir dilde, bu oldukça basit olurdu; Bu sınıflardan herhangi biri hem Node hem de APIData veya bunun gibi bir şey uzayacaktır. MI olmadan, bunun nasıl ele alınacağından emin değilim. Bir arayüz kullanmak, hiçbir somut uygulama sağlamadığı için yardımcı olmaz.

Dekoratör kalıbı, MI'nın bazı özelliklerinin yerine geçmesi için bazen önerilir, ancak bunun uygun seçim olup olmadığını belirlemek için yeterli tecrübem yok. Baska öneri?

+0

IMO: Birden çok devralmayı desteklemeyen PHP bir ÖZELLİKTİR. Not; 'Strateji' tasarım desenine göz atın http://www.dofactory.com/Patterns/PatternStrategy.aspx –

+2

Çok az sayıda dil birden fazla kalıtımını destekliyor. Arayüzlere ve delegasyona dayalı normal tasarım modelleri, PHP'de gayet iyi çalışır. –

cevap

1

APIData sınıfı, Node sınıfınızdan işlevselliği alacağından, onu genişletmeniz gerekir. İşte bazı sahte kod şudur: "tamam, bir dekoratör desen uygulamak için gidiyorum"

abstract class APIData extends Node { 

    public function __construct($data) { 
     parent::__construct($data); 
     $this->checkData(); 
    } 

    protected function checkData() { 
     // load data from webservice 
     $data = $this->loadData(); 

     // check if data is the same 
     foreach($data as $item => $value) { 
      if ($this->data[$item] != $value) { 
       // save in database 
      } 
     } 
    } 
} 
3

Nesneler dilsiz olmalı. Bir şey inşa ettiğimde, sorduğumdan başka bir şey yapmamalı - yani kendinizi inşa etmelisiniz. Web servislerini sorgulama ve veritabanına yazma. Nesnelerinizi takımınızda başka bir geliştirici olarak kullanıyor olsaydım şok olurdum.

Bu yüzden, doğru model için mücadele ettiğinizi düşünüyorum, çünkü nesnenizin birden fazla endişesi vardır.

Burada en iyi yaklaşım şunları yapar vb bir PersonService, EVENTSERVICE gibi nesneleri döndüren bir hizmet oluşturmak için olacağını düşünüyorum:

  • veritabanından kayıt Al
  • ise webservice kontrol etmek gerekir: değişiklikleri, veritabanına geri kaydetmek bulunmamakta ise
    • webservice
    • veri almak
  • Geçiş rekor contructor itiraz
  • Dönüş nesnesi

Bu mantıklı bir yerde webservice çağrısının endişelerini tutar - yani, gerekli verileri alır kod inşa ve nesneleri döndürmek için, aka bir hizmet (DÜZENLEME: aslında bir DAO daha, ama fikir).

+0

İlk başta, nesneleri kullanmak demek, zaman kaybı, yani "aptal" dır. Bu örnekte tercih edilen terminolojinin "aptal" olduğunu düşünüyorum. –

+0

"dumb" ;-) –

+0

için güncelleştirildi Ben genel olarak size önerilen, muhtemelen daha iyi bir fikir olduğunu düşünüyorum rağmen, ben bu uygulama, özellikle bu özel uygulamanın belirli öznitelikleri nedeniyle 'Düğüm' genişleten 'APIData' olan cevabı seçtim API tabanlı verilerle ilişkilendirilmiş benzersiz bir kimlik. – rybosome

0

Mutlaka oturup gibi bir tasarım deseni seçim yapmaması gerektiğini Bunun yerine, kodunuzu çalışacağı şekilde tasarlamanız gerekir ve bunun sonucunda tasarım deseni gelişir. Öyle ki, bazı ortak tasarım modellerini anlatan ve aradıklarını bilerek bunları tanımlamayı kolaylaştıracak pek çok mevcut terminolojimiz var.

Her halükarda, aşağıdan yukarıya gitmenizi öneririm.Node'u genişletmek ve bir şekilde APIData'u zorlamaya çalışmak yerine, Node ve APIData nesnelerinden oluşan ayrı bir nesneye sahip olabilirsiniz ve bu nesnenin kendileri üzerinde çalışmasını sağlar.

PHP 5.4 özellikleriyle birlikte çıktığında, bu daha kolay olacaktır.

İlgili konular