2017-08-01 4 views
2

と仮定誰かをorginizingコードを使用すると、アプリ、あなたにこれらのモジュールを持たなければならないと言う、Androidのモジュールと

  1. ユーザがすでに
  2. は、ユーザーがメッセージを送信することができますサインアップする場合は提供してサインインすることができます
  3. ユーザーが署名することができますout

モジュールが意味することは、アプリケーションにこれらの機能が必要であると言うことができます。モジュールは、独自に構築、テスト、またはデバッグできるアプリケーションのコンポーネントです。モジュールには、アプリのソースコードとリソースが含まれています。

私の質問は、このように言うなら、どのようにプロの方法で自分のコードを整理できますか?これらの機能ごとに個別のパッケージを作成する必要がありますか?または私は機能ごとに別々のモジュールを作る必要があります、私はコードの編成について混乱しています

+0

絶対に必要な場合のみ、プロジェクトをモジュールに分割します。 Facebookのような巨大なアプリケーションでは意味をなさないかもしれませんが、95%のアプリケーションでは、1つのモジュールだけで十分で、複数のモジュールがもたらすオーバーヘッドに苦しむことはありません。他のコードを整理する場合は、[これはインスピレーションのための素晴らしい記事です](https://overflow.buffer.com/2016/09/26/android-rethinking-package-structure/) - 一般的に、 (つまり、ログインにはパッケージがあり、メッセージングにはパッケージがあります)、コードベースをもっと簡単にナビゲートすることができます。 –

+0

したがって、単一のパッケージのクラスだけでこれができますか?または別のパッケージ?私が問題にしている機能はちょうどよい例です。どこにパッケージが必要でしょうか。 – blackHawk

+0

ユニットテストはどうでしょうか?簡単に単体テストできるように、どうすればわかりますか? – blackHawk

答えて

0

モジュールは、文脈に応じていくつかを意味することができます。通常、このような用語は非常に曖昧です。 Java/Kotlinでは、クラスまたはパッケージのいずれかになります。 Androidの点では、アプリケーションの概念的に(または機能的に)独立したコンポーネントの1つにすることができます。さらに、これらのコンポーネントは、通常が別々のファイル(クラス)とパッケージに存在するため、意味の重複があります。

のはあなたの例を見てみましょう:

  1. サインインして
  2. メッセージを送信します。
  3. ログアウト。
  4. Androidの上で

、あなたはそうのようにそれをモデル化することができます:ここで

app 
˪ ui 
    ˪ SplashActivity 
      ˪ SignInFragment 
      ˪ SignUpFragment 
˪ data 
    ˪ db 
     ˪ DatabaseManager 
     ˪ models 
      [model classes] 
    ˪ api 
     [classes responsible for network communication] 

はあなたが持っている:

  • ui - UIを担当するモジュール/コンポーネント(と同時にパッケージで)論理。

  • SplashActivity - ログイン/サインアップに関するロジックを管理します。概念的には、それをモジュールと呼ぶこともできます。物理的にクラス/ファイル。

  • data - データ操作専用の大きなモジュール/コンポーネントです。再び、同時に、物理的に、パッケージ。

  • db - データベースロジック専用のサブモジュール。

など。私が運転しようとしているのは、モジュールがの抽象化であることがよくあります。

ユニットテストについて。モジュラー設計は常にアプリケーションをよりテスト可能にします。上記の例では、すべてのUIロジックがデータロジックから分離されているため、すべてのデータを簡単に嘲笑することができます。 Activityは、適切なインターフェイスの背後にすべての詳細が隠されている限り、データがどこから引き出されても問題ありません。 これは、ビット幅の広い質問ですので、私はあなたに正確にモジュラーデザインについてですアプリケーションアーキテクチャへのAndroidのガイドをお勧めしますMVCについてどう

更新

https://developer.android.com/topic/libraries/architecture/guide.html

AndroidはModel-View-Presenterと呼ばれるMVCの派生を使用します。 MVPでは、プレゼンターは、「ミドルマン」(詳細here)の機能を前提としています。例を使用しましょう:https://github.com/googlesamples/android-architecture/tree/todo-mvp。このGoogleのシンプルなToDoアプリは、MVPデザインを示しています。これは次のように構成されています:

todoapp 
˪ data 
    ˪ source 
    ˪ Task.java (model) 
[...] 
˪ tasks 
    ˪ TasksActivity.java 
    ˪ TasksFragment.java 
    ˪ TasksPresenter.java 
    [...] 

ご覧のとおり、このレイアウトは、私が以前に示したものと非常に似ています。データ(モデル)ロジックは、別々のパッケージとUIロジック(View、Presenter)で保持されます。もちろん、PresenterとViewを別に分けることもできますが、これは非常に簡単なアプリケーションであり、クラス分けで十分です。

MVPのように、コンポーネント間をきれいに分離している場合は、それぞれのコンポーネントを個別に計測するのは簡単です。他のコンポーネントをモックするだけです。繰り返しますが、私は読むことをお勧めします: https://developer.android.com/topic/libraries/architecture/guide.html、各セクションのテスト方法に関するセクションがあります。

+0

データ層、ビュー層、コントローラ層のようなレイヤーアプローチに従うべきだと言ったら、これらはデータに関連するすべてのクラスを持つデータパッケージなどのパッケージになります。 – blackHawk

+0

とは何でしょう?単体テストが容易になるようにコードを整理しますか? – blackHawk

+0

私は自分の答えを更新しました。 – Siegmeyer

0

モジュール化は、アプリケーションを個別のパーツに分割し、これらのパーツ間の通信を制御するAPIを定義することを示します。モジュール間のすべての通信がこれらのAPIを経由する場合、モジュールは疎結合と呼ばれます。一つのモジュールに内蔵されている変更は、他のモジュール

  • 個別に各モジュールを開発、構築、テストする能力に影響を与えませんので、これは、そのような(簡単に)などのメリット...モジュール内の変更の

    • 使いやすさをもたらします
    • ...もっとここに負荷

    モジュール化は、以下の一部または全てを含むことができる:

    • 論理的に分離
    • 物理的に分離する
    • 、このようなプロジェクトジグソーパズルだから、それが背景だ

    のJava 9で生成どんなOSGIとして、またはモジュール化システムのいくつかの種類。あなたの質問タグ付きのAndroid Appのコンテキストでは、1つのモジュールで十分であり、そのモジュール内で論理的な分離を定義するためにパッケージを使用することをお勧めします。

    • コモン・リユース原理:それは確かに彼らは両方の二つの基本的な原則によって支えられているこれらの共通のアプローチをよく読んで理にかなっている間あなたは層elsewhereによって機能やパッケージによって、パッケージの説明をたくさん見つけてます:パッケージ内のクラスは一緒に再利用されます。パッケージ内のクラスの1つを再利用する場合は、それらをすべて再利用します。
    • Common Closure Principle:パッケージ内のクラスは、同じ種類の変更に対して一緒に閉じなければなりません。パッケージに影響する変更は、そのパッケージ内のすべてのクラスに影響し、他のパッケージには影響しません。

    テストツリーの構成は、メインツリーの構成を反映する必要があります。主要なパッケージが十分に考慮されていれば、テストパッケージも同様になります。別の言い方をすれば、テストケースが間違った場所にあるようなクラスやパッケージに依存することによってテストケースがより困難になることがわかった場合、これはパッケージのアプローチを再考する必要があるという明確なヒントです。

    開始点として、既存のオープンソースのAndroidアプリを見て、共通のパターンがあるかどうかを調べることができます。あなたは関連する質問にthis answerを見ることもできます。しかし、究極的には、アプリの仕様を最もよく理解できるようになるので、よく知られている/広く使われている構造を自分のアプリが進化するにつれて変更する必要がある出発点であり、その段階ではリファクタリングツールやテストカバレッジは非常に便利。

  • +0

    データ層、ビュー層、コントローラ層のようなレイヤーアプローチに従うべきだと言ったら、これらはデータなどのすべてのクラスを持つデータパッケージのようなパッケージになるでしょうか? – blackHawk

    +0

    とは何でしょう?単体テストが容易になるようにコードを整理しますか? – blackHawk

    +0

    "データ層、ビュー層、コントローラ層のようなレイヤーアプローチに従わなければならないとすれば、これらはデータに関連するすべてのクラスを持つデータパッケージのようなパッケージとなります。はい、それは「レイヤーごとのパッケージ」のようになります。 – glytching

    0

    あなたは3つのやや単純なことをする必要があります。それらのそれぞれには1つのビューが必要です.2つのエンティティ(ユーザーとメッセージ)があり、ヘルパークラス以上のものがあります。これは10クラス以下のように聞こえる。

    10個の書類があるようです。 10枚の紙を購入する主催者は何人ですか?主催者はいくつのキャビネットに入れますか?

    これだけです。 KISS。単一のパッケージにすべてを収めているのは、プロジェクトが小さい限り最も実用的です。単体テストを書くことは依存関係を制限して、コードをパッケージやモジュールに分割することができます。すべてを単一の場所に置いても、テストや他の何かからあなたを妨げることはありません。それはうまくいきます、目に見える構造がないので、プロジェクトが成長するときに悪くなります。これが起こると、分割を行う方法がはるかによく分かります。

    関連する問題