3

Web アプリの古い静的 html フロントエンド (いくつかの jquery を使用) を置き換えるために、新しいシングルページ フロントエンドを構築しています。そうしているうちに、API から返されるオブジェクトのタイプに関する問題に遭遇します。

PHP バックエンドからデータを JSON としてエクスポートする場合、エクスポート前にオブジェクトが持っていた型を入れる追加のフィールドを含めます。これを使用して、リクエストしたリソースのさまざまなサブクラスを処理できます。

ただし、親クラスで区別したい場合もあります。次のシナリオを検討してください。

継承ツリー:

Animal
    Mammal
        Human
        Dog
        ...
    Reptile
        Crocodile
        Snake
        ...

GET /アニマルズ/

[
    {"_type": "Human", "id": 1, "food": "Ice Cream"},
    {"_type": "Human", "id": 2, "food": "Steak"},
    {"_type": "Human", "id": 3, "food": "Peanut Butter"},
    {"_type": "Dog", "id": 4, "food": "Horse Poop"}
    {"_type": "Crocodile", "id": 5, "food": "Humans"}
]

すべての動物を表示したいが、たとえばすべての哺乳類を強調表示したい特定の UI がある場合、どの動物が哺乳類であるかがわからないため、問題が発生します。

私たちが思いついた最も簡単な解決策は、バックエンドからオブジェクトをエクスポートするときに継承チェーンを含めることです。おそらく次のようになります。

{
    "_type": "Human",
    "id": 10,
    "food": "Ice Cream",
    "_parentClasses": "Animal.Mammal.Human"
}

これが特に優れたソリューションだとは思いませんが、実装と使用が簡単で、堅牢に見えます。

これは良い/良い/悪いアイデアだと思いますか? また、この問題にどのように取り組みましたか?

4

5 に答える 5

1

多くの良い答えがあります。考えた方がよい別のオプションがあります。

サブクラスをJSONでクライアントに送信するだけで、クライアントはベースクラスが何であれルックアップを行います。サーバー側からクライアント側に複雑さが移動し、JSON メッセージをきれいに保つことができます。

于 2013-03-26T13:12:12.310 に答える
1

あなたの心痛を引き起こしているのは、出力時のオブジェクトの平坦化であるように私には思えます。おそらく、GET/Animals は次のようなものを返す必要があります。

[
    {"Mammals": {   
        {"_type": "Human", "id": 1, "food": "Ice Cream"},
        {"_type": "Human", "id": 2, "food": "Steak"},
        {"_type": "Human", "id": 3, "food": "Peanut Butter"},
        {"_type": "Dog", "id": 4, "food": "Horse Poop"}
    },
    {"Reptiles": {
        {"_type": "Crocodile", "id": 5, "food": "Humans"}
    }
]

出力時にオブジェクトの構造を保持できる場合は、その複雑なオブジェクトをサーバーに送り返すときに、構造がそのまま残るはずです。

于 2013-03-20T14:15:08.937 に答える
1

多くのオプションがあります。これは私が言及したのを見たことがないものです:

文字_type列の代わりに配列を作成し、最初の項目に現在のクラスと残りの親クラスを含めます。

{
    "_type": ["Human","Mammal","Animal"],
    "id": 10,
    "food": "Ice Cream"
}

これは、PHP 側で次のように簡単に実装できるはずです。

$_type = array_keys(class_parents($this));
array_unshift($_type, get_class($this));
于 2013-03-20T14:21:42.857 に答える
0

これが実際に回答としての資格があるかどうかはわかりませんが(または、質問が質問としての資格があることさえあります!!)、数年前にタイムマネージャーで同様のプロセスを使用しました。継承パスも同様の方法で行われます。基本的にはるかに多くの作業が必要になる他の代替手段よりも、非常に簡単で直感的に操作できることがわかりました。

単純さを拡張するために、親だけでなく子も親を知ることができるようにすることで、OOP の通常のルールを破りました。コードに少し追加されますが、実行可能であり、プロセス全体の負担が軽減されます。

于 2013-03-20T14:11:28.027 に答える
0

これを達成する可能性のあるいくつかの方法を見ることができます。次のような URI を受け入れるように REST サーバーを開発できます。

/animals/mammal/humans 
/animals/mammal/dog
/animals/reptile/crocodile

または、上で述べたように、単にオブジェクトのタイプを返します。型からオブジェクトを構築します。

<?php
    $object = null;     

    switch($_type){
      case 'human':
          $object = new Human();
      break;

      case 'dog':
          $object = new Dog();
      break;

      case 'crocodile':
        $object = new Crocodile();
      break;
    }
?>

この問題をどのように解決できるかについて、私の 2 セントだけです。

于 2013-03-20T14:10:05.270 に答える