導入: なぜ、クロスプラットフォームのモバイルアプリのための層アーキテクチャのマターを層化

クロスプラットフォームのモバイル開発は、重複した努力を最小限に抑えながら、リーチを最大限に活用するために探しているチームにとって標準となっています。Flutter、React Native、および.NET MAUIなどのフレームワークは、iOSとAndroidの両方をターゲットにするための単一のコードベースを可能にしますが、アプリケーションアーキテクチャの選択は、保守可能なスケーラブルなアプリケーションとプラットフォーム固有のスパゲッティの具体的な混乱の違いを効果的に行うことができます。レイヤアーキテクチャは、クロスプラットフォームアプリを構築するときに特に強力な懸念の明確な分離を導入しています。クロスプラットフォームのアルゴリズムは、その理由を明確に把握し、具体的な手順を検証し、具体的な手順を検証します。

層構造の理解

層構造は、多くの場合、n層アーキテクチャと呼ばれ、アプリケーションを水平スライスに分割します。各層は、定義済みのロールを持ち、契約やインターフェイスを介して隣接するレイヤーと通信します。モバイルアプリケーションにおける最も一般的な層は次のとおりです。

  • [ プレゼンテーションレイヤー] – ユーザインタフェース(UI)とユーザーエクスペリエンス(UX)を処理します。画面をレンダリングし、ジェスチャーをキャプチャし、UIの状態を管理します。クロスプラットフォームフレームワークでは、このレイヤーは通常フレームワークの宣言言語(例、Flutterウィジェット、React Native JSX)で書かれています。
  • [ビジネスロジックレイヤー(BLL)[ - コアルール、ワークフロー、およびアプリが何をするかを定義する計算が含まれています。 このレイヤーはプラットフォーム固有のAPIを参照してはならない。
  • [データアクセスレイヤー(DAL)[ - リモートAPI、ローカルデータベース、またはファイルストレージなどのデータソースを抽象化します。 これは、ビジネスロジックレイヤーの統一されたインターフェイスを提供し、残りのアプリは、データがSQLite、REST、またはGraphQLから来るかどうかを無視することができます。
  • []サービスレイヤー(オプション)[] - 認証、キャッシュ、または分析などのクロスカットの懸念を管理するために時々使用されます。 BLLと外部サービスの間で座っています。

厳格な分離とは、プレゼンテーションレイヤー(リストからグリッドへの切り替えなど)の変化がビジネスルールやデータアクセスに影響を及ぼさないことを意味します。同様に、Firebaseからカスタムバックエンドへの切り替えは、データアクセスレイヤーのみの更新を必要とします。この分離は、プラットフォーム固有のUIパターン(Android、iOS上のヒューマンインターフェイスガイドライン)が共有されたビジネスロジックで共存しなければならないクロスプラットフォームプロジェクトに特に価値があります。

クロスプラットフォーム開発の主な利点

1. 最大のコード再利用可能な

適切にレイヤーされたアーキテクチャでは、ビジネスロジックとデータアクセスレイヤーは、一度に書き出し、すべてのターゲットプラットフォーム間で共有することができます。プレゼンテーションレイヤーは、プラットフォーム固有のコード(例えば、ナビゲーション構造やフォント処理)が含まれているかもしれませんが、コアロジックは同一です。このことは、コードの合計量を大幅に削減し、書き込み、テスト、および維持することができます。例えば、UIウィジェットからステート管理(RiverpodまたはBLoCを使用して)を分離するFlutterプロジェクトは、UIウィジェット全体とAndroid、Web、およびWeb、デスクトップ、およびWeb、およびWeb、およびWeb、Web、およびWeb、Web、およびWeb、およびWeb、Web、およびWeb、デスクトップ、およびWeb、およびWeb、デスクトップ、およびデスクトップ、およびデスクトップ、デスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、デスクトップ、およびデスクトップ、デスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、およびデスクトップ、および

2.独立した維持性

各レイヤーは、他人に影響を与えずに更新、修正、または置換することができます。サードパーティのAPIがエンドポイントフォーマットを変更する場合、データアクセスレイヤーだけが変更を必要とします。デザインチームがユーザーインターフェイスを刷新したい場合は、ビジネスロジックが未接触のままに、プレゼンテーションレイヤーは書き換えることができます。これにより、再帰バグを減らし、反復サイクルを加速します。クロスプラットフォームアプリでは、プラットフォーム固有の回避策が薄いレイヤーに合わせられているため、メンテナンス性がさらに強化されます。

3. 未来の特長とプラットフォームの拡張性

レイヤーされたアーキテクチャは、スケーリングを自然にサポートします。新しい機能を追加すると、ビジネスロジックレイヤーとプレゼンテーションレイヤーを拡張することが多いため、データレイヤーはマイナーな追加を必要とする場合があります。さらに重要なのは、新しいプラットフォーム(例えば、macOSまたはWindows)をサポートすることにしたチームが、新しいプレゼンテーションレイヤーを実装する必要があるということです。共有されたビジネスとデータレイヤーは既に互換性があります。これはFlutter teamによって撮影されたアプローチでした。WebデスクトップをサポートしたときにWebサイトを有効化して、Webサイトを有効化します。

4. 合理化されたテストおよびDebugging

レイヤーは分離でテストできます。ユニットテストは、UIやネットワーク依存を設定せずに、ビジネスロジックレイヤーに対して実行できます。統合テストでは、ストレージサービスのモック化によってデータアクセスレイヤーを対象としています。プレゼンテーションレイヤーはウィジェットやコンポーネントテストでテストできます。各レイヤーは単一の責任を持っているので、欠陥は簡単に見つけることができます。複雑な計算のバグは、UIコードではなく、ビジネスロジックレイヤーではほとんど確実です。クロスプラットフォームチームは、すべてのプラットフォームで同じように実行する単一のテストスイートから恩恵を受けることができます。

5. 並列チームコラボレーション

レイヤーアーキテクチャは、チームを同時作業できるようにします。 UI/UX デザイナーは、バックエンド開発者がデータアクセスレイヤーに取り組む一方で、プレゼンテーションレイヤーに集中できます。また、バックエンド/ API ロジックは、ビジネスロジックレイヤーで実装されます。コミュニケーションは、レイヤー間でインターフェイス(コントラクト)のみで同意する必要があります。クロスプラットフォームのコンテキストでは、プラットフォーム固有のプレゼンテーションコードを 1 チームに分けて共有されたビジネス テラグラムと別のチームが所有するかもしれません。この作業部門は、コンフリクトをマージし、開発スピードを上げるだけです。 [Fluction] は、これらのツールを[Fal] または [False] コマンド ([Flu] )] または [Flu] コマンド] コマンドを変換] または [Flu または [Flu] コマンドで指定します。

実用的な実装のヒント

明確な境界を定義する

最も一般的な間違いは、レイヤーが互いにbleedできるようにすることです。 古典的なアンチパターンは、UIコンポーネント内の直接データベースアクセスです。 厳格な規則を実施します。 プレゼンテーションレイヤーはデータベースドライバをインポートしてはならないし、ビジネスロジックレイヤーはUIウィジェットを参照してはならない。 依存性注射を使用して、レイヤー間でサービスを渡します。 React Nativeでは、これはコンテキストプロバイダとカスタムホックで達成できます。 Flutterでは、継承されたウィジェットやプロバイダーパッケージが提供されます。

共有レイヤー用のプラットフォーム認識ツールを選択します。

再利用を最大化するために、ビジネスロジックとデータアクセスレイヤーをターゲットアグノスティックである言語とフレームワークで書きます。Flutterでは、Dartコードはターゲット間で自然に共有されます。React Nativeでは、TypeScript/JavaScriptは明らかな選択肢です。プラットフォーム固有のAPIを参照しないようにしてください(例えば、AndroidのSharedPreferencesやiOSのUserDefaults)は、直接共有コードで共有されます。代わりに、Fluはインターフェイスの後ろにそれらをラップします。多くのクロスプラットフォームライブラリは、すでにそのような抽象化を[Fract] {[Frid[F] {[F]}] {[Frid[F]}]}]}]}[F]}]}]}[F]}[F]}]} [F]}] {[Fab[Fab[F]}]}]}]}]}]} [[Fab[Fab[Fab[F]}]}]}]}]}]}]}[Fab[Fab[F[F[F[F[Fab[F]}]}]}]}]}]}]}]}]}]}

