我是如何開發 Android App 的 —— 包結構#
#article/done/published
#2021-01-17
包命名規則#
namespace com.company.project {
namespace framework{
namespace common{}
namespace services{}
}
namespace features {
namespace feature_a {
namespace module_aa {
namespace ui {
}
namespace core {
}
namespace data {
}
com.company.project.features.feature_a.module_aa.ui-->com.company.project.features.feature_a.module_aa.core
com.company.project.features.feature_a.module_aa.data-->com.company.project.features.feature_a.module_aa.core
}
namespace module_ab {
namespace ui {
}
com.company.project.features.feature_a.module_ab.ui --> com.company.project.features.feature_a.module_aa.core
}
}
namespace feature_b {
namespace module_ba {
namespace ui {
}
com.company.project.features.feature_b.module_ba.ui --> com.company.project.framework.services
com.company.project.features.feature_a.module_ab.ui --|> com.company.project.framework.services
}
}
namespace feature_n {
namespace module_na {
}
}
}
namespace app{
}
com.company.project.app --> com.company.project.features
com.company.project.app --> com.company.project.framework
}
com.{company}.{project}.{layer}.{feature}.{module}.{usage}
layer=app|features|framework
feature=feature1|feature2|...
module=module1|module2|...
usage=ui|data|core|....
company 是公司名稱,project 是項目名稱。
layer 是分層
app 是殼工程用來集成核心功能(features)和基礎設施(framework)
package com.company.project {
package app{
}
package framework{
}
package features{
}
features --> framework
app --> features
}
features 中是各個功能的包
package features{
package feature_a
package feature_b
package feature_n
}
feature 中包含 1 個或者多個模塊,feature 作為一個組件來整體部署和集成
package feature_a{
package module_aa
package module_ab
}
每個 module 中的 usage 是模塊內的分層
package module_aa{
package ui{
}
package data{
}
package core{
}
ui-->core
data -->core
}
module 中的 ui|data|core 並不是都必須有,可以只有一個或兩個或者都有,
實際開發過程中,有些模塊是有界面,有些模塊只有數據
package features.feature_a{
package module_ac{
package ui
package core
package data
data--|>core
ui-->core
}
package module_aa.ui
package module_ab.ui
module_aa.ui --> core
module_ab.ui --> core
}
ui 採用 MVVM 模式,
按照界面進行細分,放在 pages 中
utils 中存放和具體頁面無關,應用與所有界面的工具類
usecases 中存放可以在不同頁面之間複用的數據處理邏輯
package ui{
package usecases
package pages{
package page_a{
}
package page_b{
}
}
package utils
page_a --> utils
page_b --> utils
page_a --> usecases
page_b --> usecases
}
core 核心包中,按照領域細分為 domain_a domain_b ... domain_n
usecases 中為 ui 中使用的 usecases 的實現,
每個 domain 中通過 Repository 獲取與具體技術框架無關的實體。倉庫和實體的具體實現在 data 中。
package core{
package usecases{
class SampleUseCase
SampleUseCase --> domain_a
SampleUseCase --> domain_b
}
package domain_a{
class DomainAEntity
interface IDomainARepository
IDomainARepository-->DomainAEntity
}
package domain_b{
class DomainBEntity
interface IDomainBRepository
IDomainBRepository-->DomainBEntity
}
package utils {
}
usecases --> utils
domain_a --> utils
domain_b --> utils
}
data 數據層按照存儲方式細分,api/room/datastore ...
repositories 中 為 core 中的倉庫接口的實現,倉庫同時負責緩存的實現
utils 中為工具類
package data{
package api
package room
package datastore
package repositories
package utils
}
參考#
[[命名空間如何使用]]