Skip to content

Rationales

Hendra Anggrian edited this page Nov 10, 2024 · 10 revisions

Confusing identifier

When declaring string and primitive variables, it is tempting to use simple names based on their type. In fact, they are usually recommendations given by the IDE. But these names are not descriptive and hard to understand what their purpose is.

val string = "Alice"

val int = 30

Distracting method

Built-in methods like toString, hashCode and equals are often placed at the end of the class. They are unrelated to the rest of the class and can be distracting when reading the source code.

class User(val firstName: String, val lastName: String) {
    var isAdmin: Boolean = false

    override fun toString(): String = "$lastName, $firstName"

    override fun hashCode(): Int = Objects.hash(firstName, lastName)

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (other !is Robot) return false
        return firstName == other.firstName && lastName == other.lastName
    }

    fun promote() {
        isAdmin = true
    }
}

Unnecessary branches

when statement are useful to replace if-else statements when there are multiple branches. In a single branch, it is recommended to use an if statement.

when {
    list.isEmpty() -> println("No items")
}

Unnecessary comment lines

Comment and block comment bodies should not have leading or trailing blank lines. No consecutive blank lines are allowed in the comment body.

/**
 *
 * The main function.
 *
 */
fun main() {
    // initialize the logger
    //
    //
    // and print the starting message
    val logger = Logger()
    logger.info("Starting the application")
}

Trailing elvis

In a multiline statement, the elvis operator should align with chained method calls instead of the same column.

val bananas =
    fruits
        .filter { it.type == BANANA }
        .takeUnless { it.isEmpty() } ?: return

Rules

Rationales

Clone this wiki locally