Menu
CoddyTech

Validasi pada Setter

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 20 dari 61.

Dalam pelajaran sebelumnya, kita membuat setter dasar yang hanya menetapkan nilai. Namun, ini melewatkan manfaat utama enkapsulasi: kemampuan untuk melindungi datamu dengan menambahkan logika validasi.

Bayangkan sebuah Counter yang nilainya tidak boleh negatif. Tanpa enkapsulasi, siapa pun bisa menulis c->value = -50 dan merusak statusnya. Dengan setter, kamu mengontrol nilai apa saja yang diizinkan:

// counter.c
void counter_set_value(Counter *c, int new_value) {
    if (new_value < 0) {
        return;  // Abaikan input yang tidak valid tanpa pemberitahuan
    }
    c->value = new_value;
}

Sekarang, nilai negatif cukup diabaikan.

Kamu juga bisa memilih untuk mengembalikan kode status guna menunjukkan keberhasilan atau kegagalan:

int counter_set_value(Counter *c, int new_value) {
    if (new_value < 0) {
        return 0;  // Gagal
    }
    c->value = new_value;
    return 1;  // Berhasil
}

Pola ini memberi tahu pemanggil apakah operasi berhasil. Inti pentingnya adalah setter bukan hanya tentang penugasan: setter adalah penjaga gerbang yang menegakkan aturan tentang status object-mu. Inilah kekuatan enkapsulasi yang sebenarnya: object-mu menjaga integritasnya sendiri, terlepas dari apa yang coba dilakukan kode eksternal.

challenge icon

Tantangan

Mudah

Mari buat module Temperature yang melindungi datanya dengan validasi pada setter. Kamu akan membuat pelacak suhu yang hanya menerima nilai dalam rentang yang valid, untuk menunjukkan bagaimana setter bertindak sebagai penjaga bagi state object-mu.

Kamu akan membuat tiga file:

  • temperature.h: Interface publikmu yang menggunakan pola opaque pointer. Deklarasikan tipe Temperature hanya dengan deklarasi awal. Deklarasikan fungsi-fungsi berikut:
    • create_temperature: menerima integer untuk derajat awal dan mengembalikan pointer Temperature
    • free_temperature: melepaskan memori yang dialokasikan
    • temp_get_degrees: getter yang mengembalikan nilai suhu saat ini
    • temp_set_degrees: setter yang mengembalikan int (1 jika berhasil, 0 jika gagal)
    Gunakan include guard dengan simbol TEMPERATURE_H.
  • temperature.c: Definisikan struct Temperature yang sebenarnya dengan member int degrees yang tersembunyi. Implementasikan semua fungsi. Bagian utamanya adalah setter-mu. Setter hanya boleh menerima nilai antara -50 dan 150 (inklusif). Jika nilai berada di luar rentang ini, kembalikan 0 dan biarkan suhu tetap. Jika nilainya valid, perbarui nilai tersebut dan kembalikan 1.
  • main.c: Tunjukkan validasi dengan mencoba menetapkan suhu yang valid dan tidak valid, serta memperlihatkan bahwa nilai yang tidak valid ditolak, sedangkan nilai yang valid diterima.

Kamu akan menerima tiga input: suhu awal, suhu valid untuk ditetapkan (dalam rentang), dan suhu tidak valid yang akan dicoba (di luar rentang).

Di file main-mu, buat Temperature dengan nilai awal dan cetak nilainya. Lalu coba tetapkan suhu yang tidak valid. Karena nilai itu seharusnya ditolak, cetak hasilnya dan tunjukkan bahwa nilainya tetap. Terakhir, tetapkan suhu yang valid, cetak hasil keberhasilannya, dan tunjukkan nilai yang telah diperbarui. Bebaskan memori dan konfirmasikan bahwa pembersihan berhasil.

Cetak output dengan format ini:

Initial: {degrees}
Set {invalid}: {0 or 1}
After invalid: {degrees}
Set {valid}: {0 or 1}
After valid: {degrees}
Freed

Contohnya, dengan input 25, 100, dan 200, output-nya adalah:

Initial: 25
Set 200: 0
After invalid: 25
Set 100: 1
After valid: 100
Freed

Ini menunjukkan manfaat nyata enkapsulasi. Setter-mu menegakkan aturan tentang nilai yang dianggap sebagai suhu valid, sehingga integritas object tetap terlindungi, apa pun nilai yang coba ditetapkan oleh kode eksternal.

Coba sendiri

#include <stdio.h>
#include "temperature.h"

int main() {
    // Baca input
    int initial, valid_temp, invalid_temp;
    scanf("%d", &initial);
    scanf("%d", &valid_temp);
    scanf("%d", &invalid_temp);
    
    // TODO: Buat Temperature dengan nilai awal
    
    // TODO: Cetak suhu awal
    // Format: "Initial: {degrees}"
    
    // TODO: Coba atur suhu yang tidak valid
    // Cetak hasilnya dan tunjukkan bahwa nilainya tetap tidak berubah
    // Format: "Set {invalid}: {0 or 1}"
    // Format: "After invalid: {degrees}"
    
    // TODO: Atur suhu yang valid
    // Cetak hasil keberhasilannya dan tunjukkan nilai yang sudah diperbarui
    // Format: "Set {valid}: {0 or 1}"
    // Format: "After valid: {degrees}"
    
    // TODO: Bebaskan memori dan cetak "Freed"
    
    return 0;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler C online