Menu
Coddy logo textTech

Bilgi Gizleme

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 36 / 104.

Bilgi gizleme, sadece erişim belirleyicileri kullanmanın ötesine geçer. Bu, yalnızca verileri değil, aynı zamanda sınıfınızın dahili olarak nasıl çalıştığına dair uygulama ayrıntılarını da gizlediğiniz bir tasarım ilkesidir.

Amaç, sınıfınızın kullanıcılarının bilmesi gerekenleri ortaya çıkarmak, geri kalan her şeyi ise gizli tutmaktır. Bu, sınıfınızı kullanan kodu etkilemeden dahili uygulamayı değiştirmenize olanak tanır:

class Temperature {
    double kelvin;    // Dahili temsil - gizli detay
    
public:
    void setCelsius(double c) {
        kelvin = c + 273.15;    // Dönüşüm kullanıcıdan gizlenmiştir
    }
    
    double getCelsius() const {
        return kelvin - 273.15;
    }
    
    double getFahrenheit() const {
        return (kelvin - 273.15) * 9.0/5.0 + 32;
    }
};

Bu sınıfın kullanıcıları, sıcaklığın dahili olarak Kelvin cinsinden saklandığını bilmezler (veya bilmelerine gerek duymazlar). Eğer daha sonra bunun yerine Celsius cinsinden saklamaya karar verirseniz, sadece private uygulamayı değiştirirsiniz; public arayüz değişmeden kalır.

Arayüz ve uygulama arasındaki bu ayrım birkaç fayda sağlar: sınıfınızın kullanıcıları için karmaşıklığı azaltır, dahili verilerin yanlışlıkla kötüye kullanılmasını önler ve kodunuzun bakımını kolaylaştırır. Dahili detaylar gizlendiğinde, sınıfınıza bağlı olan mevcut kodu bozmadan optimize etme veya yeniden düzenleme (refactor) konusunda özgür olursunuz.

challenge icon

Görev

Kolay

Mesafeleri dahili olarak santimetre cinsinden saklarken farklı birimlerle çalışmak için temiz bir arayüz sağlayarak bilgi gizlemeyi (information hiding) gösteren bir Distance sınıfı oluşturalım. Sınıfınızın kullanıcılarının mesafenin dahili olarak nasıl saklandığını bilmesine (veya umursamasına) gerek kalmayacak — sadece kendileri için uygun olan birimle çalışacaklar.

Kodunuzu düzenlemek için iki dosya oluşturacaksınız:

  • Distance.h: Dahili temsilini gizlerken esnek bir genel (public) arayüz sunan bir Distance sınıfı tanımlayın. Dahili olarak, mesafeyi santimetre (bir double olarak) cinsinden saklayın — bu sizin gizli uygulama detayınızdır. Genel arayüzünüz kullanıcıların şunları yapmasına olanak sağlamalıdır:
    • setMeters(double m), setCentimeters(double cm) veya setKilometers(double km) kullanarak mesafeyi ayarlama
    • getMeters(), getCentimeters() veya getKilometers() kullanarak mesafeyi alma — tümü const metotlar olmalıdır
    • Yeni bir Distance nesnesi döndüren add(const Distance& other) ile iki mesafeyi toplama

    Mesafeyi sıfıra başlatan varsayılan bir kurucu (constructor) ekleyin. Dönüştürme mantığı metotlarınızın içinde gizlenmelidir — kullanıcılar dahili depolama formatı hakkında endişelenmeden sadece setKilometers(5) ve getMeters() çağrılarını yaparlar.

  • main.cpp: Kullanıcıların dahili temsili bilmeden sınıfınızla çalışabileceğini gösterin. Girişten iki mesafe değeri okuyun: birincisi metre cinsinden, ikincisi kilometre cinsinden. Ardından:
    • Bir Distance nesnesi oluşturun ve metre değerini kullanarak ayarlayın
    • "In meters: <value> m" yazdırın
    • "In centimeters: <value> cm" yazdırın
    • "In kilometers: <value> km" yazdırın
    • İkinci bir Distance nesnesi oluşturun ve kilometre değerini kullanarak ayarlayın
    • İki mesafeyi toplayın ve sonucu saklayın
    • "Combined in meters: <value> m" yazdırın

Bilgi gizlemenin güzelliği, daha sonra kullanıcıların sınıfınızla etkileşim kurma şeklini değiştirmeden dahili depolamayı santimetreden milimetreye (veya başka bir şeye) değiştirebilmenizdir. Uygulama değişse bile genel arayüz sabit kalır.

Tüm çıktı değerlerini <iomanip> kütüphanesinden std::fixed ve std::setprecision(2) kullanarak iki ondalık basamakla formatlayın. Giriş dizelerini std::stod() kullanarak double türüne dönüştürün.

Dönüştürme referansı: 1 metre = 100 santimetre, 1 kilometre = 1000 metre.

Kendin dene

#include <iostream>
#include <string>
#include <iomanip>
#include "Distance.h"

using namespace std;

int main() {
    // Giriş değerlerini oku
    string metersInput, kmInput;
    cin >> metersInput;  // Metre cinsinden ilk değer
    cin >> kmInput;      // Kilometre cinsinden ikinci değer
    
    // std::stod() kullanarak dizeleri double türüne dönüştür
    double metersValue = stod(metersInput);
    double kmValue = stod(kmInput);
    
    // Çıktı biçimlendirmesini ayarla
    cout << fixed << setprecision(2);
    
    // TODO: İlk Distance nesnesini oluştur ve metre değerini kullanarak ayarla
    
    // TODO: "In meters: <value> m" yazdır
    
    // TODO: "In centimeters: <value> cm" yazdır
    
    // TODO: "In kilometers: <value> km" yazdır
    
    // TODO: İkinci Distance nesnesini oluştur ve kilometre değerini kullanarak ayarla
    
    // TODO: add() metodunu kullanarak iki mesafeyi birbirine ekle
    
    // TODO: "Combined in meters: <value> m" yazdır
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler