2017-08-01 28 views
2

假如有人說,你必須在你的應用程序有這些模塊,的Android模塊和代碼orginizing

  1. 用戶可以登錄,如果用戶已經註冊
  2. 用戶可以發送郵件提供
  3. 用戶可以登錄out

它們是什麼意思的模塊,他們可以說你的應用程序必須具備這些功能,我明白,模塊是你的應用程序的一個組件,你可以建立,測試或獨立調試。模塊包含您的應用程序的源代碼和資源。

我的問題是,如果他們這樣說,我該如何以專業的方式組織我的代碼?我必須爲這些功能中的每一個製作單獨的軟件包嗎?或者我必須爲每個功能製作單獨的模塊,我對代碼的組織有所疑惑

+0

如果您絕對需要,只將您的項目拆分爲模塊。對於像Facebook這樣的巨型應用程序來說,它可能是有意義的,但對於95%的應用程序而言,單個模塊就沒問題,並且不會承受多個模塊帶來的開銷。至於組織你的其他代碼,[這是一個偉大的文章](https://overflow.buffer.com/2016/09/26/android-rethinking-package-structure/) - 一般來說,包裝由功能而不是層(即登錄將有一個包,消息傳遞將有一個包)將導致您的代碼庫更容易導航。 –

+0

那麼只有單個包裝中的課程可以做到這一點?或單獨的軟件包?我描述的功能僅僅是一個例子,我們將在哪裏需要包 – blackHawk

+0

單元測試怎麼樣,我們如何可以將我們的代碼組織起來,以便它可以輕鬆地進行單元測試? – blackHawk

回答

0

模塊可能意味着一些事情,具體取決於上下文。通常,這樣的術語非常模糊。在Java/Kotlin中,它可以是類或包。就Android而言,它可以是您的應用程序的一個概念上(或功能上)獨立的組件。此外,這些組件通常將駐留在單獨的文件(類)和包中,因此存在語義重疊。

讓我們把你的例子:

  1. 登錄
  2. 發送消息。
  3. 退出。

在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的指導,應用架構,這正是約模塊化設計:https://developer.android.com/topic/libraries/architecture/guide.html

更新

什麼MVC?

Android使用派生的MVC,稱爲Model-View-Presenter。在MVP中,發言人假定「中間人」的功能(詳細信息here)。我們用一個例子:https://github.com/googlesamples/android-architecture/tree/todo-mvp。這款Google簡單的應用程序說明了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進行,那麼這些模塊被稱爲鬆散耦合。這帶來的好處,如(簡述)...

  • 易於在模塊內變化的,因爲它們是內部到一個模塊不會影響任何其他模塊
  • 分別開發,製造和測試每個模塊
  • 的能力的變化
  • ...更多的負載這裏

模塊化可能涉及部分或全部以下的:

  • 邏輯分離
  • 物理分離
  • 某種類型的模塊化系統,如OSGI或任何Jigsaw項目產生在Java中9

所以,這是背景。在Android應用程序(您的問題標記)的情況下,我建議一個模塊就足夠了,您應該使用打包來定義該模塊內的邏輯分隔。您可以通過層elsewhere發現大量的功能和封裝包的描述,雖然它確實能感覺到他們都是由兩個基本原則爲基礎,這些常見的方法讀了起來:

  • 共複用原則:包中的類可以重用。如果您重新使用包中的某個類,則可以全部重用它們。
  • 共同封閉原則:封裝中的類應該針對相同類型的更改一起關閉。影響包的更改會影響該包中的所有類,而不會影響其他包。

您的測試樹的組織應該鏡像您的主樹的組織。如果主要軟件包被很好地考慮在內,那麼測試軟件包也將是。換句話說,如果你發現編寫測試用例變得更加困難,那麼依靠看起來錯誤的地方的類和包就會變得很困難,那麼這是一個明確的暗示,你應該重新考慮你的包裝方法。

作爲一個起點,你可以看看現有的開源Android應用程序,看看是否有通用的模式出現。你也可以看看this answer到相關的SO問題。但最終,你會最好地理解你的應用程序的細節,所以儘管一個衆所周知的/廣泛使用的結構是一個很好的起點,你可能不得不隨着你自己的應用程序的發展而改變它,在那個階段重構工具和測試覆蓋率將會是很有用。

+0

如果有人說你應該遵循像數據層,視圖層和控制層這樣的層次方法,那麼這些包就像包含所有與數據相關的類的數據包一樣, – blackHawk

+0

和單元測試怎麼樣?組織我們的代碼,以便單元測試更容易? – blackHawk

+0

「如果有人說你應該遵循像數據層,視圖層和控制器層這樣的層次方法,那麼這些包就像包含所有與數據相關的類等的數據包一樣。是的,這就是'逐層打包'的樣子。 – glytching

0

你需要做三件相當簡單的事情。他們每個人都需要一個視圖,有兩個實體(用戶和消息),並且會有一些輔助類或更多。這聽起來像10個班以下。

這就像有10件文書工作。你會爲10張紙購買多少個組織者?你會把組織者放到多少櫃子裏?

就是這樣。 KISS。只要項目很小,將所有東西放在一個包中就是最實用的。編寫單元測試可以幫助您限制依賴關係,以便您可以在代碼擴展時將代碼分解爲包或甚至模塊。把所有東西放在一個地方並不妨礙你進行測試,也不會阻止你進行任何測試。沒關係,當項目增長時,它變得很糟糕,因爲沒有可見的結構。發生這種情況時,您會更好地瞭解如何進行拆分。