web-dev-qa-db-ja.com

内部クラス/インターフェースとのコントラクトインターフェース/クラス

プロジェクト構造の簡単な説明。

BaseViewBasePresenter...のような基本クラスがいくつかあります。また、私のプロジェクトはモジュールで構成されており、モジュールはアプリケーションの1つの完全な部分を表しています。
各モジュールには独自のPresenterView ..があります。
しかし、各モジュールには独自のBase<ModuleName>Presenter ...があり、特定のモジュール要件が定義されています。
最初はこれらすべてのクラスに個別のファイルを使用していましたが、それから別のアプローチを見つけました。

アイデアは、すべてのモジュール固有の基本クラス\インターフェイスが配置されているContract class\interfaceを作成することです。

例を示します。

public interface StatisticsContract {

    interface View extends BaseView<Presenter> {

        void setProgressIndicator(boolean active);

        void showStatistics(int numberOfIncompleteTasks, int numberOfCompletedTasks);

        void showLoadingStatisticsError();

        boolean isActive();
    }

    interface Presenter extends BasePresenter {

    }
}

または

public interface ModesListContract {
    static abstract class Presenter extends BasePresenter {

    }

    interface View extends BaseView {

    }
}

個人的には、これはすべての基本クラスを1つの場所にグループ化するのに便利であり、これは一種のパターンになります-Contract。特定のモジュールのすべての基本インターフェイスがどこにあるか知っています。私はまた、グーグルAndroidソースコードでそのようなアプローチを見ました。

しかし一方で、これはSingle Responsibility Principleやその他の既知の慣行に違反しているようです。

したがって、このアプローチを使用しても問題ないのか、それとも避けるべき悪い習慣なのかはわかりません。

お返事をいただければ幸いです。

ありがとう

3
CROSP

アイデアは、すべてのモジュール固有の基本クラス\インターフェイスが配置されているコントラクトクラス\インターフェイスを作成することです。

これは確かに [〜#〜] isp [〜#〜] の違反のように見えます。

アプリケーションに標準化されたモジュールのセットがあることを理解しています。そのために、低結合とモジュール実装を交換する機能が必要です。その場合は、Application/Contract/Modules名前空間(Javaの場合はパッケージ)を作成し、モジュールごとにサブ名前空間を作成して、そこにすべてのモジュール固有のインターフェースを配置することをお勧めします。

すべて(またはモジュールの大部分)で共有されるすべてのインターフェースは、Application/Contract名前空間/パッケージに移動する必要があります。

モジュールインターフェイス定義をモジュール自体に配置すると、実装の交換で問題が発生します。古いモジュールにはインターフェース定義が含まれているため、新しいモジュールは古いモジュールに依存します。

1