0

まず、私のユビキタス言語は PHP で、Java の学習を考えています。

そこで、私の質問を 2 つの密接に関連する部分に分割させてください。

ここまでが第一部です。

ドメインモデル クラスがあるとします。いくつかのゲッター、セッター、いくつかのクエリ メソッドなどがあります。いつかそれらを比較できるようにしたいと考えています。したがって、次のようになります。

class MyEntity extends AbstractEntity
{
    public function getId()
    {
        // get id property
    }

    public function setId($id)
    {
        // set id property
    }

    // plenty of other methods that set or retrieve data

    public function compareTo(MyEntity $anotherEntity)
    {
        // some compare logic
    }
}

Java だったら、Comparableインターフェイスを実装する必要がありました。しかし、なぜ?ポリモーフィズム?可読性?または、他の何か?それが PHPの場合Comparable、自分でインターフェイスを作成する必要がありますか?

ということで、第二部に入ります。

私の同僚は、Java では、クラスのすべての動作面に対してインターフェースを作成することが経験則であると教えてくれました。たとえば、このオブジェクトを文字列として表示したい場合、この動作を のように記述する必要がありますimplements Stringable。PHP の場合は次のStringableようになります。

interface Stringable
{
    public function __toString();
}

それは本当に経験則ですか?このアプローチにより、どのようなメリットが得られますか? そして、それはPHPで価値がありますか? そしてJavaで?

4

2 に答える 2

6

もしそれがJavaだったら、私はComparableインターフェースを実装すべきだった。しかし、なぜ?

さて、あなたはすでに「これ」を別のインスタンスと比較する方法を提供しています...実装する場合Comparableは、システムの残りの部分にその機能をサポートしていることを伝えているので、比較は並べ替え、検索に使用できます「最大」または「最小」値など...すべて、タイプについて何も知らないルーチンにあります。

私の同僚は、クラスのすべての動作面のインターフェースを作成することはJavaの経験則であると私に言いました。

それは私にはやややり過ぎに聞こえます。toString()(すでにあるので、あなたの例は良い例ではありませんObject。)目的のないインターフェースをランダムに作成しないでください。ただし、具体的なタイプを知る必要のないコードでその動作を使用したい場合にのみ、インターフェースを作成してください。それが何をサポートするかについて。この良い例はテスト容易性です。「オーセンティケーター」クラスを作成する場合本番コードで異なるオーセンティケーターを交換する、認証を使用する他のコンポーネントをテストするときにオーセンティケーターをモック/偽造することを想像できます。

于 2012-04-03T20:11:00.977 に答える
2

実装する非常に実用的な理由の 1 つComparableは、次のようなことができることです。

List<MyEntity> entities = // ( initialize and populate )

Collections.sort(entities);

並べ替えコードを 1 行も書かずに。

これは、他の人があなたのコードを使用できるようにし、(個人的にはより便利なことに) あなたのコードが信頼できる方法で他の人のコードを使用できるようにする、インターフェイスの使用の根底にある哲学を物語っています。

「クラスのすべての動作面のインターフェース」に関しては、それはやり過ぎのように聞こえるか、やり過ぎのように聞こえます。意味のあるインターフェイスが必要な場合、たとえば、TelephoneThatIsAlsoAToasterインターフェイスが悪い場合は、 と の 2 つのインターフェイスが必要TelephoneですToaster。一方で、インターフェース、、、、などの群れを持つべきではありません。Pluggable必要な詳細レベルは、アプリケーションによって異なります。VisibleHasButtonsFlammable

于 2012-04-03T20:31:57.570 に答える