-
Notifications
You must be signed in to change notification settings - Fork 1
๐ฆ์๋๋ก์ด๋ ์ปจ๋ฒค์ ๐ฆ
๊ฒฝ๋ก๋ ๊ผญ ์๋ฌธ์๋ก ์์ฑ๋์ด์ผ ํ๋ค.
์ธ๋ ๋ฐ๊ฐ ํฌํจ๋์ด์๋ ์๋๋ฉฐ, ํ์ํ ๊ฒฝ์ฐ camelCase๋ก ์์ฑํ๋ค.
// Do
com.wapp.app.food
// Don't
com.wapp.app.food_ingredient
// Do
com.wapp.app.foodIngredient
๋ทฐ๋ชจ๋ธ, ์ด๋ํฐ์ ํ๋กํผํฐ ๋ช ์ ํ๋ค์์ ์ฌ์ฉ
val addTaskViewModel: AddTaskViewModel by viewModels()
val addTaskAdapter = AddTaskAdapter()
- ํ๋กํผํฐ
- ์์ฑ์
- init
- onCreate
- onCreateView
- Function
- ์ถ์ํ ๋ ๋ฒจ์ ๋ง๊ฒ ๋์ ์์๋๋ก ๋ฐฐ์นํ๋ค.
- onDestroy
- companion object
else if ์ฌ์ฉ ๊ธ์ง -> when์ผ๋ก ๋ณํ else๋ ์ง์ ๊ณ ๋ ค
if (true) {
foo()
} else {
bar()
}
// else ์ง์
bar()
if (true) {
foo()
}
-> ์ฐธ์ด ์๋ ๊ฒ์ ๋จผ์ return์ผ๋ก ๋นผ๋ฒ๋ฆผ.
if (false){
//toDoElse
return
}
when
- ํ ์ค์ ๋ค์ด๊ฐ๋ when ๋ถ๊ธฐ๋ ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.
when (value) {
0 -> return
// ...
}
- ์ฌ๋ฌ๊ฐ์ ์กฐ๊ฑด์ ๋์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐย
>
๋ฅผ ํฌํจํ ๋ธ๋ก์ ๋ด๋ ค์ ์์ฑํ๋ค.
when (value) {
foo -> // ...
bar,
baz
-> return
}
- fetch: Read
- post : Write view(viewModel.fetchData) -> viewModel(repo.fetchData) -> repo(source.fetchData)
- add: list ์์ ๋ฃ์ ๋
- create: ์๋ก ์์ฑ
- get: any
- find: nullable any
- is, has: boolean
- show[Dialog]
- start[Activity]
- navigate[Fragment]
- show
- invalidate
๋๋ฌธ์ + SnakeCase๋ก ์์ฑํ๋ค.
์ฐธ๊ณ ๋ ํผ๋ฐ์ค
https://kotlinlang.org/docs/coding-conventions.html
https://developer.android.com/kotlin/style-guide?hl=ko
Data Layer์์ ํต์ ์ ์ํ ๋ชจ๋ธ์ธ ๊ฒฝ์ฐ, [๋ช ์ฌ] + Response๋ก ์์ฑํ๋ค.
class UserResponse { }
Data Layer์์ ๋ด๋ถ DB๋ฅผ ์ํ ๋ชจ๋ธ์ธ ๊ฒฝ์ฐ, [๋ช ์ฌ] + Entity๋ก ์์ฑํ๋ค.
class UserEntity { }
Domain Layer์์ ๋๋ฉ์ธ ๋ชจ๋ธ์ธ ๊ฒฝ์ฐ, [๋ช ์ฌ]๋ก ์์ฑํ๋ค.
class User { }
Presentation Layer์์ Ui๋ฅผ ์ํ ๋ชจ๋ธ์ธ ๊ฒฝ์ฐ, [๋ช ์ฌ] + Model๋ก ์์ฑํ๋ค.
class UserModel { }
Mapper Rule
์ถ๋ฐ์ง Model์์ Extension์ ํตํด ๊ตฌํํ๋ค.
์ด๋ฆ์ to + [๋์ฐฉ์ง ๊ณ์ธต]์ผ๋ก ๊ตฌ์ฑํ๋ค.
class UserResponse {
fun toDomain(): User = User(...)
}
UseCase Rule
UseCase๋ [๋ช ์ฌ] + UseCase๋ก ์์ฑํ๋ค.
UseCase ํด๋์ค๋ ๋จ ํ๋์ invoke UseCase ํจ์๋ฅผ ๊ฐ์ง๋ค.
UseCase๋ Functional Naming Rule์ ์ฌ์ฉํ๋, ํจ์์์ ํผ๋์ ํผํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ๋ฐ๋ฅธ๋ค.
- ๋ณต์ํ์ธ ๊ฒฝ์ฐ, s โ List๋ฅผ ์ฌ์ฉํ๋ค.
- ๊ธฐ๋ณธ ํ์:ย
[what]\\_[where]\\_[des]
ย ex) tv_addCalendar_titleHeader- ์น์ ์ ํ์คํ๊ฒ ๊ตฌ๋ถํ ์ ์๋ค.
- ์ธ๋๋ฐ๋ก ๊ตฌ๋ถ๋์ด ์ํ๋ ์ ๋ณด๋ฅผ ๊ณจ๋ผ ์ฝ๊ธฐ ํธํ๋ค.
- des๋ฅผ ์ฝ์ ๋์๋ ๊ตฌ๋ถํด์ ์ฝ์ ์ผ์ด ์๋ค.
- ๊ฐ ์ ์์ ๋ ๋จ์ด ์ด์์ด ํผ์ฉ๋ ๋๋ camel case๋ก ์์ฑ.
- ์นด๋ฉ ์ผ์ด์ค๋ก ๊ตฌ๋ถ๋์ง ์๋ ๋ทฐ(switch, toolbar, ...)๋ ํ ๋ค์์ ์ฌ์ฉ.
- ์ ๋์ฌ๋ simple style(textView -> tv)
tv | TextView |
---|---|
iv | ImageView |
cb | CheckBox |
rv | RecyclerView |
et | EditText |
nsv | NestedScrollView |
switch | Switch |
btn | Button |
-
item_<what>
: ๋ฆฌ์ฌ์ดํด๋ฌ ๋ทฐ ์์ดํ ๋ ์ด์์์ ์ฌ์ฉ -
view_<what>
: ์ปค์คํ ๋ทฐ ๋ ์ด์์์ ์ฌ์ฉ
<!--color ๋ฆฌ์์ค ์ ๋ฆฌ-->
<color name="light_gray">#E4E4E4</color>
<color name="gray">#8D8D8D</color>
<color name="gray_alpha_30">#30000000</color>
<!--์ ๋ณ์ wHeRe_wHAt. ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉ๋๋ค๋ฉด where ์๋ต ๊ฐ๋ฅ.-->
<color name="saveSchedule_titleText">@color/light_gray</color>
<color name="yearCalendarView_titleText">@color/gray</color>
<color name="close_background">@color/gray_alpha_30</color>
description์ ํ
๋ง ์์ฑ์ผ๋ก ๋ถ๋ฆฌ. ex)ย <item name="titleTextColor">@color/yellow_500</item>
ํจ์ ๋ค์ด๋ฐ : ๋ฐฑํฑ๊ณผ ๊ณต๋ฐฑ์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑํ๊ธฐ
utils ํจํค์ง๋ ์ต๋ํ ์ง์ํ๋ฉฐ, ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ๊ณณ์ด ๊ฐ์ ๋ ์ด์ด, ๋ค๋ฅธ ํด๋์ค ์ธ ๊ฐ ์ด์์ผ๋, ํด๋น ๋ ์ด์ด์์ ๊ตฌ์ฑํ๋ค.
- 1์ค์ 100์๋ฅผ ๋์ง ์๋๋ก ์์ฑํ๋ค.
- ์ฝ๋๊ฐ์ ๊ฐ๊ฒฉ์ 2์ค์ด์ ๊ฐ๊ฒฉ์ด ๋ฐ์ํ์ง ์๋๋ก ํ๋ค.(์ต๋ 1์ค ์ค๋ฐ๊ฟ)
- ํ๋ผ๋ฏธํฐ ๊ฐ์์ ์๊ด์์ด 100์ ์ด์์ด๋ฉด ๊ฐํํ๋ค.
Parameter
- ํ๋ผ๋ฏธํฐ๊ฐ 2๊ฐ ์ด์์ด๋ฉด ์ด๋ฆ์ ๋ช ์ํ๋ค.
- ์ค๋ฐ๊ฟ์ด ํ์ํ๋ฉด ๋ชจ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค๋ฐ๊ฟํ๋ค.
Method chain
- Builder๋ฑ ์ฌ๋ฌ ํจ์๋ฅผ chaining์ผ๋ก ์ฌ์ฉํ๋ฉด์ ์ค๋ฐ๊ฟ์ด ํ์ํ ๊ฒฝ์ฐ,ย
.
์ ์ ์ค๋ฐ๊ฟํ๋ค.
ImageLoader.load(user.getProfileUrl())
.placeholder(R.drawable.img_user_placeholder)
.fitCenter()
.into(binding.ivUser)
์ฐธ๊ณ ๋ ํผ๋ฐ์ค