Latihan: Class dan Koleksi

1. Sebelum memulai

Dalam jalur ini, Anda telah mempelajari tentang generik, berbagai jenis class, koleksi, dan fungsi tingkat tinggi. Untuk mempraktikkan materi yang telah Anda pelajari, Anda akan membantu tim untuk meningkatkan kualitas aplikasi pelacakan peristiwa baru mereka. Petunjuk untuk setiap langkah menjelaskan status aplikasi saat ini dan tugas yang perlu Anda selesaikan.

Sebaiknya Anda menggunakan Kotlin Playground untuk menyelesaikan latihan berikut.

Prasyarat

  • Selesaikan Unit 3 Jalur 1 kursus Dasar-Dasar Android dengan Compose dan jalur sebelumnya.
  • Pemahaman tentang dasar-dasar bahasa pemrograman Kotlin, termasuk class, objek, koleksi, dan fungsi tingkat tinggi.

Yang Anda butuhkan

2. Ringkasan aplikasi

Anda adalah software engineer terbaru dalam tim aplikasi pelacakan peristiwa. Tujuan aplikasi ini adalah membantu pengguna melacak peristiwanya. Tim Anda akan menetapkan tugas agar Anda dapat membantu membangun fungsi aplikasi.

Di akhir setiap tugas, Anda harus membandingkan solusi Anda dengan solusi yang diberikan. Ada berbagai cara untuk mencapai fungsi yang diinginkan, jadi jangan khawatir jika kode Anda tidak sama persis dengan kode solusi yang diberikan.

Gunakan kode solusi yang diberikan di tugas sebelumnya sebagai kode awal untuk tugas berikutnya agar dapat memulai dari titik awal yang sama.

3. Tugas 1

Software engineer lain sudah menyelesaikan beberapa tugas tingkat tinggi untuk aplikasi dan Anda diberi tugas untuk menerapkan detailnya.

Anda harus menerapkan class Event. Class ini digunakan untuk menyimpan detail peristiwa yang dimasukkan oleh pengguna. (Petunjuk: Class ini tidak perlu menentukan metode apa pun atau melakukan tindakan apa pun.)

Untuk tugas ini, Anda perlu membuat class data bernama Event.

Instance class ini harus dapat menyimpan:

  • Judul peristiwa sebagai string.
  • Deskripsi peristiwa sebagai string (dapat bernilai null).
  • Pemisahan hari peristiwa sebagai string. Kita hanya perlu melacak apakah peristiwa dimulai pada pagi, siang, atau sore hari.
  • Durasi peristiwa dalam menit sebagai bilangan bulat.

Sebelum melanjutkan, coba tulis kode Anda sendiri.

Dengan kode Anda, buat instance menggunakan informasi berikut:

  • Judul: Belajar Kotlin
  • Deskripsi: Berkomitmen untuk mempelajari Kotlin setidaknya 15 menit per hari.
  • Pemisahan hari: Sore hari
  • Durasi: 15

Coba cetak objek Anda untuk memverifikasi bahwa Anda mendapatkan output berikut:

Event(title=Study Kotlin, description=Commit to studying Kotlin at least 15 minutes per day., daypart=Evening, durationInMinutes=15)

Setelah Anda menyelesaikan tugas atau berusaha sebaik mungkin, klik Berikutnya untuk melihat cara kami membuat kodenya.

4. Solusi Tugas 1

Solusi Anda harus serupa dengan kode berikut:

data class Event(
    val title: String,
    val description: String? = null,
    val daypart: String,
    val durationInMinutes: Int,
)

5. Tugas 2

Agar project tetap sesuai rencana, manajer Anda memutuskan untuk menggunakan kode yang kami berikan untuk class data.

Setelah anggota tim Anda menggunakan class Event selama beberapa waktu, rekan tim yang lebih senior menyadari bahwa menggunakan string untuk pemisahan hari tidaklah ideal.

Sebagian developer menyimpan nilai "Pagi", sebagian lagi menggunakan "pagi", sementara yang lain menggunakan "PAGI".

Hal ini menyebabkan banyak masalah.

Tugas Anda adalah memperbaiki masalah ini dengan melakukan beberapa pemfaktoran ulang. Pemfaktoran ulang adalah proses meningkatkan kode tanpa mengubah fungsinya. Beberapa contohnya adalah menyederhanakan logika atau memindahkan kode berulang ke dalam fungsi terpisah.

Jenis class mana yang dapat digunakan untuk membuat model rangkaian terbatas dari nilai yang berbeda untuk membantu memperbaiki masalah ini?

Tim Anda ingin Anda mengubah kode pemisahan hari untuk menggunakan class enum. Dengan menggunakan class enum, rekan tim Anda diharuskan untuk memilih salah satu nilai pemisahan hari yang disediakan, yang akan mencegah jenis masalah ini.

Class enum harus diberi nama Daypart. Class enum itu juga harus memiliki tiga nilai:

  • MORNING
  • AFTERNOON
  • EVENING

Bagaimana Anda akan membuat class enum ini?

Bagaimana Anda akan memfaktorkan ulang class Event untuk menggunakannya?

Coba buat kode solusi Anda sekarang sebelum melanjutkan.

Klik Berikutnya untuk melihat cara kami membuat kodenya.

6. Solusi Tugas 2

enum class Daypart {
    MORNING,
    AFTERNOON,
    EVENING,
}

Class data Event yang difaktorkan ulang kini menggunakan class enum:

data class Event(
    val title: String,
    val description: String? = null,
    val daypart: Daypart,
    val durationInMinutes: Int,
)

7. Tugas 3

Rekan kerja Anda senang menggunakan Daypart yang telah difaktorkan ulang, tetapi mereka memiliki masalah lain.

