Skip to content

Android-Developer-Basic/Kotlin-5 homework #39

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/main/kotlin/ru/otus/cars/Car.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ package ru.otus.cars
* Машина целиком
*/
interface Car : CarInput {

var tankMouth: TankMouth

/**
* Номерной знак
*/
Expand All @@ -28,4 +31,6 @@ interface Car : CarInput {
* Внутренний статический класс - номерой знак
*/
data class Plates(val number: String, val region: Int)


}
1 change: 1 addition & 0 deletions src/main/kotlin/ru/otus/cars/CarFactory.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ interface CarFactory {
* Автозавод в Тольятти (он у нас один такой)
*/
object Togliatti : CarFactory {

private fun buildVaz2107(plates: Car.Plates): Car {
println("Запил ${Vaz2107.MODEL} в Тольятти...")
val vaz = Vaz2107.build(plates)
Expand Down
2 changes: 2 additions & 0 deletions src/main/kotlin/ru/otus/cars/CarOutput.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,6 @@ interface CarOutput {
* Скажи текущую скорость
*/
fun getCurrentSpeed(): Int

fun getFuelContents(): String
}
38 changes: 38 additions & 0 deletions src/main/kotlin/ru/otus/cars/GasStation.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package ru.otus.cars

class GasStation {

fun addFuel(car: Car, liters: Int) {

safeStation {
val typeOfFuel = car.tankMouth.mouthType

when (typeOfFuel) {
"PetrolMouth"->petrolRefuelingColumn(car, liters)
"LpgMouth"->lpgRefuelingColumn(car, liters)

else-> {
throw IllegalArgumentException("wrong type of fuel")
}
}
}
}

private inline fun safeStation(block: ()->Unit) {
try {
block()
} catch (e: Exception) {
println("blow on gas station")
}
}

private fun petrolRefuelingColumn(car: Car, liters: Int) {
car.tankMouth.open(liters)
car.tankMouth.close()
}

private fun lpgRefuelingColumn(car: Car, liters: Int) {
car.tankMouth.open(liters)
car.tankMouth.close()
}
}
13 changes: 13 additions & 0 deletions src/main/kotlin/ru/otus/cars/Tank.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package ru.otus.cars

interface Tank {
var amountFuel: Int

fun getContents(): String {
return amountFuel.toString()
}

fun receiveFuel(liters: Int) {
amountFuel += liters
}
}
27 changes: 27 additions & 0 deletions src/main/kotlin/ru/otus/cars/TankMouth.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package ru.otus.cars

abstract class TankMouth : Tank {
abstract var mouthType: String
private var mouthIsOpen = false

class PetrolMouth : TankMouth() {
override var mouthType: String = "PetrolMouth";
override var amountFuel: Int = 0
}

class LpgMouth : TankMouth() {
override var mouthType: String = "LpgMouth"
override var amountFuel: Int = 0
}

fun open(liters: Int) {
mouthIsOpen = true
this.receiveFuel(liters = liters)
}

fun close() {
mouthIsOpen = false
}
}


6 changes: 5 additions & 1 deletion src/main/kotlin/ru/otus/cars/Taz.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package ru.otus.cars

object Taz: Car {
object Taz : Car {
override var tankMouth: TankMouth
get() = throw IllegalArgumentException("blow")
set(value) {}

/**
* Номерной знак
*/
Expand Down
19 changes: 17 additions & 2 deletions src/main/kotlin/ru/otus/cars/Vaz2107.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package ru.otus.cars

import ru.otus.cars.Vaz2107.Companion.build
import kotlin.random.Random

/**
Expand All @@ -12,16 +13,18 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) {
companion object : CarBuilder {
private fun getRandomEngine(): VazEngine {
return when (Random.nextInt(0, 2)) {
0 -> VazEngine.LADA_2107(1300)
else -> VazEngine.LADA_2107(1600)
0->VazEngine.LADA_2107(1300)
else->VazEngine.LADA_2107(1600)
}
}

override fun build(plates: Car.Plates): Vaz2107 = Vaz2107("Зеленый").apply {
this.engine = getRandomEngine()
this.plates = plates
this.tankMouth = TankMouth.LpgMouth()
}


/**
* Проверь, ездит или нет
*/
Expand All @@ -40,6 +43,7 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) {
override lateinit var engine: VazEngine
private set


/**
* Семерка едет так
*/
Expand All @@ -57,6 +61,13 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) {
override lateinit var plates: Car.Plates
private set

/**
* Доступно сборщику
* @see [build]
*/
override lateinit var tankMouth: TankMouth


// Выводим состояние машины
override fun toString(): String {
return "Vaz2107(plates=$plates, wheelAngle=$wheelAngle, currentSpeed=$currentSpeed)"
Expand All @@ -74,5 +85,9 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) {
override fun getCurrentSpeed(): Int {
return [email protected]
}

override fun getFuelContents(): String {
return tankMouth.getContents()
}
}
}
21 changes: 17 additions & 4 deletions src/main/kotlin/ru/otus/cars/Vaz2108.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package ru.otus.cars

import ru.otus.cars.Vaz2108.Companion.build
import kotlin.random.Random

/**
Expand All @@ -12,15 +13,16 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) {
companion object : CarBuilder {
private fun getRandomEngine(): VazEngine {
return when (Random.nextInt(0, 3)) {
0 -> VazEngine.SAMARA_2108(1100)
1 -> VazEngine.SAMARA_2108(1300)
else -> VazEngine.SAMARA_2108(1500)
0->VazEngine.SAMARA_2108(1100)
1->VazEngine.SAMARA_2108(1300)
else->VazEngine.SAMARA_2108(1500)
}
}

override fun build(plates: Car.Plates): Vaz2108 = Vaz2108("Красный").apply {
this.engine = getRandomEngine()
this.plates = plates
this.tankMouth = TankMouth.PetrolMouth()
}

fun alignWheels(vaz2108: Vaz2108) {
Expand Down Expand Up @@ -61,6 +63,12 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) {
override lateinit var plates: Car.Plates
private set

/**
* Доступно сборщику
* @see [build]
*/
override lateinit var tankMouth: TankMouth

// Выводим состояние машины
override fun toString(): String {
return "Vaz2108(plates=$plates, wheelAngle=$wheelAngle, currentSpeed=$currentSpeed)"
Expand All @@ -78,5 +86,10 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) {
override fun getCurrentSpeed(): Int {
return [email protected]
}

override fun getFuelContents(): String {
return tankMouth.getContents()
}

}
}
}
11 changes: 9 additions & 2 deletions src/main/kotlin/ru/otus/cars/VazPlatform.kt
Original file line number Diff line number Diff line change
@@ -1,19 +1,26 @@
package ru.otus.cars

abstract class VazPlatform(override val color: String) : Car {

// Положение руля. Доступно только внутри класса и наследникам
protected var wheelAngle: Int = 0 // Положение руля

// Реализация интерфейса CarInput
override fun wheelToRight(degrees: Int) { wheelAngle += degrees }
override fun wheelToRight(degrees: Int) {
wheelAngle += degrees
}

// Реализация интерфейса CarInput
override fun wheelToLeft(degrees: Int) { wheelAngle -= degrees }
override fun wheelToLeft(degrees: Int) {
wheelAngle -= degrees
}

// Получить оборудование
override fun getEquipment(): String = "Кузов, колеса, движок"

// Абстрактное свойство двигателя
abstract val engine: VazEngine

}

// Перечисление двигателей ВАЗ
Expand Down
70 changes: 49 additions & 21 deletions src/main/kotlin/ru/otus/cars/main.kt
Original file line number Diff line number Diff line change
@@ -1,21 +1,51 @@
package ru.otus.cars

fun main() {
println("\n===> drive cars...")
driveCars()
println("\n===> inner test...")
innerNestedCheck()
println("\n===> garage make...")
garageMake()
println("\n===> model special...")
println("\n===> get equipment...")
getEquipment()
println("\n===> get color...")
getColor()
println("\n===> tech checks...")
techChecks()
println("\n===> Taz...")
println(Taz.color)
// println("\n===> drive cars...")
// driveCars()
// println("\n===> inner test...")
// innerNestedCheck()
// println("\n===> garage make...")
// garageMake()
// println("\n===> model special...")
// println("\n===> get equipment...")
// getEquipment()
// println("\n===> get color...")
// getColor()
// println("\n===> tech checks...")
// techChecks()
// println("\n===> Taz...")
// println(Taz.color)

val vaz2107 = Togliatti.buildCar(Vaz2107, Car.Plates("123", 77))
val vaz2108 = Togliatti.buildCar(Vaz2108, Car.Plates("125", 78))
val vaz2108V122 = Togliatti.buildCar(Vaz2108, Car.Plates("122", 78))

val cars = mapOf(
vaz2107 to 5, vaz2108 to 7, vaz2108V122 to 9, Taz to 8
)

val gasStation = GasStation()

cars.forEach() {
if (it.key == Taz) {
println("Taz 0")
} else {
println("car goes to gas station ${it.key.plates} has fuel ${it.key.carOutput.getFuelContents()}")
}
}

cars.forEach() {
gasStation.addFuel(it.key, it.value)
}

cars.forEach() {
if (it.key == Taz) {
println("Taz 0")
} else {
println("car after gas station ${it.key.plates} has fuel ${it.key.carOutput.getFuelContents()}")
}
}
}

fun driveCars() {
Expand Down Expand Up @@ -54,8 +84,7 @@ fun garageMake() {

fun getEquipment() {
val cars = listOf(
Vaz2107.build(Car.Plates("123", 77)),
Vaz2108.build(Car.Plates("321", 78))
Vaz2107.build(Car.Plates("123", 77)), Vaz2108.build(Car.Plates("321", 78))
)

cars.forEach { car ->
Expand All @@ -65,8 +94,7 @@ fun getEquipment() {

fun getColor() {
val cars = listOf(
Vaz2107.build(Car.Plates("123", 77)),
Vaz2108.build(Car.Plates("321", 78))
Vaz2107.build(Car.Plates("123", 77)), Vaz2108.build(Car.Plates("321", 78))
)

cars.forEach { car ->
Expand All @@ -87,7 +115,7 @@ fun repairEngine(car: VazPlatform) {
// В зависимости от типа двигателя выполняем разные действия
// when обеспечивает обход всех вариантов перечисления
when (car.engine) {
is VazEngine.LADA_2107 -> println("Чистка карбюратора у двигателя объемом ${car.engine.volume} куб.см у машины $car")
is VazEngine.SAMARA_2108 -> println("Угол зажигания у двигателя объемом ${car.engine.volume} куб.см у машины $car")
is VazEngine.LADA_2107->println("Чистка карбюратора у двигателя объемом ${car.engine.volume} куб.см у машины $car")
is VazEngine.SAMARA_2108->println("Угол зажигания у двигателя объемом ${car.engine.volume} куб.см у машины $car")
}
}