Bilgi Gizleme
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 41 / 91.
Bilgi gizleme, kapsüllemenin arkasındaki ilkedir; bir sınıfın yalnızca gerekli olanı açığa çıkarması ve dahili uygulama detaylarını gizlemesi fikridir. Erişim belirleyicileri ve getter/setter'lar araçlar olsa da, bilgi gizleme bunları nasıl kullanacağınızı yönlendiren tasarım felsefesidir.
Amaç, bir sınıfın ne yaptığı (genel arayüzü) ile bunu nasıl yaptığı (dahili uygulaması) arasında net bir sınır oluşturmaktır. Bu ayrım, sınıfı kullanan kodu etkilemeden dahili işleyişi değiştirebileceğiniz anlamına gelir:
<?php
class Temperature {
private float $celsius;
public function setCelsius(float $value): void {
$this->celsius = $value;
}
public function getCelsius(): float {
return $this->celsius;
}
public function getFahrenheit(): float {
return ($this->celsius * 9/5) + 32;
}
}
$temp = new Temperature();
$temp->setCelsius(25);
echo $temp->getCelsius() . "C = " . $temp->getFahrenheit() . "F";
Çıktı:
25C = 77FSınıf, sıcaklığı dahili olarak Celsius cinsinden saklar, ancak kullanıcıların bunu bilmesine gerek yoktur. Daha sonra dahili depolamayı Fahrenheit veya Kelvin olarak değiştirebilirsiniz ve genel metotlar aynı şekilde çalışmaya devam ettiği sürece hiçbir harici kod bozulmaz.
Önemli Nokta: Bilgi gizleme, kodunuzu değişikliklerden korur. Uygulama ayrıntılarını gizleyin, yalnızca kararlı arayüzleri dışa açın; böylece sınıflarınızın zamanla bakımı ve değiştirilmesi daha kolay hale gelir.
Görev
KolayBilgi gizlemenin (information hiding) işleyişini gösteren bir para birimi dönüştürücü oluşturalım. Parayı dahili olarak tek bir para biriminde saklayan ancak harici kodun verilerin gerçekte nasıl saklandığını bilmesine gerek kalmadan birden fazla para birimine sorunsuz bir şekilde dönüştürebilen bir sınıf oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
Money.php— Kayan nokta (floating-point) hassasiyet sorunlarını önlemek için tüm tutarları dahili olarak sent (tam sayı olarak) cinsinden saklayan birMoneysınıfı oluşturun. Bu uygulama detayı, sınıfın kullanıcılarından tamamen gizlenmelidir. Sınıf şunları sağlamalıdır:- Tutarı sent cinsinden saklamak için özel (private) bir özellik
setDollars(float $amount)— bir dolar tutarı kabul eder ve bunu dahili olarak sent olarak saklargetDollars()— tutarı dolar olarak döndürür (float, 2 ondalık basamak)setEuros(float $amount)— euro kabul eder ve şu oranı kullanarak sente dönüştürür: 1 EUR = 1.10 USDgetEuros()— tutarı euroya dönüştürülmüş olarak döndürür (float, 2 ondalık basamak)getInternalValue()— hata ayıklama amacıyla ham sent değerini (tam sayı) döndürür
main.php— Money dosyasını dahil edin. İki girdi alacaksınız: bir dolar tutarı ve bir euro tutarı. BirMoneyörneği oluşturun. İlk olarak, dolar tutarını (float'a dönüştürülmüş) ayarlayın ve üç satır yazdırın: dolar değeri, euro eşdeğeri ve dahili sent değeri. Ardından euro tutarını (float'a dönüştürülmüş) ayarlayın ve aynı üç değeri tekrar yazdırın.
Bu tasarımın güzelliği, harici kodun her şeyin dahili olarak sent olarak saklandığından tamamen habersiz bir şekilde, tanıdık dolar ve euro değerleriyle çalışmasıdır. Daha sonra dahili depolamayı farklı bir temel para birimi veya farklı bir hassasiyet stratejisi kullanacak şekilde değiştirebilirsiniz ve genel (public) metotlar doğru çalışmaya devam ettiği sürece hiçbir harici kodun değişmesi gerekmez.
Tüm dolar ve euro çıktılarını tam olarak 2 ondalık basamak olacak şekilde biçimlendirin. Her değer kendi satırına yazdırılmalıdır, bu da toplamda altı satırlık bir çıktı ile sonuçlanacaktır.
Kopya kağıdı
Bilgi gizleme (information hiding), kapsüllemenin (encapsulation) arkasındaki ilkedir - dahili uygulama ayrıntılarını gizlerken yalnızca gerekli olanı açığa çıkarır. Bu, bir sınıfın ne yaptığı (genel arayüz) ile bunu nasıl yaptığı (dahili uygulama) arasında net bir sınır oluşturur.
Bir Temperature sınıfı ile bilgi gizleme örneği:
<?php
class Temperature {
private float $celsius;
public function setCelsius(float $value): void {
$this->celsius = $value;
}
public function getCelsius(): float {
return $this->celsius;
}
public function getFahrenheit(): float {
return ($this->celsius * 9/5) + 32;
}
}
$temp = new Temperature();
$temp->setCelsius(25);
echo $temp->getCelsius() . "C = " . $temp->getFahrenheit() . "F";
// Çıktı: 25C = 77F
Sınıf, sıcaklığı dahili olarak Celsius cinsinden saklar, ancak kullanıcıların bunu bilmesine gerek yoktur. Genel metotlar aynı şekilde çalışmaya devam ettiği sürece, dahili depolama harici kodu bozmadan Fahrenheit veya Kelvin olarak değiştirilebilir.
Temel faydalar: Bilgi gizleme, kodu değişikliklerden korur. Uygulama ayrıntılarını gizleyerek ve yalnızca kararlı arayüzleri açığa çıkararak, sınıfların zaman içinde bakımı ve değiştirilmesi daha kolay hale gelir.
Kendin dene
<?php
require_once 'Money.php';
// Girdileri oku
$dollarAmount = floatval(trim(fgets(STDIN)));
$euroAmount = floatval(trim(fgets(STDIN)));
// YAPILACAK: Bir Money örneği oluşturun
// YAPILACAK: Dolar miktarını ayarlayın ve yazdırın:
// - Dolar değeri (2 ondalık basamak)
// - Euro karşılığı (2 ondalık basamak)
// - Dahili sent değeri (tamsayı)
// YAPILACAK: Euro miktarını ayarlayın ve yazdırın:
// - Dolar değeri (2 ondalık basamak)
// - Euro karşılığı (2 ondalık basamak)
// - Dahili sent değeri (tamsayı)
?>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 DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi