Bir "gerçekten uzayabilir" oluşturmak için nasıl

2 Cevap php

I have read a lot of articles on developing classes (I am using php), with the tag lines : 'scalable, robust, maintainable and extensible'.

Ama bir acemi olarak, benim bir deyişle, "sadece soyutlanmış" sınıfları oluşturmak olmuştur. Ben sadece bir demet veya tekrarlayan kodları ayrılmış ve bir sınıfta onları koymak ve ortak görevleri erişmek için yöntemler sağlar Anlamı.

Şey (Ben soyut sınıflar ve bu, ben bile onları kullanıyorum kavramını biliyorum, ama sadece benim diğer sınıflar takip edecek yöntemleri tanımlamak için) benim sınıf genişletilebilir yapmak için bir yol bulamıyorum, olduğunu. Şey, I always find myself editing the core class just to add functionlities.

Benim sınıf genişletilebilir yapma konusunda herhangi bir ipucu? (Ben bu googled ve dışarı çıkar her şey soyut sınıflar, arayüzler ve OOP, işaretçileri üzerinde hiçbir tartışma veya genişletilebilir classses yapmak için bazı ipuçları açıklamalar vardır).

Oh, btw, beni kolay gitmek, ben "gerçek" (9 ecek önce programlama ben geliyorum üniversite oop başladı beni OOP teorileri oluyor, ama onlar bize procedurally çalışma vardı, daha hızlı çünkü ve o lanet proje karşılar vardı Ben mezun olana kadar tarihleri, ve o) 4 yıl boyunca devam etti.

2 Cevap

Sen kitap kontrol etmelidir Design Patterns: Elements of Reusable Object-Oriented Software

Fark ettik gibi, yararlı ve yeniden kullanılabilir nesneler içine sistem çürüyor, genişletilebilir sınıfları yapma ile sorun.

Görev pek çok faktör devreye girer çünkü zordur: kapsülleme, granularity, bağımlılık, esneklik, performans, evrim, tekrar kullanılabilirlik, ve ve üzerinde.

Eğer bazı gerçek dünya senaryo modellemek için çalışıyoruz, ya da uygulama içinde iletişim / işbirliği ve bağımlılıkları üzerinde duruluyor?

İşte tür arıyorsun ne gösteren düşünüyorum bir örnek. Çok daha, çok daha iyi örnekler kesinlikle vardır:

Ne olursa olsun onlar bir şey önbelleğe ne / Benim geliştiricilere basit, normalleştirilmiş API sunulan bir önbellek sistemi geliştirmek istedik. Ben (temel düzeyde) bir önbellek sistemi ne istiyorsun?

  • Birşey (set) önbelleğe mümkün olmak istiyorum
  • Ben bir şey almak için mümkün olmak istiyorum (olsun)
  • Ben önbellek geçersiz edebilmek olmak istiyorum (silme)

Ben bu ile geldi:

abstract class MyNs_Cache
{
    abstract public function Set($key, $data, $ttl);
    abstract public function Get($key);
    abstract public function Delete($key, $ttl);
}

Benim genişletilebilir temel sınıf var. Daha sonra üç sınıf önbelleğe alma MyNs_Cache_Fs, MyNs_Cache_Apc ve MyNs_Cache_Memcache var

class MyNs_Cache_Fs
{
     ...

    public function Set($key, $data, $ttl)
    {
        // here I use fopen/fwrite/etc. to create the cached data
    }

    public function Get($key)
    {
        // here I retrieve the file from the filesystem (if it exists)
    }

    public function Delete($key) { ... }
 }

Bu oldukça yalındır bulunuyor. Bir FileSystem açısından önbelleği uygular. Bu benim özgün sınıf geçmiş bir şey sunmuyor.

class MyNs_Cache_Apc
{
    ...

    public function Set($key, $data, $ttl)
    {
        return apc_add($key, $data, $ttl); // NOT A FILESYSTEM CALL
    }

    public function Get($key) { ... } // you get the idea.

    // This is specific to APC, so I add the functionality HERE
    // NOT in my main Caching class.
    public function PurgeCache()
    {
        return apc_clear_cache();
    }
}

Benim APC cache I (set / / silme olsun) bir önbellek sistemi istediğiniz her şeyi yapar ama aynı zamanda tüm önbelleğini (memcached benim FileSystem önbellek için yararlı ve imkansız bir şey değil) temizlemek için yeteneği sunar

class MyNs_Cache_Memcache
{
    // Memcached needs a pool of servers. APC and filesystem don't.
    private $servers = array(..);

    // It also uses a memcached object.
    private $conn;

    public function __construct()
    {
        $this->conn = new Memcached;

        foreach ($this->$servers as $server)
            $this->AddServer($server);
    }
    ...  // we do all the standard stuff using memcached methods

    // We also want to be able to manage our connection pool
    public function AddServer($server)
    {
        $this->conn->addServer(...);
    }

    // And in some cases, we use inc/dec from memcached
    // APC doesn't have this, and it makes little sense in a filesystem
    public function Increment($key) { ... }
}

Şimdi ben her zaman benim önbellek nesnelerden birini almak ve sadece içinde olan $ obj-> ('some_key') alın biliyorum ve ben her zaman bir sonuç alırsınız.

Aynı şekilde, ben de şu anda çalışmak için çalışıyorum ne özgü işlevlerle erişebilirsiniz.

Eğer, örneğin, bir çocuk sınıf içinde bir yöntem yazabiliyorlar işlevler eklemek için çekirdek sınıfını düzenlemek gerekmez:

class A {
 public function filter_string($str){
  return str_replace ('foo', 'bar', $str);
 }
}

class B extends A {
 public function filter_string($str){
  return str_replace ('machin', 'chose', parent::filter_string ($str));
 }
}

$a = new A;
echo $a->filter_string('foo machin'); // echoes 'bar machin'

$b = new B;
echo $b->filter_string('foo machin'); // echoes 'bar chose'