Note-51804-3

Token ID: 1

ERC-721 1 Transfers

Metadata

{
  "type": "note",
  "title": "我是如何开发Android App的——包结构",
  "tags": [
    "post",
    "Android Dev",
    "Android"
  ],
  "sources": [
    "xlog"
  ],
  "external_urls": [
    "https://lotosbin-4048.xlog.app/Android-Appmd-package"
  ],
  "date_published": "2022-01-17T09:59:49.051Z",
  "content": "## 我是如何开发Android App的——包结构\n#article/done/published \n#2021-01-17\n\n## 包命名规则\n\n```plantuml\nnamespace com.company.project {\n\tnamespace framework{\n\t\tnamespace common{}\n\t\tnamespace services{}\n\t}\n\tnamespace features {\n\t\tnamespace feature_a {\n\t\t\tnamespace module_aa {\n\t\t\t\tnamespace ui {\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\tnamespace core {\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\tnamespace data {\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\tcom.company.project.features.feature_a.module_aa.ui-->com.company.project.features.feature_a.module_aa.core\n\t\t\t\tcom.company.project.features.feature_a.module_aa.data-->com.company.project.features.feature_a.module_aa.core\n\t\t\t}\n\t\t\tnamespace module_ab {\n\t\t\t\tnamespace ui {\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\tcom.company.project.features.feature_a.module_ab.ui --> com.company.project.features.feature_a.module_aa.core\n\t\t\t}\n\t\t}\n\t\tnamespace feature_b {\n\t\t\tnamespace module_ba {\n\t\t\t\tnamespace ui {\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\tcom.company.project.features.feature_b.module_ba.ui --> com.company.project.framework.services\n\t\t\t\tcom.company.project.features.feature_a.module_ab.ui --|> com.company.project.framework.services\n\n\t\t\t}\n\t\t}\n\t\tnamespace feature_n {\n\t\t\tnamespace module_na {\n\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\tnamespace app{\n\t\t\n\t}\n\tcom.company.project.app --> com.company.project.features\n\tcom.company.project.app --> com.company.project.framework\n}\n```\ncom.{company}.{project}.{layer}.{feature}.{module}.{usage}\nlayer=app|features|framework\nfeature=feature1|feature2|...\nmodule=module1|module2|...\nusage=ui|data|core|....\n\ncompany是公司名称,project是项目名称。\nlayer是分层\napp是壳工程用来集成核心功能(features)和基础设施(framework)\n```plantuml\npackage com.company.project {\n\tpackage app{\n\t\n\t}\n\tpackage framework{\n\t\n\t}\n\tpackage features{\n\t\n\t}\n\tfeatures --> framework\n\tapp --> features\n}\n\n```\n\nfeatures中是各个功能的包\n```plantuml\npackage features{\n\tpackage feature_a\n\tpackage feature_b\n\tpackage feature_n\n}\n```\n\nfeature中包含1个或者多个模块,feature作为一个组件来整体部署和集成\n```plantuml\npackage feature_a{\n\tpackage module_aa\n\tpackage module_ab\n}\n```\n每个module中的usage是模块内的分层\n```plantuml\npackage module_aa{\n\tpackage ui{\n\t\n\t}\n\tpackage data{\n\t\n\t}\n\t\n\tpackage core{\n\t\n\t}\n\tui-->core\n\tdata -->core\n}\n```\nmodule中的ui|data|core并不是都必须有,可以只有一个或两个或者都有,\n实际开发过程中,有些模块是有界面,有些模块只有数据\n```plantuml\npackage features.feature_a{\npackage module_ac{\n\tpackage ui\n\tpackage core\n\tpackage data\n\tdata--|>core\n\tui-->core\n}\npackage module_aa.ui\npackage module_ab.ui\nmodule_aa.ui --> core\nmodule_ab.ui --> core\n}\n```\n\nui采用MVVM模式,\n按照界面进行细分,放在pages中\nutils中存放和具体页面无关,应用与所有界面的工具类\nusecases中存放可以在不同页面之间复用的数据处理逻辑\n```plantuml\npackage ui{\n\tpackage usecases\n\tpackage pages{\n\t\tpackage page_a{\n\t\t\n\t\t}\n\t\tpackage page_b{\n\t\t\n\t\t}\n\t}\n\tpackage utils \n\tpage_a --> utils\n\tpage_b --> utils\n\tpage_a --> usecases\n\tpage_b --> usecases\n}\n```\n\ncore 核心包中,按照领域细分为domain_a domain_b ... domain_n\nusecases 中为 ui中使用的usecases的实现,\n每个domain中通过Repository获取与具体技术框架无关的实体。仓库和实体的具体实现在data中。\n```plantuml\npackage core{\n\tpackage usecases{\n\t\tclass SampleUseCase\n\t\tSampleUseCase --> domain_a\n\t\tSampleUseCase --> domain_b\n\t}\n\tpackage domain_a{\n\t\tclass DomainAEntity\n\t\tinterface IDomainARepository\n\t\tIDomainARepository-->DomainAEntity\n\t}\n\tpackage domain_b{\n\t\tclass DomainBEntity\n\t\tinterface IDomainBRepository\n\t\tIDomainBRepository-->DomainBEntity\n\t}\n\tpackage utils {\n\t\n\t}\n\tusecases --> utils\n\tdomain_a --> utils\n\tdomain_b --> utils\n}\n\n```\n\ndata 数据层按照存储方式细分,api/room/datastore ...\nrepositories中 为core中的仓储接口的实现,仓储同时负责缓存的实现\nutils中为工具类\n\n```plantuml\npackage data{\n\tpackage api\n\tpackage room\n\tpackage datastore\n\tpackage repositories\n\tpackage utils\n\t\n\n}\n\n```\n\n## 参考\n[[命名空间如何使用]]",
  "attributes": [
    {
      "value": "Android-Appmd-package",
      "trait_type": "xlog_slug"
    }
  ]
}