| name | feature-architecture-planning |
| description | Comprehensive architecture planning for new features. Includes architecture design, tech stack selection, file structure planning, implementation roadmap, and risk assessment. Invoke when adding new features, modules, or when user asks for architecture planning. |
åèœæ¶æè§å
æŠè¿°
è¿æ¯äžäžªå®æŽçåèœæ¶æè§åæµçšïŒçšäºåšåŒåæ°åèœåè¿è¡ç³»ç»æ§ç讟计åè§åãç¡®ä¿åèœåŒåææž
æ°çæ¶æãåççææ¯éåãæç¡®ç宿œè®¡åå坿§çé£é©ã
è§Šåæ¡ä»¶
åœåºç°ä»¥äžæ
嵿¶è°ç𿀠SkillïŒ
- çšæ·èŠæ±æ·»å æ°åèœ
- çšæ·èŠæ±åŒåæ°æš¡å
- çšæ·è¯¢é®"åŠäœå®ç°æåèœ"
- çšæ·èŠæ±"è§åäžäžæ¶æ"
- çšæ·èŠæ±"讟计äžäžæ¹æ¡"
- çšæ·èŠæ±"è¯äŒ°äžäžææ¯æ¹æ¡"
è§åæµçš
ç¬¬äžæ¥ïŒéæ±åæäžç°ç¶è°ç
1.1 çè§£éæ±
- æç¡®åèœç®æ åæ žå¿éæ±
- è¯å«åèœèŸ¹çåçºŠææ¡ä»¶
- ç¡®å®äŒå
级åéçšç¢
1.2 è°ç ç°ç¶
- æçޢ项ç®äžçžå
³çç°æä»£ç
- äºè§£é¡¹ç®çææ¯æ åæ¶ææš¡åŒ
- åæç±»äŒŒåèœçå®ç°æ¹åŒ
- è¯å«å¯å€çšçç»ä»¶åæš¡å
å·¥å
·äœ¿çšïŒ
SearchCodebase("å
³é®è¯")
Grep("pattern")
Glob("pattern")
Read("å
³é®æä»¶è·¯åŸ")
LS("ç®åœè·¯åŸ")
ç¬¬äºæ¥ïŒæ¶æè®Ÿè®¡
2.1 æŽäœæ¶æåŸ
ç»å¶æž
æ°çå屿¶æåŸïŒå
å«ïŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â 衚ç°å± â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â Activity/Fragment/Screen â
â âââ UIç»ä»¶ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â äžå¡å± â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â ViewModel â
â âââ ç¶æç®¡ç â
â âââ äžå¡é»èŸ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â æ°æ®å± â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â Repository â
â âââ Dao (æ°æ®è®¿é®å¯¹è±¡) â
â âââ DataSource (æ°æ®æº) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â æ°æ®ååš â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â Room Database / SharedPreferences / File / Network â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
2.2 æš¡ååå
- 衚ç°å±ïŒUIå±ç€ºãçšæ·äº€äº
- äžå¡å±ïŒäžå¡é»èŸãç¶æç®¡ç
- æ°æ®å±ïŒæ°æ®è®¿é®ãçŒåçç¥
- åºç¡è®Ÿæœå±ïŒå·¥å
·ç±»ãæ©å±åœæ°
2.3 äŸèµå
³ç³»
æç¡®åå±ä¹éŽçäŸèµæ¹åïŒååäŸèµïŒé¿å
埪ç¯äŸèµïŒ
ç¬¬äžæ¥ïŒææ¯æ éæ©
3.1 æ žå¿ææ¯è¯äŒ°
| ææ¯ | çšé | éæ©çç± | æ¯åŠå·²æ |
|---|
| ææ¯A | çšéA | çç±A | â
/â |
| ææ¯B | çšéB | çç±B | â
/â |
3.2 æ°å¢äŸèµ
// éèŠæ·»å çäŸèµ
implementation 'xxx:xxx:version'
3.3 ææ¯éååå
- äŒå
䜿çšé¡¹ç®å·²æææ¯ïŒéäœåŠä¹ ææ¬ïŒä¿æäžèŽæ§
- éæ©æççš³å®çææ¯ïŒé¿å
èž©åïŒéäœé£é©
- èèå¢éææ¯æ ïŒäŸ¿äºç»Žæ€ååäœ
- è¯äŒ°æ§èœåœ±åïŒé¿å
åŒå
¥æ§èœç¶é¢
ç¬¬åæ¥ïŒæ°æ®æš¡å讟计
4.1 å®äœç±»è®Ÿè®¡
@Entity(tableName = "table_name")
data class EntityName(
@PrimaryKey(autoGenerate = true)
val id: Long = 0,
val field1: String,
val field2: Int,
val createTime: Long = System.currentTimeMillis(),
val updateTime: Long = System.currentTimeMillis()
)
4.2 æ°æ®è®¿é®å¯¹è±¡ïŒDaoïŒ
@Dao
interface EntityDao {
@Query("SELECT * FROM table_name")
fun flowAll(): Flow<List<EntityName>>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(entity: EntityName)
@Delete
suspend fun delete(entity: EntityName)
}
4.3 æ°æ®åºè¿ç§»
val MIGRATION_X_Y = object : Migration(X, Y) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("""
CREATE TABLE IF NOT EXISTS table_name (...)
""")
database.execSQL("CREATE INDEX IF NOT EXISTS ...")
}
}
ç¬¬äºæ¥ïŒæä»¶ç»æè§å
5.1 éèŠæ°å¢çæä»¶
é¡¹ç®æ ¹ç®åœ/
âââ æ°æ®å±/
â âââ entities/
â â âââ NewEntity.kt âš æ°å¢
â âââ dao/
â âââ NewDao.kt âš æ°å¢
â
âââ äžå¡å±/
â âââ NewViewModel.kt âš æ°å¢
â
âââ 衚ç°å±/
âââ NewActivity.kt âš æ°å¢
âââ NewScreen.kt âš æ°å¢
âââ components/
âââ NewComponent.kt âš æ°å¢
5.2 éèŠä¿®æ¹çæä»¶
é¡¹ç®æ ¹ç®åœ/
âââ é
眮æä»¶/
â âââ AppDatabase.kt ð ä¿®æ¹
â
âââ å
¥å£æä»¶/
âââ MainActivity.kt ð ä¿®æ¹
5.3 éèŠå é€çæä»¶
é¡¹ç®æ ¹ç®åœ/
âââ æ§æä»¶/
âââ OldFile.kt â å é€
第å
æ¥ïŒæ žå¿ä»£ç å®ç°èŠç¹
6.1 ViewModel 讟计
class FeatureViewModel(
application: Application
) : BaseViewModel(application) {
private val _uiState = MutableStateFlow<UiState>(UiState.Idle)
val uiState: StateFlow<UiState> = _uiState.asStateFlow()
val data: Flow<List<Entity>> = repository.getData()
fun doSomething() {
execute {
}.onSuccess {
}.onError {
}
}
sealed class UiState {
object Idle : UiState()
object Loading : UiState()
data class Error(val message: String) : UiState()
}
}
6.2 Screen/Fragment 讟计
@Composable
fun FeatureScreen(
viewModel: FeatureViewModel = viewModel(),
onBackClick: () -> Unit
) {
val uiState by viewModel.uiState.collectAsState()
val data by viewModel.data.collectAsState(initial = emptyList())
Scaffold(
topBar = {
TopAppBar(
title = { Text("åèœæ é¢") },
navigationIcon = {
IconButton(onClick = onBackClick) {
Icon(Icons.Default.ArrowBack, "è¿å")
}
}
)
}
) { paddingValues ->
when (uiState) {
is UiState.Loading -> LoadingComponent()
is UiState.Error -> ErrorComponent((uiState as UiState.Error).message)
else -> ContentComponent(data)
}
}
}
6.3 Repository 讟计
class FeatureRepository {
private val dao = appDb.entityDao()
fun getData(): Flow<List<Entity>> = dao.flowAll()
suspend fun saveData(entity: Entity) {
dao.insert(entity)
}
suspend fun deleteData(entity: Entity) {
dao.delete(entity)
}
}
ç¬¬äžæ¥ïŒå®æœè®¡å
é¶æ®µäžïŒæ°æ®å±æå»ºïŒX倩ïŒ
任塿ž
åïŒ
å
³é®æä»¶ïŒ
- Entity.kt
- Dao.kt
- Repository.kt
éªæ¶æ åïŒ
- æ°æ®åºè¡šå建æå
- CRUDæäœæ£åžž
- åå
æµè¯éè¿
é¶æ®µäºïŒäžå¡å±å®ç°ïŒX倩ïŒ
任塿ž
åïŒ
å
³é®æä»¶ïŒ
éªæ¶æ åïŒ
- ç¶ææµèœ¬æ£ç¡®
- äžå¡é»èŸå®æŽ
- åŒåžžå€çå®å
é¶æ®µäžïŒUIå±åŒåïŒX倩ïŒ
任塿ž
åïŒ
å
³é®æä»¶ïŒ
- Activity.kt
- Screen.kt
- Component.kt
éªæ¶æ åïŒ
- UIæŸç€ºæ£ç¡®
- äº€äºæµç
- éé
åç§å±å¹å°ºå¯ž
é¶æ®µåïŒéæäžæµè¯ïŒX倩ïŒ
任塿ž
åïŒ
å
³é®æä»¶ïŒ
- å
¥å£æä»¶ä¿®æ¹
- æ§æä»¶å é€
éªæ¶æ åïŒ
- åèœå®æŽå¯çš
- æ ææŸæ§èœé®é¢
- æ ååœbug
第å
«æ¥ïŒæ°æ®è¿ç§»çç¥
8.1 æ§æ°æ®è¿ç§»
object DataMigration {
fun migrateOldData() {
val oldData = getOldData()
val newData = oldData.map {
NewEntity(
field1 = it.oldField1,
field2 = it.oldField2
)
}
appDb.entityDao().insert(*newData.toTypedArray())
clearOldData()
}
}
8.2 é»è®€æ°æ®å¯Œå
¥
fun importDefaultData() {
val defaultData = loadDefaultData()
appDb.entityDao().insert(*defaultData.toTypedArray())
}
ç¬¬ä¹æ¥ïŒé£é©äžåºå¯¹
| é£é© | 圱åçšåºŠ | åçæŠç | åºå¯¹æªæœ |
|---|
| é£é©1 | é«/äž/äœ | é«/äž/äœ | å
·äœæªæœ |
| é£é©2 | é«/äž/äœ | é«/äž/äœ | å
·äœæªæœ |
åžžè§é£é©ïŒ
-
æ°æ®åºçæ¬å²çª
- 圱åïŒé«
- åºå¯¹ïŒäœ¿çšfallbackToDestructiveMigrationFromïŒæäŸå®æŽè¿ç§»èæ¬
-
æ°æ®äž¢å€±
- 圱åïŒé«
- åºå¯¹ïŒå®ç°æ°æ®è¿ç§»å·¥å
·ïŒéŠæ¬¡å¯åšæ¶èªåšè¿ç§»
-
æ§èœé®é¢
- 圱åïŒäž
- åºå¯¹ïŒäœ¿çšFlowååºåŒæŽæ°ïŒé¿å
é¢ç¹æ¥è¯¢
-
å
Œå®¹æ§é®é¢
- 圱åïŒäž
- åºå¯¹ïŒå
åæµè¯åç§åºæ¯ïŒæäŸéçº§æ¹æ¡
ç¬¬åæ¥ïŒé¢æææ
10.1 åèœææ
â
æ žå¿åèœ
- åèœç¹1
- åèœç¹2
- åèœç¹3
â
æ§èœææ
- å¯åšæ¶éŽ < Xç§
- å
åå çš < XMB
- ååºæ¶éŽ < X毫ç§
10.2 ä»£ç ææ
- ð æ°å¢æä»¶ïŒX䞪
- ð ä¿®æ¹æä»¶ïŒX䞪
- â å 逿件ïŒX䞪
- ð 代ç è¡æ°é¢äŒ°ïŒçºŠXè¡
10.3 ææ¡£ææ
- åèœè¯Žæææ¡£
- æ¶æè®Ÿè®¡ææ¡£
- APIææ¡£
- äœ¿çšæå
第åäžæ¥ïŒåç»æ©å±æ¹å
11.1 çææ©å±ïŒ1-2åšïŒ
11.2 äžææ©å±ïŒ1-2æïŒ
11.3 é¿ææ©å±ïŒ3-6æïŒ
éªè¯æž
å
æ¶æéªè¯
ææ¯éªè¯
å®ç°éªè¯
æµè¯éªè¯
ææ¡£éªè¯
èŸåºæš¡æ¿
## ð [åèœåç§°] æ¶æè§å
### äžãæ¶æè®Ÿè®¡
#### 1.1 æŽäœæ¶æåŸ
[æ¶æåŸ]
#### 1.2 æš¡ååå
[æš¡å诎æ]
---
### äºãææ¯æ éæ©
#### 2.1 æ žå¿ææ¯
[ææ¯è¡šæ Œ]
#### 2.2 æ°å¢äŸèµ
[äŸèµå衚]
---
### äžãæ°æ®æš¡å讟计
#### 3.1 å®äœç±»
[å®äœç±»å®ä¹]
#### 3.2 æ°æ®è®¿é®å¯¹è±¡
[Daoå®ä¹]
---
### åãæä»¶ç»æè§å
#### 4.1 æ°å¢æä»¶
[æä»¶æ ]
#### 4.2 ä¿®æ¹æä»¶
[æä»¶å衚]
#### 4.3 å 逿件
[æä»¶å衚]
---
### äºãæ žå¿ä»£ç å®ç°èŠç¹
#### 5.1 ViewModel讟计
[代ç 瀺äŸ]
#### 5.2 Screen讟计
[代ç 瀺äŸ]
---
### å
ã宿œè®¡å
#### é¶æ®µäžïŒæ°æ®å±æå»ºïŒX倩ïŒ
[任塿ž
å]
#### é¶æ®µäºïŒäžå¡å±å®ç°ïŒX倩ïŒ
[任塿ž
å]
#### é¶æ®µäžïŒUIå±åŒåïŒX倩ïŒ
[任塿ž
å]
#### é¶æ®µåïŒéæäžæµè¯ïŒX倩ïŒ
[任塿ž
å]
---
### äžãæ°æ®è¿ç§»çç¥
#### 7.1 æ§æ°æ®è¿ç§»
[è¿ç§»ä»£ç ]
#### 7.2 é»è®€æ°æ®å¯Œå
¥
[富å
¥ä»£ç ]
---
### å
«ãé£é©äžåºå¯¹
| é£é© | 圱å | åºå¯¹æªæœ |
|------|------|----------|
| ... | ... | ... |
---
### ä¹ã颿ææ
#### 9.1 åèœææ
[åèœå衚]
#### 9.2 ä»£ç ææ
[ç»è®¡æ°æ®]
---
### åãåç»æ©å±æ¹å
#### 10.1 çææ©å±
[æ©å±è®¡å]
#### 10.2 äžææ©å±
[æ©å±è®¡å]
#### 10.3 é¿ææ©å±
[æ©å±è®¡å]
---
## ð æ»ç»
[æ»ç»è¯Žæ]
**é¢è®¡æ»åŒåæ¶éŽïŒX-Y倩**
泚æäºé¡¹
- å
åè°ç ïŒåšè§ååå¿
é¡»å
åè°ç ç°æä»£ç ïŒé¿å
éå€é 蜮å
- éµåŸªè§èïŒéµåŸªé¡¹ç®ç°æçæ¶æè§èåçŒç 飿 Œ
- æžè¿åŒåŒåïŒåé¶æ®µå®æœïŒæ¯äžªé¶æ®µéœèŠæå¯éªè¯çææ
- é£é©æè¯ïŒæåè¯å«é£é©ïŒåå€å¥œåºå¯¹æªæœ
- ææ¡£å
è¡ïŒå
讟计åçŒç ïŒææ¡£å代ç åæ¥æŽæ°
- 坿µè¯æ§ïŒè®Ÿè®¡æ¶èèæµè¯ïŒç¡®ä¿ä»£ç 坿µè¯
- æ§èœäŒå
ïŒå
³æ³šæ§èœææ ïŒé¿å
æ§èœç¶é¢
- çšæ·äœéªïŒä»çšæ·è§åºŠæèïŒæäŸè¯å¥œççšæ·äœéª
瀺äŸåè
åèå®é
æ¡äŸïŒçŽéŸäžäŒ é
眮åèœæ¶æè§å
该æ¡äŸå®æŽå±ç€ºäºïŒ
- ä»éæ±åæå°æ¶æè®Ÿè®¡ç宿޿µçš
- æ°æ®å±ãäžå¡å±ãUIå±ç诊ç»è§å
- ææ¯éååé£é©è¯äŒ°
- åé¶æ®µå®æœè®¡å
- æ°æ®è¿ç§»çç¥
- 颿ææååç»æ©å±
å¿«é䜿çš
åœçšæ·èŠæ±è§åæ°åèœæ¶ïŒæç
§ä»¥äžæ¥éª€å¿«éèŸåºïŒ
- ç¬¬äžæ¥ïŒè°ç ç°ç¶ïŒäœ¿çšæçޢ工å
·ïŒ
- ç¬¬äºæ¥ïŒè®Ÿè®¡æ¶æïŒç»å¶æ¶æåŸïŒ
- ç¬¬äžæ¥ïŒéæ©ææ¯ïŒè¯äŒ°ææ¯æ ïŒ
- ç¬¬åæ¥ïŒè®Ÿè®¡æ°æ®æš¡åïŒå®ä¹å®äœåDaoïŒ
- ç¬¬äºæ¥ïŒè§åæä»¶ç»æïŒååºæ°å¢/ä¿®æ¹/å 逿件ïŒ
- 第å
æ¥ïŒçŒåæ žå¿ä»£ç èŠç¹ïŒViewModelãScreençïŒ
- ç¬¬äžæ¥ïŒå¶å®å®æœè®¡åïŒåé¶æ®µä»»å¡ïŒ
- 第å
«æ¥ïŒè®Ÿè®¡è¿ç§»çç¥ïŒæ°æ®è¿ç§»æ¹æ¡ïŒ
- ç¬¬ä¹æ¥ïŒè¯äŒ°é£é©ïŒé£é©å衚ååºå¯¹ïŒ
- ç¬¬åæ¥ïŒå®ä¹é¢æææïŒåèœåä»£ç ææïŒ
- 第åäžæ¥ïŒè§åæ©å±æ¹åïŒçäžé¿æïŒ
èŸåºå®æŽçæ¶æè§åææ¡£ïŒäŸçšæ·ç¡®è®€ååŒå§å®æœã