2

ReaderInterface と WriterInterface という 2 つの非常に基本的なインターフェイスを作成しましたが、難問を説明する必要がないため、この例から WriterInterface を削除しました。

ReaderInterface.php

interface ReaderInterface
{
    public function read();
}

Datatable という具象クラスがあります。

データテーブル.php

class Datatable
{
    protected $cols;
    protected $rows;

    protected $reader;

    public function __construct()
    {
        $this->cols = array();
        $this->rows = array();

        $this->reader = null;
    }

    public function setReader(ReaderInterface $reader)
    {
        $this->reader = $reader;
    }

    public function load()
    {
        //Contents to follow below.
    }
}

次のようにデータテーブル インスタンスをインスタンス化します。

$db = new PDO("mysql:host=localhost;port=3306;dbname=test", "user", "pass"); //Let's pretend this is a good connection.

$datatable = new Datatable();
$datatable->setReader(new DatatableReader($db));
$datatable->load();

私の質問は、DatatableReader を実装して、渡したデータベースから読み取り、Datatable オブジェクトに書き込みできるようにすること$this->colsです$this->rows

すぐに2つのアプローチが見えます。

1.依存性注入

class DatatableReader implements ReaderInterface
{
    protected $db;
    protected $datatable;

    public function __construct(Datatable &$datatable, PDO &$db)
    {
        $this->datatable = $datatable;
        $this->db = $db;
    }

    public function read()
    {
        //Execute prepared statement which returns 5 records.
        //Get the columns, and place them into an array.

        foreach ($columns as $col) {
            $this->datatable->addColumn($col); //Add a column to the datatable.
        }
    }
}

次に、私のDatatable::load()メソッドは次のように実装されます。

public function load()
{
    if ($this->reader != null)
        $this->reader->read();
}

2. read() からの弱い型付けの戻り値。

class DatatableReader implements ReaderInterface
{
    protected $db;

    public function __construct(PDO &$db)
    {
        $this->db = $db;
    }

    public function read()
    {
        //Execute prepared statement which returns 5 records.
        //Get the columns, and place them into an array.
        return $columns;
    }
}

load()次に、次のようにメソッドを呼び出します。

public function load()
{
    if ($this->reader != null) {
        $retval = $this->reader->read();

        //Do stuff with the array of information returned from the reader.
    }
}

質問

  1. これら 2 つのオプションのうち、どちらが最適な設計ですか?
  2. 私が見落としている 3 番目のオプションはありますか?
4

1 に答える 1

1

オプション 2 を使用します。オプション 1 を使用すると、再帰が生成されます。contains DatatableReaderobjectDatatableとその逆です。

オプション 1 のもう 1 つの悪い点は、readメソッドを悪用して別のオブジェクトに書き込むことです。そして、具体的な実装 ( DatatableReader) だけがそのオブジェクトについて知っています。インターフェイスを実装するすべてのオブジェクトは、同じように反応する必要があります。

于 2013-01-24T22:41:22.107 に答える