3

次の状況では、配列を使用する代わりに新しいオブジェクト型を作成する方が理にかなっていますか?

名前と年齢の 2 つの値を持つ単純な構造があります。

$ages = array(
     array(
       'name' => 'bill',
       'age'  => 22
    ),
    array(
       'name' => 'bob',
       'age'  => 50
    ),
    // etc
);

問題は、この構造体が 1 つのクラスで生成され、コントローラーを介して渡された後、別のクラスで使用されることです。

したがって、別のクラスで生成されたこの構造の配列キーを知っている必要があるため、これらの 2 つのクラスが結び付けられているように感じます。

これを解決する設計パターンはありますか?

4

4 に答える 4

1

あるクラスでオブジェクト/データ構造を生成し、別のクラスでそれを使用するための設計パターンは (存在するとしても) 必要ないと思います。これは、クラスを操作するための基本的な前提です。また、アルファシンが述べたように、オブジェクトの操作は配列よりも優れています。また、将来的には、そのような必要が生じた場合に、他のオブジェクトとのより良い対話ができるようになる可能性があります。

于 2012-08-23T22:14:29.590 に答える
1

私なら徹底的に Person モデル クラスを定義します。このようなもの

Class Person {

  protected _age;

  protected _name;


  public function __construct($name = null, $age = null) {
    if ($name) setName($name);
    if ($age) setAge($age);
  }

  public function getName() {
    return $this->_name;
  }

  public function setName($name) {
    return $this->_name = (string) $name;
  }

  public function getAge() {
    return $this->_age;
  }

  public function setAge($age) {
    return $this->_age = (int) $age;
  }
}

次に、このクラスを使用して、次のようにデータ構造を作成できます。

$persons = array(new Person('bill', 22),new Person('bob', 50));

この配列は、コントローラーによって渡され、ビューで次のように使用できます。

foreach($persons as $person) {
  echo $person->getName();
  echo $person->getAge();
}

この設計パターンは MVC (Model View Controller) と呼ばれ、非常に人気があり、よく文書化されていますが、解釈は異なる場合があります。

これは単純な構造ではやり過ぎに見えるかもしれませんが、将来コードを拡張する必要がある場合に、多くの時間を節約できます。

(コードはテストされていませんが、問題なく動作するはずです)

于 2012-08-24T00:24:47.927 に答える
0

単純な構造なので操作できますが、一般的にはオブジェクトを操作することをお勧めします。将来フィールドを追加する場合は、レベル (ネストされた配列) を追加します。プログラムがよりモジュール化され、結合が少なくなるため、メンテナンスが容易になります。

// I - easier to use
$bill_age = $ages->get_age('bill'); 
// function get_age() is implemented in the class which 
// makes you code easier to maintain and easier to understand

// II - this implementation is dependent on the structure of $ages 
// if you'll change $ages - you'll have to change all the uses:
$bill_arr = $ages[0];
$bill_age = $bill_arr['age'];

IIさらに、コード内のさまざまな場所でのような呼び出しがある場合、$ages構造を変更するとこれらすべての場所が変更されますが、実装すると、変更するコード内の場所は 1 つだけになります (クラス内のI実装)。get_age($name)

于 2012-08-23T22:10:37.623 に答える
0

この構造のキーを含む 1 つのクラスを作成すると、両方のクラスがこのクラスを共有してキー インスタンスを取得できると思います。そうすれば、両方のクラスでキーを追跡する必要がなくなります。さらに、いつでもどこでも多くの変更を加えることなく、キーを追加できます。カップリングが少なく、柔軟性が高い。

于 2012-08-26T16:39:26.403 に答える