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.
Görev
KolayMesafeleri 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 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 sağlamalıdır:setMeters(double m),setCentimeters(double cm)veyasetKilometers(double km)kullanarak mesafeyi ayarlamagetMeters(),getCentimeters()veyagetKilometers()kullanarak mesafeyi alma — tümü const metotlar olmalıdır- Yeni bir
Distancenesnesi döndürenadd(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)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 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;
}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