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 temelindeki ilkedir; bir sınıfın yalnızca gerekli olanları dışa açması ve dahili uygulama ayrıntılarını gizlemesi gerektiği fikridir. Erişim belirleyicileri ve getter/setter'lar araçlar olsa da bilgi gizleme, bunları nasıl kullanacağınıza yön veren 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 depolar, ancak kullanıcıların bunu bilmesi gerekmez. Daha sonra dahili depolamayı Fahrenheit veya Kelvin olarak değiştirebilirsin; genel yöntemler 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 zaman içinde bakımı ve değiştirilmesi kolaylaşır.
Görev
KolayBilgilerin gizlenmesini uygulamalı olarak gösteren bir para birimi dönüştürücü oluşturalım. Parayı dahili olarak tek bir para biriminde saklayan, ancak dış kodun verilerin gerçekte nasıl saklandığını asla bilmesine gerek kalmadan birden fazla para birimine sorunsuzca dönüştürme yapabilen bir sınıf oluşturacaksın.
Kodunu iki dosyaya ayıracaksın:
Money.php: Tüm tutarları kayan nokta hassasiyeti sorunlarından kaçınmak için dahili olarak sent cinsinden (tam sayı olarak) saklayan birMoneysınıfı oluştur. Bu uygulama ayrıntısı, sınıfı kullanan kişilerden tamamen gizlenmelidir. Sınıf şunları sağlamalıdır:- Tutarı sent cinsinden saklamak için private bir özellik
setDollars(float $amount): dolar tutarını kabul eder ve dahili olarak sent cinsinden saklargetDollars(): tutarı dolar cinsinden (float, 2 ondalık basamak) döndürürsetEuros(float $amount): euroyu kabul eder ve şu oranı kullanarak sente dönüştürür: 1 EUR = 1.10 USDgetEuros(): tutarı euroya dönüştürülmüş şekilde (float, 2 ondalık basamak) döndürürgetInternalValue(): hata ayıklama amacıyla ham sent değerini (tam sayı) döndürür
main.php: Money dosyasını dahil et. İki girdi alacaksın: bir dolar tutarı ve bir euro tutarı. BirMoneyörneği oluştur. Önce dolar tutarını (float'a dönüştürülmüş olarak) ayarla ve üç satır yazdır: dolar değeri, euro karşılığı ve dahili sent değeri. Ardından euro tutarını (float'a dönüştürülmüş olarak) ayarla ve aynı üç değeri tekrar yazdır.
Bu tasarımın güzelliği, dış kodun her şeyin dahili olarak sent cinsinden saklandığından tamamen habersiz olarak tanıdık dolar ve euro değerleriyle çalışmasıdır. Daha sonra dahili saklama yöntemini farklı bir temel para birimi veya farklı bir hassasiyet stratejisi kullanacak şekilde değiştirebilirsin; herkese açık yöntemler doğru şekilde çalışmaya devam ettiği sürece dış kodun hiçbirini değiştirmen gerekmez.
Tüm dolar ve euro çıktılarını tam olarak 2 ondalık basamağa biçimlendir. Her değer kendi satırına yazdırılmalı ve toplamda altı çıktı satırı oluşmalıdır.
Kendin dene
<?php
require_once 'Money.php';
// Girdileri oku
$dollarAmount = floatval(trim(fgets(STDIN)));
$euroAmount = floatval(trim(fgets(STDIN)));
// TODO: Bir Money örneği oluştur
// TODO: Dolar miktarını ayarla ve yazdır:
// - Dolar değeri (2 ondalık basamak)
// - Euro eşdeğeri (2 ondalık basamak)
// - Dahili sent değeri (tamsayı)
// TODO: Euro miktarını ayarla ve yazdır:
// - Dolar değeri (2 ondalık basamak)
// - Euro eşdeğeri (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 SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarı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ıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi