0

私は標準的なリスナーに精通しています。ジャワで。たとえば、オブジェクトのコレクションがある場合、CreateListener、ChangeListener、DeleteListener など、さまざまなものの一連のリスナーをサポートできます。それぞれに、影響を受けるオブジェクトのリストが渡されるメソッド (objectChange など) が 1 つあります。このコレクションを使用するアプリは、リスナーを実装して登録することにより、これらの 1 つ以上に関心を登録できます。コレクション内のオブジェクトに何かが起こると、適切なリスナーが呼び出されます。

しかし、これらのイベントの種類が多数あり、おそらく似ているが多少異なる場合はどうなるでしょうか。代わりに、多くのメソッドを持つ 1 つのリスナー クラスを定義することは理にかなっていますか。例えば:

class EventListener
{
    void objectsCreatedA( Object[] newObjects );
    void objectsCreatedB( Object[] newObjects );
    void objectsCreatedC( Object[] newObjects );

    void objectsChangedA( Object[] newObjects );
    void objectsChangedB( Object[] newObjects );
    void objectsChangedC( Object[] newObjects );

    void objectsDeletedA( Object[] newObjects );
    void objectsDeletedB( Object[] newObjects );
    void objectsDeletedC( Object[] newObjects );
}

これにより、これらのイベントの多くに登録したいアプリにとって簡単になるようです。アプリは、それぞれが 1 つのメソッドのみを実装する多くのクラスを定義するのではなく、1 つのクラスに多くのメソッドを実装します。欠点や他の提案はありますか?

明確化の編集:(休日に気を取られて申し訳ありません。これが別の投稿であるべきかどうかはわかりませんが、これをフォローアップするのは理にかなっているようです)

クライアント アプリが使用するフレームワークとして、このコードが複数の言語で実装されることを指定する必要がありました。C++ の場合、複数のインターフェイスを実装するのは困難です。

スーパーセット抽象リスナーは、メソッドごとに何もしないデフォルトの実装を提供できるため、それを拡張するクライアントは、関心のあるものをオーバーライドするだけで済みます。このアプローチでは、後で追加のメソッドを抽象クラスに追加することを決定でき、既存のクライアントは問題ありません (必要に応じて、それらの新しいメソッドをオーバーライドできます)。また、(アプリが 1 つまたは複数を呼び出す) 多数の登録方法の代替ではなく、1 回の呼び出しで 1 つの登録のみが必要です。

この明確化により、スーパーセット抽象クラスは個々の抽象クラスよりも意味がありますか?

4

3 に答える 3

1

クラスは複数のインターフェースを実装できるため、単一のクラスが一連の異なるリスナーを実装することを宣言する以外に、これがあなたを救うとは思えません。一方、実際には実装する必要のないメソッドをクラスに実装するよう強制する場合があります。

于 2009-06-30T19:01:48.483 に答える
1

私は、それらが意味的に似ている (凝集) 場合にのみ、その関数をインターフェイスにグループ化し、イベント "objectsCreatedA" に関心のあるオブジェクトが "objectsCreatedB" にも関心がある可能性が非常に高い場合にのみ、それ以外の場合は、いくつかのクラスで終了します実装されていない関数: かなり醜いです。

別の方法として、イベントが非常に類似している場合は、「タイプ」パラメーターを渡すことができます。これにより、レシーバーはコードを因数分解して、処理するイベント タイプを選択できます。

于 2009-06-30T18:41:59.253 に答える
0

それらすべてを1つのクラスにグループ化することの唯一の欠点は、クラスがかなり大きくなり、読みにくくなる可能性があることです。そうは言っても、リスナーがまったく似ていない場合は、かなり高い結合度を持つランダムな機能の束である大規模なクラスになってしまう可能性があります。

このルートを使用することになった場合は、このリスナーが1回だけ存在することを確認してください(シングルトン、静的など)。

于 2009-06-30T18:45:36.267 に答える