Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 class Distance yang menyembunyikan representasi internalnya sekaligus menyediakan antarmuka publik yang fleksibel. Secara internal, simpan jarak dalam sentimeter (sebagai double). Ini adalah detail implementasi tersembunyimu. Antarmuka publikmu harus memungkinkan pengguna untuk:
    • Mengatur jarak menggunakan setMeters(double m), setCentimeters(double cm), atau setKilometers(double km)
    • Mendapatkan jarak menggunakan getMeters(), getCentimeters(), atau getKilometers(): semuanya harus berupa method const
    • Menjumlahkan dua jarak dengan add(const Distance& other) yang mengembalikan object Distance baru

    Sertakan constructor default yang menginisialisasi jarak ke nol. Logika konversi harus disembunyikan di dalam method-mu: pengguna cukup memanggil setKilometers(5) dan getMeters() tanpa perlu memikirkan format penyimpanan internal.

  • 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 Distance dan atur menggunakan nilai dalam meter
    • Cetak "In meters: <value> m"
    • Cetak "In centimeters: <value> cm"
    • Cetak "In kilometers: <value> km"
    • Buat object Distance kedua dan atur menggunakan nilai dalam kilometer
    • Jumlahkan kedua jarak dan simpan hasilnya
    • Cetak "Combined in meters: <value> m"

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;
}
quiz iconUji dirimu

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

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online