簡潔な答え:
その方法は次のとおりです。
- 単純な「通常の」もの(デバイスのカメラを開くボタンや別のボタンを開く
Activity/UIViewControllerアクションの背後にあるロジックなし)の場合-ActivityA直接 opens ActivityB. ActivityB必要に応じて、アプリ共有ロジック レイヤーとの通信を担当するようになりました。
- より複雑なものやロジックに依存するものについては、2 つのオプションを使用しています。
ActivityAorUseCaseを返すsome のメソッドを呼び出し、それに応じて何らかのアクションを実行します -OR-enumpublic static final int
- Saidは、提供されたパラメーターを使用して、アプリ内のどこからでもcommon を開く方法を知っている、以前に登録し
UseCaseた のメソッドを呼び出すことができます。ScreenHandlerActivities
長い答え:
私は、両方のモバイル プラットフォーム (Android と iOS) が j2objc を使用して実装するアプリケーションのモデル、ロジック、およびビジネス ルールに Java ライブラリを使用する会社の主任開発者です。
私の設計原則は Uncle Bob と SOLID から直接来ています。コンポーネント間通信を備えたアプリケーション全体を設計するときに MVP や MVC を使用するのは本当に嫌いActivityですController。と同じくらい変化する傾向があるコントローラーの神のオブジェクトになりViewます。これにより、深刻なコードの臭いが発生する可能性があります。
UseCasesこれを処理する私のお気に入りの方法 (そして最もクリーンな方法) は、アプリ内の 1 つの「状況」を処理するそれぞれにすべてを分割することです。確かにController、それらのいくつかを処理する を持つことができますが、UseCasesそれが知っているのはそれらに委任する方法だけUseCasesです。
Activityさらに、このアクションが単純な「マップ画面に移動する」またはこの種のものである場合、のすべてのアクションを論理レイヤーにController座っていることにリンクする理由がわかりません。の役割は、それが保持Activityするものを処理するViewsことであり、アプリケーションのライフサイクルに存在する唯一の「スマート」なものとして、次のアクティビティ自体の開始を呼び出せない理由はないと思います。
さらに、Activity/UIViewControllerライフサイクルが複雑すぎて、共通の Java ライブラリで処理するには、それぞれがあまりにも異なっています。これは私が「詳細」と見なすものであり、実際には「ビジネス ルール」ではありません。各プラットフォームが実装して考慮する必要があるため、Java ライブラリのコードがより堅実になり、変更されにくくなります。
繰り返しになりますが、私の目標は、アプリの各コンポーネントを可能な限り SRP (Single Responsibility Principle) にすることです。これは、リンクするものをできるだけ少なくすることを意味します。
したがって、単純な「通常の」ものの例:
(すべての例は完全に架空のものです)
ActivityAllUsersモデル オブジェクト アイテムのリストを表示します。これらの項目は、バック スレッドで -a を呼び出しAllUsersInteractorてUseCase controller作成されました (これは、要求が完了したときに、メイン スレッドへのディスパッチを伴う Java ライブラリによっても処理されます)。ユーザーは、このリスト内の項目の 1 つをクリックします。この例では、 はActivityAllUsersすでにモデル オブジェクトを持っているためActivityUserDetail、このデータ モデル オブジェクトのバンドル (または別のメカニズム) を使用して簡単に開くことができます。新しいアクティビティ は、さらにアクションが必要な場合ActivityUserDetailに正しい を作成して使用する責任があります。UseCases
複雑なロジック呼び出しの例:
ActivityUserDetail「友達として追加」というタイトルのボタンがあり、クリックすると次のコールバックメソッドが呼び出さonAddFriendClickedれActivityUserDetailます。
public void onAddFriendClicked() {
AddUserFriendInteractor addUserFriend = new AddUserFriendInteractor();
int result = addUserFriend.add(this.user);
switch(result){
case AddUserFriendInteractor.ADDED:
start some animation or whatever
break;
case AddUserFriendInteractor.REMOVED:
start some animation2 or whatever
break;
case AddUserFriendInteractor.ERROR:
show a toast to the user
break;
case AddUserFriendInteractor.LOGIN_REQUIRED:
start the log in screen with callback to here again
break;
}
}
さらに複雑な呼び出しの例
BroadcastReceiverAndroid またはAppDelegateiOSの Aは、プッシュ通知を受け取ります。NotificationHandlerこれは、java lib 論理層にあるものに送信されます。一度構築されたNotificationHandlerコンストラクターでは、両方のプラットフォームで実装した をApp.onCreate()受け取ります。ScreenHandler interfaceこのプッシュ通知が解析され、正しいメソッドが呼び出されてScreenHandler正しい が開きますActivity。
肝心なのは:Viewをできるだけ馬鹿にしてActivity、自分のライフサイクルを処理し、自分のビューを処理し、自分自身と通信するのに十分なだけ賢く保ちますcontrollers(複数形!)、そして他のすべてを書く必要があります (できればテスト-最初 ;) ) Java ライブラリ内。
これらのメソッドを使用すると、アプリは現在、Java ライブラリ内のコードの約 60 ~ 70% を実行しています。次の更新では、うまくいけば 70 ~ 80% になるはずです。