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.
Tantangan
MudahMari 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 tipeTemperaturehanya dengan deklarasi awal. Deklarasikan fungsi-fungsi berikut:create_temperature: menerima integer untuk derajat awal dan mengembalikan pointer Temperaturefree_temperature: melepaskan memori yang dialokasikantemp_get_degrees: getter yang mengembalikan nilai suhu saat initemp_set_degrees: setter yang mengembalikanint(1 jika berhasil, 0 jika gagal)
TEMPERATURE_H.temperature.c: Definisikanstruct Temperatureyang sebenarnya dengan memberint degreesyang 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}
FreedContohnya, dengan input 25, 100, dan 200, output-nya adalah:
Initial: 25
Set 200: 0
After invalid: 25
Set 100: 1
After valid: 100
FreedIni 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;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar Pemrograman Modular
file headerProteksi includefile sumberFungsi StatisRingkasan: Kalkulator Modular4Enkapsulasi
Konsep Opaque PointerMendefinisikan Opaque StructGetter dan SetterValidasi pada SetterUlasan: Kotak Rahasia2Object dan method
Struct sebagai objectPointer 'self'Konsistensi constPointer vs nilaiMethod pembantuRangkuman: Pengelola Point5Proyek: Akun Bank Sederhana
Penyiapan ProyekImplementasi Akun3Siklus Hidup object
Pola KonstruktorPola DestruktorInisialisasi StackSalinan MendalamRangkuman: Pembungkus string6Pewarisan melalui Komposisi
Penyematan StructAturan Anggota PertamaMengakses Anggota ParentUpcastingRekap: Hierarki Bentuk9Proyek: Penggambar Bentuk
Ringkasan ProyekImplementasi LingkaranImplementasi Persegi PanjangPenggunaan PolimorfismeWadah BentukLatihan sendiri: Compiler C online