Penyembunyian Informasi
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 36 dari 104.
Penyembunyian informasi lebih dari sekadar menggunakan penentu akses. Ini adalah prinsip desain yang menyembunyikan bukan hanya data, tetapi juga detail implementasi tentang cara kerja internal class-mu.
Tujuannya adalah menampilkan hanya hal yang perlu diketahui oleh pengguna class-mu, sambil menyembunyikan hal lainnya. Dengan begitu, kamu bisa mengubah implementasi internal tanpa memengaruhi kode yang menggunakan class-mu:
class Temperature {
double kelvin; // Representasi internal, detail tersembunyi
public:
void setCelsius(double c) {
kelvin = c + 273.15; // Konversi disembunyikan darimu
}
double getCelsius() const {
return kelvin - 273.15;
}
double getFahrenheit() const {
return (kelvin - 273.15) * 9.0/5.0 + 32;
}
};Pengguna class ini tidak tahu (atau tidak perlu tahu) bahwa suhu disimpan dalam Kelvin secara internal. Jika nanti kamu memutuskan untuk menyimpannya dalam Celsius, kamu hanya perlu mengubah implementasi privatnya. Antarmuka publiknya tetap tidak berubah.
Pemisahan antara antarmuka dan implementasi ini memberikan beberapa manfaat: mengurangi kerumitan bagi pengguna class-mu, mencegah penyalahgunaan data internal secara tidak sengaja, dan memudahkan pemeliharaan kodemu. Saat detail internal disembunyikan, kamu bebas mengoptimalkan atau melakukan refaktor tanpa merusak kode yang sudah ada dan bergantung pada class-mu.
Tantangan
MudahMari kita buat class Distance yang menunjukkan penyembunyian informasi dengan menyimpan jarak secara internal dalam sentimeter, sambil menyediakan antarmuka yang mudah digunakan untuk menangani berbagai satuan. Pengguna class-mu tidak perlu tahu (atau peduli) bagaimana jarak disimpan secara internal: mereka cukup menggunakan satuan yang paling sesuai bagi mereka.
Kamu akan membuat dua file untuk mengatur kodemu:
Distance.h: Definisikan classDistanceyang menyembunyikan representasi internalnya sekaligus menyediakan antarmuka publik yang fleksibel. Secara internal, simpan jarak dalam sentimeter (sebagaidouble). Ini adalah detail implementasi tersembunyimu. Antarmuka publikmu harus memungkinkan pengguna untuk:- Mengatur jarak menggunakan
setMeters(double m),setCentimeters(double cm), atausetKilometers(double km) - Mendapatkan jarak menggunakan
getMeters(),getCentimeters(), ataugetKilometers(): semuanya harus berupa method const - Menjumlahkan dua jarak dengan
add(const Distance& other)yang mengembalikan objectDistancebaru
Sertakan constructor default yang menginisialisasi jarak ke nol. Logika konversi harus disembunyikan di dalam method-mu: pengguna cukup memanggil
setKilometers(5)dangetMeters()tanpa perlu memikirkan format penyimpanan internal.- Mengatur jarak menggunakan
main.cpp: Tunjukkan bahwa pengguna dapat menggunakan class-mu tanpa mengetahui representasi internalnya. Baca dua nilai jarak dari input: yang pertama dalam meter, yang kedua dalam kilometer. Lalu:- Buat object
Distancedan atur menggunakan nilai dalam meter - Cetak
"In meters: <value> m" - Cetak
"In centimeters: <value> cm" - Cetak
"In kilometers: <value> km" - Buat object
Distancekedua dan atur menggunakan nilai dalam kilometer - Jumlahkan kedua jarak dan simpan hasilnya
- Cetak
"Combined in meters: <value> m"
- Buat object
Keunggulan penyembunyian informasi adalah kamu dapat mengubah penyimpanan internal dari sentimeter menjadi milimeter (atau satuan lainnya) nanti tanpa mengubah cara pengguna berinteraksi dengan class-mu. Antarmuka publik tetap stabil meskipun implementasinya berubah.
Format semua nilai output dengan dua angka desimal menggunakan std::fixed dan std::setprecision(2) dari <iomanip>. Konversikan string input menjadi double menggunakan std::stod().
Acuan konversi: 1 meter = 100 sentimeter, 1 kilometer = 1000 meter.
Coba sendiri
#include <iostream>
#include <string>
#include <iomanip>
#include "Distance.h"
using namespace std;
int main() {
// Baca nilai input
string metersInput, kmInput;
cin >> metersInput; // Nilai pertama dalam meter
cin >> kmInput; // Nilai kedua dalam kilometer
// Ubah string menjadi double menggunakan std::stod()
double metersValue = stod(metersInput);
double kmValue = stod(kmInput);
// Atur format output
cout << fixed << setprecision(2);
// TODO: Buat object Distance pertama dan atur nilainya menggunakan nilai dalam meter
// TODO: Cetak "In meters: <value> m"
// TODO: Cetak "In centimeters: <value> cm"
// TODO: Cetak "In kilometers: <value> km"
// TODO: Buat object Distance kedua dan atur nilainya menggunakan nilai dalam kilometer
// TODO: Jumlahkan kedua jarak menggunakan method add()
// TODO: Cetak "Combined in meters: <value> m"
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online