0

メンテナンスとコード編成の観点から、PHP5 では、Web サービスからの XML データのオブジェクトとクラスを作成/定義することは理にかなっていますか?

例としてTwitter の APIを使用すると、API メソッド (statuses、users、direct_messages など) ごとにクラスが作成されます。の場合statuses/public_timeline、次のようなものがあります。

class Statuses {
    public $status = array(); // an array of Status objects
    public function __construct($url) { // load the xml into the object }
}

class Status {
    public $created_at, $id, $text; // and the rest of the attributes follow...
}

$public_timeline = new Statuses('http://twitter.com/statuses/public_timeline.xml');
echo $public_timeline->status[0]->text;

または、すべてを連想配列にダンプする方がよいので、アイテムは次のようにアクセスされます。

// the load_xml function is just something that will dump xml into an array
$public_timeline = load_xml('http://twitter.com/statuses/public_timeline.xml');
echo $public_timeline['statuses']['status'][0]['text'];

最初のデザイン:

  • オブジェクト指向の原則に厳密に従う
  • コンパイルされた言語により適したアプローチのようです

2 番目の設計:

  • API が変更された場合、必要なメンテナンスは大幅に少なくなります。API が XML に属性を追加する場合、最初の設計で対応するクラスを更新する必要があります。
4

3 に答える 3

1

私は Philippe と一緒です。アプリケーションが非常に小さい場合 (たとえば、ステータス メソッドを呼び出すだけの場合) は、解決策 2 を使用してください。

そもそもステータス情報をエコーするためだけにたくさんのクラスを作成する必要がないことに同意します。ただし、アプリケーションが巨大になる場合は、ソリューション 1 を念頭に置いて設計してください。開発を進めていくと、特定のクラスに属する特定のメソッドを作成することになります。ステータス メッセージを「並べ替える」メソッドを作成したい場合があります。知るか?そのため、それぞれが独自の責任を持つクラスを作成するため、何百もの関数を含む大きな php ファイルを検索する必要はありません。

アプリケーションがどのように成長するかわからない場合、「両方の世界のベスト」アプローチは、少なくとも各 Twitter カテゴリ (タイムライン、ステータス、ユーザーなど、合計でおそらく 12) に対してクラスを作成することであると私は信じています。 )、各メソッドの代わりに。あまり多くのクラスを作成したくない場合は、IMO が良い解決策です。

于 2009-08-26T20:19:46.630 に答える
1

これはあなたのプロジェクトに依存すると思います...

最初のデザイン:

  • オブジェクト指向の原則に厳密に従う
  • コンパイルされた言語により適したアプローチのようです
  • 大きなアプリケーションで必要
  • 再利用が容易
  • データを渡すときの利点
  • データだけでなく、機能を追加する方法があります

2 番目の設計:

  • API が変更された場合、必要なメンテナンスは大幅に少なくなります。API が XML に属性を追加する場合、最初の設計で対応するクラスを更新する必要があります。
  • 簡単で迅速な解決策
  • 小さなコード
于 2009-08-26T17:34:49.007 に答える
0

PHP5 で XML を使用している場合は、SimpleXML を使用するのが最善だと思います。そうすれば、両方の長所を活かすことができます。非常に配列のような方法で値にアクセスできます。ただし、SimpleXML クラスを拡張して、メソッドやその他の便利なカスタム機能を提供できます。

// To get the effect of an array...
$twitte = 'http://twitter.com/statuses/public_timeline.xml';
$public_timeline = simplexml_load_file($twitte);
echo $public_timeline->statuses->status;

または、SimpleXml クラスを拡張します

class MyXml extends SimpleXml
{    
    public function quickStatus()
    {
        $status = $this->xpath("/statuses/status");
        return (string)$status[0];
    } 
}

// then access like
$twitte = 'http://twitter.com/statuses/public_timeline.xml';
$public_timeline = simplexml_load_file($twitte, 'MyXml');
echo $public_timeline->quickStatus();

上記の例は、クラスを拡張する方法を示すためのものです。詳細については、Google Codeで作成したライブラリの XML クラスを確認してください。

于 2009-08-26T23:45:39.150 に答える