-
λ³μ/ν¨μλ₯Ό μ μΈν κ²½μ° μ΅κ΄μ μΌλ‘ private λ₯Ό λΆμ¬ μ μΈνκ³ μ΄ν μΈλΆμμ νμ μ public μΌλ‘ μ ννλ€.
-
ν΄λμ€μ κ²½μ° κΈ°λ³Έμ μΌλ‘ internal μ λΆμ¬ μ μΈνλ€.
-
μμ²λΌ ν κ²½μ° μμ μ΄ μ§ μ½λμ λ³μμ private κ° μμΌλ©΄ λ€λ₯Έ κ°λ°μκ° μμ μ μ½λλ₯Ό λ³Ό λ ν΄λΉ λ³μλ λ€λ₯Έ κ³³μμ μ°Έμ‘°λκ³ μλ€λ κ²μ μμ°μ€λ½κ² μ μ μκ² λλ€.
- μ½νλ¦°μμ κΈ°λ³Έ ν΄λμ€κ° μμμ΄ μλκ³ μμμ΄ λκ²νλ €λ©΄ open μ λΆμ΄λλ‘νλ κ²μ μ π νμμ μ² νκ³Ό λΉμ·νλ€.
π°
val badVarible = 0
class BadClass
π
private val goodVariable = 0
internal class GoodClass- κΈ°λ³Έμ μΌλ‘ Camel case λ₯Ό μ¬μ©νλ€.
- νμ§λ§ μλμ κ°μ μμΈλ μλ€.
- ν μ€νΈ μ½λμ μ€μ ν μ€νΈ ν¨μλͺ μ snake case λ‘ μ¬μ©νλ€.
ν μ€νΈ μ½λλ νκΈλ‘ μμ±ν κΉ κ³ λ € μ€..fun this_function_return_true() { ... }
- ν
μ€νΈ μ½λ μ€ setUp κ³Ό tearDown ν¨μλ Camel case λ₯Ό μ¬μ©νλ€.
@Before fun setUp() { ... } @After fun tearDown() { ... }
π°
companion object {
private const val badConstVariable = 1
}
π
companion object {
private const val GOOD_CONST_VARIABLE = 1
}
- μμ±μμ arguments κ° λ§μμ Έ μ½λκ° κΈΈμ΄μ§ κ²½μ° κ°λ
μ±μ λμ΄κΈ° μν΄ μλλ₯Ό μ°Έμ‘°ν΄ μ½λλΌμΈμ μ λ ¬μ λ§μΆλ€.
- μμΈ) μμ±μκ° μμ arguments κ° 1-3 κ°μΌ κ²½μ° κ·Έλ¦¬κ³ κ·Έλ κ² κΈΈμ§ μμ κ²½μ°λ ν μ€λ‘ μ¨λ 무방νλ€.
- μμΈ) μΌλ°ν¨μ νΉμ μ½νλ¦° secondary μμ±μμμλ λ무 κΈΈμ§ μμ μ΄μ μ¬λ§ν΄μ ν μ€λ‘ μ°λλ‘ νλ€.
π°
internal class BadLineUpConstructor constructor(private val resource: Resources, private val weakContext: WeakReference<Context>, private val repository: RepositoryApi, private val remoteAction: RemoteActionApi) : ParentClass {
...
}
π
internal class GoodLineUpConstructor constructor(
private val resource: Resources,
private val weakContext: WeakReference<Context>,
private val repository: RepositoryApi,
private val remoteAction: RemoteActionApi
) : ParentClass {
...
}- λ
Όλ¦¬μ μΌλ‘ μ μ¬ν μμ
μ νλ μ½λλΌμΈλ€μ λΆμ¬μ μμ±ν κ²½μ° μλλ₯Ό μ°Έμ‘°ν΄ μ½λλΌμΈμ μ λ ¬μ λ§μΆλ€.
- μμΈ) λΌμΈμ¬μ΄μ 곡백λΌμΈμ΄ μμ κ²½μ° tllu νμ§ μλλ€. μ¦, tllu νκΈ° μ«λ€λ©΄ λΌμΈμ¬μ΄μ 곡백μ λ£λλ€.
π°
//case 1
private val badLineUp = PublishRelay<Int>.create()
private val badLineUpSecondRelay = PublishRelay<Int>.create()
private val badLineUpThirdRelay = PublishRelay<Int>.create()
//case 2
private val alsoBadLineUp = PublishRelay<Int>.create()
private val alsoBadLineUpSecondRelay = PublishRelay<Int>.create()
private val alsoBadLineUpThirdRelay = PublishRelay<Int>.create()
π
//case 1
private val goodLineUp = PublishRelay<Int>.create()
private val goodLineUpSecondRelay = PublishRelay<Int>.create()
private val goodLineUpThirdRelay = PublishRelay<Int>.create()
//case2
private val alsoGoodLineUp = PublishRelay<Int>.create()
private val alsoGoodLineUpSecondRelay = PublishRelay<Int>.create()
private val alsoGoodLineUpThirdRelay = PublishRelay<Int>.create()- kotlin ν¨μ μ½μμ hint λ μλλ₯Ό μ°Έμ‘°ν΄ μ λ ¬μ λ§μΆλ€.
π°
loginRepository.requestLogin(
id = id,
password = password,
token = token
)
π
loginRepository.requestLogin(
id = id,
password = password,
token = token
)β λͺ¨λ μ»΄ν¬λνΈ μ¬μ΄μ 곡백μ νμΉΈμ μ¬μ©νλ€. λμΉΈ μ΄μ μ¬μ©νμ§ μλλ€.
π°
private val someVariable = 0
/** μ΄κ³³μ 곡백λΌμΈμ΄ λμΉΈμ΄λ©΄ */
/** μλλ€. */
private fun someFunction1() {
...
}
/** μ΄κ³³μ 곡백λΌμΈμ΄ λμΉΈμ΄λ©΄ */
/** μλλ€. */
private fun someFunction2() {
...
}
π
private val someVariable = 0
/** νμΉΈμ 곡백λΌμΈλ§ !*/
private fun someFunction1() {
...
}
/** νμΉΈμ 곡백λΌμΈλ§ !*/
private fun someFunction2() {
...
}- μλμ κ°μ κ²½μ°μλ§ μ½λ©νΈλ₯Ό μμ±νλ©° μ½λ©νΈλ
//κ° μλ/** ... */λ₯Ό μ¬μ©νλ€.- μ½λκ° νλ μμ μ΄ λ³μλͺ μ΄λ λ©μλλͺ λ§μΌλ‘λ κ·Έ μλ―Έλ₯Ό μ λ¬νκΈ° λ§€μ° νλ€ κ²½μ°.
- λΆκ°νΌνκ² λ§€μ§μμλ₯Ό μ¬μ©νκ² λμ΄ κ·Έ μμμ μλ―Έλ₯Ό μ λ¬ν νμκ° μμ λ.
- μ½λλ§μΌλ‘λ μ€λͺ ν μ μλ History κ° μμ κ²½μ°. (ex: μ΄ μ½λλ ~μ΄μ λλ¬Έμ μ΄λ κ² μ§°κ³ ~ν΄μ μλνλ€)
- μΌλ°μ μ΄μ§μμ λ°μ΄ν° μ²λ¦¬μ κ²½μ°. (ex: μ΄ λ°μ΄ν°λ ~νκ² μ€κΈ° λλ¬Έμ ~ν΄μ μ²λ¦¬ν΄μΌνλ€)
- μ) onMeaureμ parameterλ€μ μ¬λ¬ μ λ³΄κ° bitwise λΌ λ΄κ²¨μ€κΈ° λλ¬Έμ View.MesureSpec λ‘ unpack ν΄μ μ¬μ©ν΄μΌνλ€.
π° // Bad Comment
π /** Good Comment */π° private val badFloat = 1f
π private val goodFloat = 1Fπ° private val badNumber = 111111
π private val goodNumber = 1_111_111π°
if(condition)
Log.d(TAG, "bad!")
else
Log.d(TAG, "also bad!")
π
if(condition) {
Log.d(TAG, "GOOD!") }
else {
Log.d(TAG, "also GOOD!")
}- if, switch, when, for λ¬Έλ±μ κ°λ‘λ‘ ν μ€λ‘ μ°κΈ°λ³΄λ€λ μΈλ‘λ‘ μμ±νλ€.
- μμΈ)
- rx operator μμμλ λ΄λΆ λ‘μ§μ΄ ν μ€λ‘ μμ±μ΄ κ°λ₯ν κ²½μ° νμ€λ‘ μμ±νλ€.
- lamda/closure μμλ λ΄λΆ λ‘μ§μ΄ ν μ€λ‘ μμ±μ΄ κ°λ₯ν κ²½μ° νμ€λ‘ μμ± κ°λ₯νλ€.(λμ€λ κ°λ₯)
π°
if(condition) { Log.d(TAG, "bad!") }
private val badOpeartorStyle = Observable.just(1, 2, 3)
.filter {
it == 1
}
.map {
it + SOME_VALUE
}
π
if(condition) {
Log.d(TAG, "GOOD!")
} else {
Log.d(TAG, "also GOOD!")
}
private val goodOperatorStyle = Observable.just(1, 2, 3)
.filter { it == 1 }
.map { it + SOME_VALUE }
good_lamda.setOnClickListener { doSomething() }
also_good_lamda.setOnClickListener {
doSomething()
}π°
@Provides @PerActivity
fun badAnnotating(): String { ... }
π
@Provides
@PerActivity
fun goodAnnotating(): String { ... }β νλ μ΄λ Έν μ΄μ μ λ무 κΈΈμ΄μ§μ§ μλ μ΄μ κΈ°λ³Έμ μΌλ‘ κ°λ‘λ‘ μμ±νλ€.
π°
@Inject
@field:Bad
lateinit var badAnnotating: String
π
@Inject @field:Good lateinit var goodAnnotating: Stringπ°
badBuilder.setInt(1)
.build()
badBuilder.setInt(1).setBoolean(false).build()
π
goodBuilder.setInt(1).build()
goodBuilder
.setInt(1)
.setBoolean(false)
.build()π°
private val usr = User() /** bad variable */
private val std = Student() /** bad variable */
private val probIndex = 0 /** bad variable */
π
private val user = User() /** good variable */
private val student = Student() /** good variable */
private val problemIndex = 0 /** good variable */β λ³μλͺ μ κ·Έ λ³μκ° μ΄λ€ μλ―Έλ₯Ό κ°λμ§ μ μ μλλ‘ μΆ©λΆν κΈΈκ² μ§λλ€.
- λ³μμ μλ―Έμ λ¬ λλ¬Έμ λ무 κΈΈμ΄μ§ κ²½μ°λ μ λΉν μ μμ μμ±νλ€. 3~30 μ λ΄μΈ
- flag λΌλ μ΄λ¦μ λ³μλͺ μ μ λ μ¬μ©νμ§ μλλ€.
π°
private val index = 0 /** bad naming */
private val isCorrect = false /** bad naming */
private val isLoginDataAndNewUpdateCheckDataAndNextDataFetched = false /** bad naming */
private val flag = false /** bad naming */
π
private val mainProblemIndex = 0 /** good naming */
private val isMainProblemCorrect = false /** good naming */
private val isAllDatasFetched = false /** good naming */β λ§€μ§{λλ²|μ€νΈλ§|...}(μ)λ μ¬μ©νμ§ μλλ€. μμλ‘ μλ―Έλ₯Ό μ μν΄μ μ΄λ€.
π°
if(currentProblemNumber == 10) { /** bad magic number */
completeLesson()
navigateToResult()
}
if(problemType == "N") { /** bad magic string */
hideHintTip()
}
π
companion object {
private const val MAX_PROBLEM_NUMBER = 10
private const val NORMAL_PROBLEM_TYPE_PROVIDED_BY_SERVER = "N"
}
if(currentProblemNumber == MAX_PROBLEM_NUMBER) { /** good */
completeLesson()
navigateToResult()
}
if(problemType == NORMAL_PROBLEM_TYPE_PROVIDED_BY_SERVER) { /** good */
hideHintTip()
}β 0λΆν° μμνλ λ³μλ index λΌλ λ³μλͺ μ μ¬μ©νκ³ 1λΆν° μμνλ λ³μλ order/number/sequence λΌλ λ³μλͺ μ μ¬μ©νλ€.
π°
if(badIfCondition && badIfCondition1 && badIfCondigion2) {
...
}
π
if(goodIfCondition &&
goodIfCondition1 &&
goodIfCondition2) {
...
}β {outer|inner|nested|sealed}ν΄λμ€/μΈν°νμ΄μ€μ μμκ³Ό λ 곡백λΌμΈ μ²¨κ° μ¬λΆλ μλ λ£°μ λ°λ₯Έλ€.
- μ΅μμ outer ν΄λμ€λ§ ν΄λμ€μ μμκ³Ό λμ 곡백μ λ£κ³ λλ¨Έμ§λ 곡백μ λ£μ§ μλλ€.
π°
internal class BadOuterClass {
private val context: Context? = null /** μ λΌμΈμ 곡백λΌμΈμ΄ μμ΄μΌν¨ */
class BadNestedClass {
private val myVarialble: Int = 0 /** μ μλ 곡백λΌμΈμ΄ μμ΄μΌ ν¨ */
}
} /** μ λΌμΈμ 곡백λΌμΈμ΄ μμ΄μΌν¨ */
internal interface BadInterface {
fun doSomething() /** μ μλ 곡백λΌμΈμ΄ μμ΄μΌ ν¨ */
}
π
internal class GoodOuterClass { /** outer ν΄λμ€μ΄λ―λ‘ μμκ³Ό λμ 곡백λΌμΈμ΄ μμ */
private val context: Context? = null
class GoodNestedClass { /** nested ν΄λμ€μ΄λ―λ‘ μμκ³Ό λμ 곡백λΌμΈμ΄ μμ */
private val myVarialble: Int = 0
}
}
internal interface GoodInterface { /** interface μ΄λ―λ‘ μμκ³Ό λμ 곡백λΌμΈμ΄ μμ */
fun doSomething()
}
internal sealed class GoodSealedClass { /** sealed class μ΄λ―λ‘ μμκ³Ό λμ 곡백λΌμΈμ΄ μμ */
class Class1( /** nested class μ΄λ―λ‘ μμκ³Ό λμ 곡백λΌμΈμ΄ μμ */
val variable: Int,
val variable1: Int,
val variable2: Int,
) : GoodSealedClass()
class Class2(val variable: Int) : GoodSealedClass()
}π°
private fun badFunction() {
/** λΆνμν 곡백λΌμΈ! */
doSomething()
/** λΆνμν 곡백λΌμΈ! */
}
private fun alsoBadFunction() {
/** λΆνμν 곡백λΌμΈ! */
doSomething()
}
private fun alsoAlsoBadFunction() {
doSomething()
/** λΆνμν 곡백λΌμΈ! */
}
bad_lamda.setOnClickListener {
/** λΆνμν 곡백λΌμΈ! */
doSomething()
doNextThing()
/** λΆνμν 곡백λΌμΈ! */
}
π
private fun goodFunction() {
doSomething()
doNextThing()
}
good_lamda.setOnClickListener {
doSomething()
doNextThing()
}