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, sadece 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 açığa çıkarırken geri kalan her şeyi 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 gizlenir
    }
    
    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 yoktur). Eğer daha sonra bunu Celsius cinsinden saklamaya karar verirseniz, sadece özel (private) uygulamayı değiştirirsiniz; genel (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 etmekte veya yeniden düzenlemekte özgür olursunuz.

challenge icon

Görev

Kolay

Mesafeleri dahili olarak metre 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 tanımalıdır:
    • setMeters(double m), setCentimeters(double cm) veya setKilometers(double km) kullanarak mesafeyi ayarlamak
    • getMeters(), getCentimeters() veya getKilometers() kullanarak mesafeyi almak — tümü const metotlar olmalıdır
    • İki mesafeyi add(const Distance& other) ile toplamak ve yeni bir Distance nesnesi döndürmek

    Mesafeyi sıfıra başlatan varsayılan bir kurucu (constructor) ekleyin. Dönüştürme mantığı metotlarınızın içinde gizli olmalıdır — 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 (strings) 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.

Kopya kağıdı

Bilgi gizleme (information hiding), sınıfınızın dahili olarak nasıl çalıştığına dair uygulama ayrıntılarını gizlediğiniz ve yalnızca kullanıcıların bilmesi gerekenleri sunduğunuz bir tasarım ilkesidir.

Bu, sınıfınızı kullanan kodu etkilemeden dahili uygulamayı değiştirmenize olanak tanır:

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

Kullanıcılar, sıcaklığın dahili olarak Kelvin cinsinden saklandığını bilmezler (veya bilmelerine gerek yoktur). Daha sonra saklama biçimini değiştirirseniz, yalnızca özel uygulama değişir; genel arayüz değişmeden kalır.

Bilgi gizlemenin faydaları:

  • Sınıfınızın kullanıcıları için karmaşıklığı azaltır
  • Dahili verilerin yanlışlıkla hatalı kullanımını önler
  • Kodun bakımını ve yeniden yapılandırılmasını (refactor) kolaylaştırır
  • Mevcut kodu bozmadan optimizasyon yapılmasına olanak tanır

Kendin dene

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

using namespace std;

int main() {
    // Girdi 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 topla
    
    // 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