3

クラスの開発に関する多くの記事を読みました (私は php を使用しています)。タグ行は「スケーラブル、堅牢、保守可能、拡張可能」です。

しかし、初心者として、私は「抽象化された」クラスを作成してきました。つまり、一連のコードまたは反復コードを分離してクラスに入れ、一般的なタスクにアクセスするためのメソッドを提供しただけです。

問題は、自分のクラスを拡張可能にする方法を見つけることができないということです (抽象クラスなどの概念は知っていますが、それらを使用していますが、他のクラスが従うメソッドを定義するためだけに使用しています)。問題は、機能を追加するためだけにコアクラスを編集していることに常に気付くことです。

クラスを拡張可能にするためのヒントはありますか? (私はこれについてグーグルで検索しましたが、飛び出すものはすべて抽象クラス、インターフェース、およびOOPの説明であり、ポインターに関する議論や拡張可能なクラスを作成するためのヒントはありません)。

ところで、私に気をつけてください、私は9か月前に「実際の」oopプログラミングを始めました(私が出身の大学は私にOOPの理論を進めさせましたが、彼らは私たちに手続き的に取り組んでいました.締め切り、それは私が卒業するまで 4 年間続きました)。

4

2 に答える 2

2

本をチェックする必要がありますデザインパターン: 再利用可能なオブジェクト指向ソフトウェアの要素

お気づきのように、拡張可能なクラスを作成する際の問題は、システムを有用で再利用可能なオブジェクトに分解することです。

カプセル化、粒度、依存性、柔軟性、パフォーマンス、進化、再利用性など、多くの要因が関係するため、この作業は困難です。

現実世界のシナリオをモデル化しようとしていますか?それとも、アプリケーション内のコミュニケーション/コラボレーションと依存関係に焦点を当てていますか?

これは、あなたが探しているものをちょっと示していると思う例です。確かに、はるかに優れた例があります。

私は、開発者が何をどこにキャッシュしていても、シンプルで正規化された API を開発者に提供するキャッシュ システムを開発したいと考えていました。(基本レベルで) キャッシング システムに何が必要ですか?

  • 何かをキャッシュできるようにしたい (set)
  • その何かを取り出せるようになりたい (get)
  • キャッシュを無効化(削除)できるようにしたい

私はこれを思いついた:

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

私の拡張可能な基本クラスがあります。次に、3 つのキャッシング クラスを取得MyNs_Cache_FsMyNs_Cache_Apcました。MyNs_Cache_Memcache

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) { ... }
 }

それはかなり簡単です。FileSystem の観点からキャッシュを実装します。私の元のクラスを超えて何も提供しません。

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();
    }
}

私の APC キャッシュは、キャッシュ システムで必要なすべての処理 (set/get/delete) を行いますが、キャッシュ全体をクリアする機能も提供します (これは、私のファイル システム キャッシュでは役に立たず、memcached では不可能です)。

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) { ... }
}

これで、キャッシュ オブジェクトの 1 つをいつでも取得でき、$obj->Get('some_key') を使用するだけで常に結果が得られることがわかりました。

同様に、現在作業しようとしているものに固有の機能にもアクセスできます。

于 2010-03-01T02:58:43.940 に答える
1

子クラスのメソッドを上書きできる機能を追加するために、コア クラスを編集する必要はありません。

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'
于 2010-03-01T02:45:48.130 に答える