CodeBlanks Logo Icon CodeBlanks

Birleştirme

Menü döngüsüyle çalışan bir CLI uygulaması yazarsın.

Birleştirme: tam CLI senaryosu

Artık tüm parçalar hazır: Task veri sınıfı, TodoList ile addTask, listTasks ve completeTask. Bu son derste bunları bir senaryo halinde birleştireceksin.

val list = TodoList()
list.addTask("Alışveriş")
list.addTask("Ödev")
list.addTask("Spor")
list.completeTask("Ödev")
list.listTasks()

Bir gerçek CLI'da bu çağrılar bir menü döngüsü içinde kullanıcıdan gelen komutlarla yapılır. Burada senaryoyu sabit tutuyoruz; böylece çıktı deterministik olur.

Menü döngüsü kavramı

Bir gerçek CLI'da while (true) döngüsü içinde kullanıcıdan komut okunur ve when ile ilgili metot çağrılır. Bu derste senaryoyu sabit tuttuğumuz için döngü yok; ama mantığı aynıdır.

while (true) {
    val cmd = readln()
    when (cmd.substringBefore(':')) {
        "add" -> list.addTask(cmd.substringAfter(':'))
        "done" -> list.completeTask(cmd.substringAfter(':'))
        "list" -> list.listTasks()
        else -> return
    }
}

Bu yapı, komutların sırasını kullanıcı belirler. Bizim senaryomuzda ise sıra kod içinde sabittir; bu da deterministik test çıktısı sağlar.

Uygulama Tam CLI senaryosunu çalıştır

main içinde bir TodoList oluştur. Sırayla üç görev ekle: list.addTask("Alışveriş"), list.addTask("Ödev"), list.addTask("Spor"). Sonra list.completeTask("Ödev") ile Ödev'i tamamla ve list.listTasks() ile tüm görevleri yazdır.

Başlangıç kodu

Main.kt
fun main() {
    val list = TodoList()
    // 3 görev ekle, 1 tanesini tamamla, listTasks ile yazdır
}

// Task ve TodoList sınıfları önceki derslerde tanımlandığı gibi durur.

Örnek çözüm

Main.kt
fun main() {
    val list = TodoList()
    list.addTask("Alışveriş")
    list.addTask("Ödev")
    list.addTask("Spor")
    list.completeTask("Ödev")
    list.listTasks()
}

data class Task(val title: String, val done: Boolean = false) {
    fun format() = if (done) "[x] $title" else "[ ] $title"
}

class TodoList {
    val tasks = mutableListOf<Task>()
    fun addTask(title: String) { tasks.add(Task(title)) }
    fun listTasks() { tasks.forEach { println(it.format()) } }
    fun completeTask(title: String) {
        val i = tasks.indexOfFirst { it.title == title }
        if (i >= 0) { tasks[i] = tasks[i].copy(done = true) }
    }
}

Beklenen çıktı

[ ] Alışveriş
[x] Ödev
[ ] Spor

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Hangi sıra hem ekleme hem tamamlama hem listelemeyi yapar?

  • completeTask, addTask
  • addTask, listTasks
  • addTask, addTask, addTask, completeTask, listTasks Doğru cevap
  • listTasks, listTasks, listTasks

Açıklama: Üç ekleme, bir tamamlama ve bir listeleme tam senaryoyu verir.

2 Metodu rolüyle eşleştir

Kavram Anlamı
addTask Görev ekle
completeTask Görevi tamamla
listTasks Tüm görevleri yazdır
copy(done = true) Yeni kopya, done true

3 Boşluğu doldur: menü döngüsü

Soru
for (cmd ____ menu) list.handle(cmd)
Cevap
for (cmd in menu) list.handle(cmd)

Açıklama: for (cmd in menü) komut dizisini gezer.

Başlangıç bölümündeki tüm dersler