在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称(OpenSource Name):RedMadRobot/kotlin-style-guide开源软件地址(OpenSource Url):https://github.com/RedMadRobot/kotlin-style-guide开源编程语言(OpenSource Language):开源软件介绍(OpenSource Introduction):Kotlin Code StyleВ репозитории приведен набор соглашений по оформлению кода на языке Kotlin. Этот список правил расширяет предложенные Google и командой разработки Kotlin гайды и пересматривает в них некоторые неоднозначные моменты.
Длина строки
Правила именования
Форматирование выражений
val collectionItems = source.collectionItems
?.dropLast(10)
?.sortedBy { it.progress }
val throwableMessage: String = throwable?.message
?: DEFAULT_ERROR_MESSAGE
throwable.message?.let { showError(it) }
?: showError(DEFAULT_ERROR_MESSAGE)
// Good
throwable.message
?.let { message ->
...
showError(message)
}
?: showError(DEFAULT_ERROR_MESSAGE)
// Not recommended
throwable.message?.let { message ->
...
showError(message)
}
?: showError(DEFAULT_ERROR_MESSAGE)
private val promoItem: MarkPromoItem by lazy {
extractNotNull(BUNDLE_FEED_UNIT_KEY) as MarkPromoItem
} ФункцииФункции с одним выражением
Именованные аргументы
runOperation(
method = operation::run,
consumer,
errorHandler,
tag,
cacheSize = 3,
cacheMode
)
calculateSquare(x = 6, y = 19)
getCurrentUser(skipCache = false)
setProgressBarVisible(true)
editText.addTextChangedListener(
onTextChanged = { text, _, _, _ ->
viewModel.onTextChanged(text?.toString())
},
afterTextChanged = { text ->
viewModel.onAfterTextChanged(text?.toString())
}
)
val startDate: Date = ..
val endDate: Date = ..
compareDates(startDate = startDate, endDate = endDate)
setAdditionalArguments(arguments = null) Вызов переменной функционального типа
fun runAndCall(expression: () -> Unit): Result {
val result = run()
//Bad
expression()
//Good
expression.invoke()
return result
} Форматирование лямбда-выражений
viewPager.adapter = QuestAdapter(quest, onQuestClickListener = ::onQuestClicked)
viewPager.adapter = QuestAdapter(
quest,
onQuestClickListener = { quest ->
Log.d(..)
viewModel.onQuestClicked(quest)
}
)
Классы
class MyFavouriteVeryLongClassHolder : MyLongHolder<MyFavouriteVeryLongClass>(), SomeOtherInterface, AndAnotherOne,
OneMoreVeryLongInteface, OneMore{
fun foo() { /*...*/ }
}
Структура класса
Аннотации
@JsonValue
@JvmField
var promoItem: PromoItem? = null
data class UserInfo (
@SerializedName("firstName") val firstName: String? = null,
@SerializedName("secondName") val secondName: String? = null
)
@Entity(tableName = "users")
data class UserInfo (
@PrimaryKey val id: Int,
@SerializedName("firstName")
@ColumnInfo(name = "firstName")
val firstName: String? = null,
@SerializedName("secondName")
@ColumnInfo(name = "secondName")
val secondName: String? = null
) Использование условных операторов
return if (condition) foo() else bar()
when (feed.type) {
FeedType.PERSONAL -> startPersonalFeedScreen()
FeedType.SUM -> {
showSumLayout()
hideProgressBar()
}
FeedType.CARD -> startCardFeedScreen()
else -> showError()
} Template header
Частые ошибкиВызов toString() у nullable объектов
binding.authInputPassword.addTextChangeListener { editable: Editable? ->
// Bad
viewModel.onPasswordChanged(editable.toString())
// Good
viewModel.onPasswordChanged(editable?.toString().orEmpty())
} Использование orEmpty() вместо ?:
// Bad
nullableString ?: ""
nullableObject?.toString() ?: ""
someList ?: emptyList()
// Good
nullableString.orEmpty()
nullableObject?.toString().orEmpty()
someList.orEmpty() Проверка nullable boolean
// Bad
val b: Boolean? = ...
if (boolean ?: false) {
...
} else {
// `b` is false or null
}
// Good
val b: Boolean? = ...
if (b == true) {
...
} else {
// `b` is false or null
} |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论