我是如何开发 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
}
参考#
[[命名空间如何使用]]