インターレイヤーコミュニケーション用のインターフェースを使用する

各レイヤーは、抽象化(インターフェイスまたはプロトコル)に依存し、具体的な実装ではありません。これにより、コンポーネントを交換しようとします。例えば、ビジネスロジックレイヤーのインターフェイスを定義し、生産(Firebase)とテスト(モック)の実装を提供します。このパターンは、ユニットテストに不可欠であり、必要に応じて異なるプラットフォームに適応させる(例えば、iOS対Androidの異なるバイオメトリックライブラリを使用して)。

業務ロジックからUIを分離し続ける

この原則は、プラットフォームUIのガイドラインが異なるため、クロスプラットフォームアプリにとって特に重要です。 ボタンが材料としてレンダリングされるかどうか、またはSwiftUI]としてレンダリングされているかどうかをビジネスロジックは気にしないでください。 実際には、状態の更新からUIイベントをデカップリングする状態管理パターン(BLoC、Redux、MobX、Reppod)を使用します。 プレゼンテーションレイヤーは単にアクションをディスパッチします。 ビジネスロジックレイヤーは、新しい状態を反応し、発光します。

定期的なリファクタ層

アプリケーションが成長するにつれて、レイヤー境界はぼかしてしまうことがあります。スケジュールの定期アーキテクチャレビュー。UIコードは、ネットワークのリクエストを直接呼び出すか、データベースのクエリを含むビジネスロジックを呼び出しているような、漏れた抽象化の兆候を探します。技術的な債務を回避するために、初期に再ファクタ。自動焼結とアーキテクチャの執行ツール(例:))は、DartまたはESLintプラグインで、規律を維持するのに役立ちます。

