簡潔な答え:
その方法は次のとおりです。
- 単純な「通常の」もの(デバイスのカメラを開くボタンや別のボタンを開く
Activity
/UIViewController
アクションの背後にあるロジックなし)の場合-ActivityA
直接 opens ActivityB
. ActivityB
必要に応じて、アプリ共有ロジック レイヤーとの通信を担当するようになりました。
- より複雑なものやロジックに依存するものについては、2 つのオプションを使用しています。
ActivityA
orUseCase
を返すsome のメソッドを呼び出し、それに応じて何らかのアクションを実行します -OR-enum
public static final int
- Saidは、提供されたパラメーターを使用して、アプリ内のどこからでもcommon を開く方法を知っている、以前に登録し
UseCase
た のメソッドを呼び出すことができます。ScreenHandler
Activities
長い答え:
私は、両方のモバイル プラットフォーム (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;
}
}
さらに複雑な呼び出しの例
BroadcastReceiver
Android またはAppDelegate
iOSの Aは、プッシュ通知を受け取ります。NotificationHandler
これは、java lib 論理層にあるものに送信されます。一度構築されたNotificationHandler
コンストラクターでは、両方のプラットフォームで実装した をApp.onCreate()
受け取ります。ScreenHandler
interface
このプッシュ通知が解析され、正しいメソッドが呼び出されてScreenHandler
正しい が開きますActivity
。
肝心なのは:View
をできるだけ馬鹿にしてActivity
、自分のライフサイクルを処理し、自分のビューを処理し、自分自身と通信するのに十分なだけ賢く保ちますcontrollers
(複数形!)、そして他のすべてを書く必要があります (できればテスト-最初 ;) ) Java ライブラリ内。
これらのメソッドを使用すると、アプリは現在、Java ライブラリ内のコードの約 60 ~ 70% を実行しています。次の更新では、うまくいけば 70 ~ 80% になるはずです。