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.
Görev
KolayMesafeleri 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 birDistancesınıfı tanımlayın. Dahili olarak, mesafeyi santimetre (birdoubleolarak) 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)veyasetKilometers(double km)kullanarak mesafeyi ayarlamakgetMeters(),getCentimeters()veyagetKilometers()kullanarak mesafeyi almak — tümü const metotlar olmalıdır- İki mesafeyi
add(const Distance& other)ile toplamak ve yeni birDistancenesnesi 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)vegetMeters()ç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
Distancenesnesi 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
Distancenesnesi 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
- Bir
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;
}
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
1OOP Temelleri
Harici DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic Konteyner