Kode berikut adalah cara pengguna membuat dan menyimpan peristiwa pengguna saat ini.

val event1 = Event(title = "Wake up", description = "Time to get up", daypart = Daypart.MORNING, durationInMinutes = 0)
val event2 = Event(title = "Eat breakfast", daypart = Daypart.MORNING, durationInMinutes = 15)
val event3 = Event(title = "Learn about Kotlin", daypart = Daypart.AFTERNOON, durationInMinutes = 30)
val event4 = Event(title = "Practice Compose", daypart = Daypart.AFTERNOON, durationInMinutes = 60)
val event5 = Event(title = "Watch latest DevBytes video", daypart = Daypart.AFTERNOON, durationInMinutes = 10)
val event6 = Event(title = "Check out latest Android Jetpack library", daypart = Daypart.EVENING, durationInMinutes = 45)

Mereka membuat banyak peristiwa, dan setiap peristiwa saat ini memerlukan variabelnya sendiri. Semakin banyak peristiwa yang dibuat, akan semakin sulit untuk melacak semua peristiwa tersebut. Dengan pendekatan ini, seberapa sulit untuk menentukan banyaknya peristiwa yang dijadwalkan oleh pengguna?

Dapatkah Anda memikirkan cara yang lebih baik untuk mengelola penyimpanan peristiwa ini?

Bagaimana cara menyimpan semua peristiwa dalam satu variabel? (Catatan: Cara itu harus fleksibel, karena banyak peristiwa yang mungkin akan ditambahkan. Cara itu juga harus menampilkan jumlah peristiwa yang disimpan dalam variabel secara efisien.)

Class atau jenis data mana yang akan Anda gunakan? Cara apa yang dapat digunakan untuk menambahkan lebih banyak peristiwa?

Sekarang giliran Anda untuk menerapkan fitur ini. Coba tulis kode sebelum mengklik Berikutnya untuk melihat solusi kami.

8. Solusi Tugas 3

val events = mutableListOf<Event>(event1, event2, event3, event4, event5, event6)

9. Tugas 4

Manajer Anda menyukai aplikasi hasilnya, tetapi memutuskan bahwa pengguna harus dapat melihat ringkasan peristiwa singkat mereka berdasarkan durasi peristiwa. Misalnya, "Anda memiliki 5 peristiwa singkat."

Peristiwa "singkat" adalah peristiwa yang kurang dari 60 menit.

Dengan menggunakan kode variabel events dari solusi tugas sebelumnya, bagaimana Anda akan mencapai hasil ini?

Klik Berikutnya untuk melanjutkan ke solusi kami.

10. Solusi Tugas 4

Ada beberapa cara untuk mencapainya, dan berikut ini yang telah kami putuskan:

val shortEvents = events.filter { it.durationInMinutes < 60 }
println("You have ${shortEvents.size} short events.")

11. Tugas 5

Rekan tim Anda menyukai aplikasi hasilnya, tetapi mereka ingin pengguna dapat melihat ringkasan semua peristiwa dan pemisahan hari mereka.

Output harus serupa dengan:

Morning: 3 events
Afternoon: 4 events
Evening: 2 events

Dengan menggunakan kode variabel events dari langkah sebelumnya, bagaimana Anda dapat mencapai hasil ini?

Klik Berikutnya untuk melihat kode solusi.

12. Solusi Tugas 5

Berikut ini adalah solusi kami, tetapi variasi lainnya dapat diterima.

val groupedEvents = events.groupBy { it.daypart }
groupedEvents.forEach { (daypart, events) ->
    println("$daypart: ${events.size} events")
}

13. Tugas 6

Saat ini, rekan kerja Anda menemukan dan mencetak item terakhir menggunakan indeksnya. Kode yang digunakan adalah: println("Last event of the day: ${events[events.size - 1].title}").

Manajer menyarankan Anda agar memeriksa dokumentasi Kotlin untuk fungsi yang dapat menyederhanakan kode ini.

Fungsi apa yang Anda temukan?

Coba gunakan untuk mengonfirmasi bahwa Anda mendapatkan hasil yang sama untuk dicetak.

Klik Berikutnya untuk melihat solusinya.

14. Solusi Tugas 6

println("Last event of the day: ${events.last().title}")

15. Tugas 7

Tim Anda menyukai class data yang Anda desain, tetapi class data itu berulang kali menulis kode setiap kali memerlukan durasi peristiwa sebagai string:

val durationOfEvent = if (events[0].durationInMinutes < 60) {
        "short"
    } else {
        "long"
    }
println("Duration of first event of the day: $durationOfEvent")

Meskipun Anda dapat memperbaiki pengulangan ini dengan menambahkan metode langsung ke class, hal ini tidak ideal karena tim lain mulai menggunakan class peristiwa Anda di aplikasi mereka. Jika class berubah, mereka harus menguji ulang semua kode mereka untuk memastikan tidak ada yang rusak karena perubahan Anda.

Tanpa mengubah class data secara langsung, bagaimana cara Anda menulis properti ekstensi yang menampilkan nilai yang sama dengan kode di atas?

Jika diterapkan dengan benar, Anda dapat menggunakan kode berikut, dan kode akan mencetak pesan yang sama dengan kode yang ditampilkan di awal tugas ini.

println("Duration of first event of the day: ${events[0].durationOfEvent}")

Klik Berikutnya untuk melanjutkan ke solusi.

16. Solusi Tugas 7

val Event.durationOfEvent: String
    get() = if (this.durationInMinutes < 60) {
        "short"
    } else {
        "long"
    }

17. Latihan Tambahan

Untuk latihan lain terkait bahasa Kotlin, lihat jalur Kotlin Core dari JetBrains Academy. Untuk membuka topik tertentu, buka peta pengetahuan guna melihat daftar topik yang dibahas dalam jalur.