例を挙げて説明します。私の GWT プロジェクトには、ユーザーが会社を追加、編集、削除、選択、および一覧表示できる Company モジュールがあります。
これらのうち、追加、編集、および削除操作は、ユーザーを CompanyList ページに戻します。したがって、3 つの異なるイベントCompanyAddedEvent, CompanyUpdatedEvent and CompanyDeletedEvent
(およびそれぞれのイベント ハンドラー) を持つことは、機能にまったく違いがないため、やり過ぎのように思えます。
1 つのイベントで 3 つの操作を管理してもよろしいですか? 私が思う1つの選択肢は、のようなイベントを使用することCompanyListInvokedEvent
です。ただし、どこかで適切ではないと思うのは、イベントが実際に呼び出されているリストではなく、会社が追加/更新/削除されていることです。
モジュールが 1 つだけだったら、3 つの個別のイベントでタスクを完了できたはずです。しかし、そのような他の 10 のモジュールは、このジレンマに直面しています。これは、10x3 = 30 のイベント クラスとそれぞれの 30 のハンドラを意味します。その数は、私が再考するのに十分な数です。これに対する良い解決策は何ですか?
アップデート -
@ColinAlworth の回答により、愚かなソリューションの代わりに Generics を簡単に使用できることに気付きました。次のコードは、エンティティが更新されるたびに発生するイベント EntityUpdatedEvent を表します。
イベントハンドラクラス -
public class EntityUpdatedEvent<T> extends GwtEvent<EntityUpdatedEventHandler<T>>{
private Type<EntityUpdatedEventHandler<T>> type;
private final String statusMessage;
public EntityUpdatedEvent(Type<EntityUpdatedEventHandler<T>> type, String statusMessage) {
this.statusMessage = statusMessage;
this.type = type;
}
public String getStatusMessage() {
return this.statusMessage;
}
@Override
public com.google.gwt.event.shared.GwtEvent.Type<EntityUpdatedEventHandler<T>> getAssociatedType() {
return this.type;
}
@Override
protected void dispatch(EntityUpdatedEventHandler<T> handler) {
handler.onEventRaised(this);
}
}
イベント ハンドラー インターフェイス -
public interface EntityUpdatedEventHandler<T> extends EventHandler {
void onEventRaised(EntityUpdatedEvent<T> event);
}
イベントバスへのハンドラーの追加 -
eventBus.addHandler(CompanyEventHandlerTypes.CompanyUpdated, new EntityUpdatedEventHandler<Company>() {
@Override
public void onEventRaised(EntityUpdatedEvent<Company> event) {
History.newItem(CompanyToken.CompanyList.name());
Presenter presenter = new CompanyListPresenter(serviceBundle, eventBus, new CompanyListView(), event.getStatusMessage());
presenter.go(container);
}
});
同様に、他に 2 つの Added および Deleted ジェネリック イベントがあるため、イベント関連のコードベースから冗長性が完全に排除されます。
このソリューションに関する提案はありますか?
PS >このディスカッションでは、この問題についてより多くの洞察が得られます。