169 похожих чатов

Привет! Как можно лучше оптимизировать этот код? Ship - это абстрактный

класс, у которого есть наследники LightWeightShip, MediumShip, HeavyShip. В настоящее время я проверяю тип объекта с использованием when + is, но есть довольно много повторяющегося кода.

private fun convertShipToShipData(
ships: List<Ship>,
outputShipData: MutableList<ShipDTO>
) {
ships.forEach { ship ->
val containersAsString = ship.getCurrentContainers().map { it.toString() }

when (ship) {
is LightWeightShip -> {
outputShipData.add(
ShipDTO(
id = ship.id,
fuel = ship.fuel,
portId = ship.currentPort.id,
totalWeightCapacity = ship.totalWeightCapacity,
maxNumberOfAllContainers = ship.maxNumberOfAllContainers,
maxNumberOfBasicContainers = ship.maxNumberOfBasicContainers,
maxNumberOfHeavyContainers = ship.maxNumberOfHeavyContainers,
maxNumberOfRefrigeratedContainers = ship.maxNumberOfRefrigeratedContainers,
maxNumberOfLiquidContainers = ship.maxNumberOfLiquidContainers,
fuelConsumptionPerKM = ship.fuelConsumptionPerKM,
containers = containersAsString
)
)
}
is MediumShip -> {
outputShipData.add(
ShipDTO(
id = ship.id,
fuel = ship.fuel,
portId = ship.currentPort.id,
totalWeightCapacity = ship.totalWeightCapacity,
maxNumberOfAllContainers = ship.maxNumberOfAllContainers,
maxNumberOfBasicContainers = ship.maxNumberOfBasicContainers,
maxNumberOfHeavyContainers = ship.maxNumberOfHeavyContainers,
maxNumberOfRefrigeratedContainers = ship.maxNumberOfRefrigeratedContainers,
maxNumberOfLiquidContainers = ship.maxNumberOfLiquidContainers,
fuelConsumptionPerKM = ship.fuelConsumptionPerKM,
containers = containersAsString
)
)
}
is HeavyShip -> {
outputShipData.add(
ShipDTO(
id = ship.id,
fuel = ship.fuel,
portId = ship.currentPort.id,
totalWeightCapacity = ship.totalWeightCapacity,
maxNumberOfAllContainers = ship.maxNumberOfAllContainers,
maxNumberOfBasicContainers = ship.maxNumberOfBasicContainers,
maxNumberOfHeavyContainers = ship.maxNumberOfHeavyContainers,
maxNumberOfRefrigeratedContainers = ship.maxNumberOfRefrigeratedContainers,
maxNumberOfLiquidContainers = ship.maxNumberOfLiquidContainers,
fuelConsumptionPerKM = ship.fuelConsumptionPerKM,
containers = containersAsString
)
)
}
}
}
}

4 ответов

126 просмотров

а какой смысл проверять, если поля одинаковые?

𝙽𝚒𝚌𝚔- Автор вопроса
Mike (деньги не клянчу)
а какой смысл проверять, если поля одинаковые?

Одинаковые, но классы наследники имплементируют от класса только функции, а не проперти, поэтому здесь нужен каст

Похожие вопросы

Обсуждают сегодня

https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Ребят в СИ можно реализовать ООП?
Николай
33
Доброго вечера. Поскажите, как изменить код number_fomat, что цена была без копеек. <?php if(!empty($value)) { $parts = explode('.',$value); echo number_format ($part...
Katerina Beliayeva
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
core\config\database\connections\default.php На всякий случай проверь всё же файл <?php return [ 'driver' => env('DB_TYPE', 'mysql'), //$database_type 'host' => env('D...
Andrey K
2
Всем доброго вечера. Разрабатываю 32 раз. приложение в Delphi. Столкнулся с тем, что стандартный  TFilestream  не работает с большим файлом > 2 ГБайт (после вызова функции see...
Vadim Gl
16
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
добрый день. Подскажите, есть сайт на 1.4.7 и я хочу обновиться, особо ничего не меняя. мне выбирать версию 1.4.35 или третью ветку? и можно ли обновлять "как есть", или нужно...
Digital Cat
12
народ, плиз хелп, всю голову сломал себе уже... разве может быть так, что GetProcAddress( GetModuleHandle( "kernel32.dll" ), "SetThreadDescription" ) вернёт ненулевое значение...
Iluha Companets
12
Карта сайта