Оба класса не очень идиоматичны.Первичный конструктор класса Kotlin является неявным и не требует определения, однако вы явно определяете конструктор и тем самым добавляете еще один пустой.
// good
class C
// bad
class C {
constructor()
}
Далее, Kotlin назвал аргументы с именамии значения по умолчанию, поэтому используйте их.
class Account(
val id: String = generateAccountNumber(),
val name: String = "Unknown User",
val balance: Double = 0.0
)
Double
- очень плохой выбор для всего, что связано с его недостатками, см., например, https://www.floating -point-gui.de/ Выбор Int
, Long
, черт возьми, даже BigDecimal
будет лучше.Также кажется, что вы не хотите, чтобы баланс когда-либо падал ниже нуля, в этом случае рассмотрите UInt
и ULong
.
И последнее, но не менее важное: изменчивость вашего класса.Это может иметь смысл, но это также может быть опасно.Это зависит от вас, чтобы решить ваши потребности и требования.
enum class Status {
CLOSED
}
@ExperimentalUnsignedTypes
class Account(private var _balance: UInt) {
val balance get() = _balance
operator fun plusAssign(other: UInt) {
_balance += other
}
}
@ExperimentalUnsignedTypes
class GiftCard(
val number: String,
val pin: String,
private var _status: Status,
private var _balance: UInt
) {
val status get() = _status
val balance get() = _balance
fun close() {
_status = Status.CLOSED
_balance = 0u
}
}
@ExperimentalUnsignedTypes
class Main(val accounts: List<Account>, val giftCards: List<GiftCard>) {
fun closeCard(cardNumber: String, pin: String) =
giftCards.find { it.number == cardNumber }?.let {
(it.pin == pin).andAlso {
accounts.forEach { a -> a += it.balance }
it.close()
}
}
}
inline fun Boolean.andAlso(action: () -> Unit): Boolean {
if (this) action()
return this
}
Мы изменяем тип возвращаемого значения с Pair<Boolean, Boolean>
на более идиоматический Boolean?
, где Null
означает, что мы не сделалинайдите что-нибудь (буквально истинное значение Null
), false
, что PIN-код не совпадает, и true
, что подарочная карта была закрыта.Мы больше не создаем пару и, таким образом, избегаем дополнительного выделения объекта.
Boolean.andAlso()
- это удобная функция расширения, которую я обычно держу под рукой, она как Any.also()
из STD Котлина, но выполняет только action
, если Boolean
на самом деле true
.