SORU
9 ŞUBAT 2012, PERŞEMBE


Özellikleri vs Arayüzleri

PHP son zamanlarda okumaya çalışıyorum ve özellikleri üzerinde kapattı başladım. Kodu yeniden yatay ve istemediği kavramını anlıyorum soyut sınıfından mutlaka. Benim anlamadığım kullanarak özellikleri karşı arabirimleri arasındaki en önemli fark nedir?

İyi bir blog yazısı ya birini ya da diğerini kullanmak için madde açıklayan aramaya çalıştım, ama şimdiye kadar bulduğum örnekler aynı olması için çok benzer görünüyor.

Herkes orada paylaşın bu görünüm/görüş olabilir mi?

CEVAP
9 ŞUBAT 2012, PERŞEMBE


Kamu Hizmeti Duyurusu:

Özellikleri hemen hemen her zaman bir kod kokusu olduğuna inanıyorum kayıtlara geçmesini istiyorum ve kompozisyon lehine kaçınılmalıdır. Tek bir miras sık sık anti-desen ve çoklu kalıtım sadece bileşikler bir varlığın tayin etmek için bu sorunu istismar bence. Çok daha iyi miras (tek veya birden fazla olabilir) kompozisyon kokuyor çoğu durumda görev yapmış olacaksın. Eğer hala özelliklerini ve aralarındaki ilişkilerini ilgileniyorsanız, okumaya devam edin ...


Başlayalım, bu söyleyerek:

Nesne Yönelimli Programlama (OOP) kavramak için zor bir paradigma olabilir. Kullanıyorsun diye sınıfları kod olduğu anlamına gelmez Nesne Yönelimli (OO).

OO kod yazmak OOP gerçekten nesnelerin özellikleri hakkında olduğunu anlamak gerekir. Ne açısından onlar sınıfları hakkında düşünmelisinyapabilironlar yerineaslında. Bu odak kodu biraz "bir şey yap." yapma yerini geleneksel prosedürsel programlama tezat.

Eğer OOP kod planlama ve tasarım hakkında ise, bir arabirim planı ve bir nesne tam olarak inşa edilmiş ev. Bu arada, özelliklerin basit bir şekilde evin planı ortaya koydu (arayüzü) oluşturmak yardımcı olmak için vardır.

Arayüzleri

Neden arabirimleri kullanmalıyım? Oldukça basit, arayüzleri kodumuzu daha az kırılgan. Eğer bu açıklama size şüphe varsa, arayüzleri karşı yazılmış değildi eski kod korumak için zorunlu olan birisine sorun.

Arayüzü programcı ve kod arasında bir sözleşmedir. Arabirimi, "benim kurallarıma göre oynayacaksın sürece beni ancak uygulayabilirsiniz senin gibi ve diğer kodunuzu Ara vermeyeceğim söz veriyorum." diyor

Yani örnek olarak, bir gerçek dünya senaryo (araba veya Aletler) göz önünde bulundurun:

Kesmek için bir web uygulaması için bir önbellek sistemi uygulamak istiyorum sunucu üzerindeki yükü aşağı

Dışarı önbellek isteği yanıtları APC kullanarak bir sınıf yazarak başlatın:

class ApcCacher
{
  public function fetch($key) {
    return apc_fetch($key);
  }
  public function store($key, $data) {
    return apc_store($key, $data);
  }
  public function delete($key) {
    return apc_delete($key);
  }
}

Sonra, http yanıt nesnesi, tüm işi gerçek yanıtı oluşturmak için yapmadan önce önbellek vurmak için kontrol edin:

class Controller
{
  protected $req;
  protected $resp;
  protected $cacher;

  public function __construct(Request $req, Response $resp, ApcCacher $cacher=NULL) {
    $this->req    = $req;
    $this->resp   = $resp;
    $this->cacher = $cacher;

    $this->buildResponse();
  }

  public function buildResponse() {
    if (NULL !== $this->cacher && $response = $this->cacher->fetch($this->req->uri()) {
      $this->resp = $response;
    } else {
      // build the response manually
    }
  }

  public function getResponse() {
    return $this->resp;
  }
}

Bu yaklaşım iyi çalışıyor. Ama belki bir kaç hafta sonra APC yerine dosya tabanlı cache sistemi kullanmak istediğinize siz karar verin. Şimdi değiştirmelisin denetleyicisi kod çünkü ... programlanmış denetleyicisi ile çalışmak işlevselliği ApcCacher Sınıf yerine bir arabirim ifade yetenekleri ApcCacher sınıf. Hadi yukarıdaki yerine CacherInterface beton yerine ApcCacher gibi bir Controller sınıf bağımlı yaptın ki:

// your controller's constructor using the interface as a dependency
public function __construct(Request $req, Response $resp, CacherInterface $cacher=NULL)

Eğer arayüzü gibi yani define ile birlikte gitmek için:

interface CacherInterface
{
  public function fetch($key);
  public function store($key, $data);
  public function delete($key);
}

Sırayla ApcCacher FileCacher yeni sınıfları CacherInterface uygulamak zorunda ve Controller sınıf yetenekleri arayüzü ile kullanmak için gerekli program.

Bu örnek (umarım) arabirimi programlama sınıfların iç uygulama değiştirmenizi sağlar nasıl, değişiklikleri diğer kodu kıracak olursa önemsemeden gösterir.

Özellikleri

Özellikleri, diğer taraftan, Sadece re-code için bir yöntem. Arayüzleri davranışları dışlayan bir alternatif olarak düşünülmemelidir. Aslındayetenekleri bir arayüz yerine getirmek gerekli özellikleri oluşturmak ideal kullanım böyledir.

Sadece birden fazla sınıf aynı işlevi (büyük olasılıkla aynı arayüz tarafından dikte) paylaştığınızda özellikleri kullanmalısınız. Tek ders ne obfuscates ve daha iyi bir tasarım ilgili sınıfa özelliği işlevselliği gider. tek bir sınıf için işlevsellik sağlamak için bir özellik kullanarak bir manası yok:

Düşünün aşağıdaki özellik uygulama:

interface Person
{
    public function greet();
    public function eat($food);
}

trait EatingTrait
{
    public function eat($food)
    {
        $this->putInMouth($food);
    }

    private function putInMouth($food)
    {
        // digest delicious food
    }
}

class NicePerson implements Person
{
    use EatingTrait;

    public function greet()
    {
        echo 'Good day, good sir!';
    }
}

class MeanPerson implements Person
{
    use EatingTrait;

    public function greet()
    {
        echo 'Your mother was a hamster!';
    }
}

Bir daha somut bir örnek düşünün: iki FileCacher ApcCacher arayüz tartışma aynı yöntem olup olmadığını belirlemek için bir önbellek girdisi bayat ve olmalıdır silinmiş (belli değil bu durumda gerçek hayatta, ama kendini birak). Bir özellik yazma ve iki sınıf ortak arayüz gereksinimi için kullanmaya izin verebilir.

Dikkat son bir söz: özellikleri ile denize gitmek için dikkatli olun. Genellikle özellikleri benzersiz sınıf uygulamaları yeterliyken kötü tasarım için bir destek olarak kullanılır. En iyi kod tasarımı için arayüz gereksinimleri yerine getirmek için özellikleri sınırlamanız gerekir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Alan Fullmer

    Alan Fullmer

    3 EYLÜL 2010
  • curioustravelers

    curioustrave

    12 AĞUSTOS 2006
  • Lamborghini

    Lamborghini

    13 Aralık 2005