期待する課題

レイヤードアーキテクチャはシルバーの弾丸ではありません。 パターンに新しい開発者は、初期開発を遅くするボイラープレートを作成して過度に抽象化することができます。 分離は、ファイルとクラスの数を増やすこともできます。小さなアプリの圧倒的な感じがします。 しかし、取引オフはアプリが成長するにつれてすぐにオフに支払います。 もう一つの課題は、複数の抽象層からオーバーヘッドがパフォーマンスされますが、現代のコンパイラとJIT / AOTの最適化はこれを最小限に抑えます。 最後に、レイヤー境界を尊重してチームを訓練するには、一貫したコードのドキュメントとレビューが必要です。

世界で成功を収めたストーリー

多くの企業クロスプラットフォームアプリは、レイヤーアーキテクチャを採用しています。 Alibabaのモバイルeコマースプラットフォームは、明確に定義されたデータ、ドメイン、およびプレゼンテーションレイヤーでクリーンなアーキテクチャアプローチを使用して、iOSとAndroidのコードベースの約90%を共有することができます。 同様に、 ]Nike Training Club]アプリは、ビジネスロジックとUIの明確な分離を使用してReact Nativeを使用して、作業のアルゴリズムを迅速にテストすることなく、A/Boutコンポーネントを使用することができます。

コンテンツ

レイヤードアーキテクチャは、クロスプラットフォームのモバイルアプリケーションのための構造化された保守可能な基盤を提供します。 共有ビジネスロジックからプラットフォーム固有の懸念を分離することにより、チームは高コード再利用、メンテナンスの容易化、拡張性の向上、およびテスト性の改善を実現します。 それは設計と規準の先行投資を必要とするが、長期的利点は、初期の複雑さをはるかに上回ります。 あなたは新しいアプリをFlutter、React Native、または別のフレームワークを構築しているかどうかにかかわらず、レイヤードアーキテクチャを採用することで、あなたは、あなたが望む製品の品質変更や品質を適応するために必要な堅牢性を提供するのに役立ちます。