Menu
Coddy logo textTech

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 = 77F

Sı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.

challenge icon

Görev

Kolay

Bilgilerin 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 bir Money sı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 saklar
    • getDollars(): tutarı dolar cinsinden (float, 2 ondalık basamak) döndürür
    • setEuros(float $amount): euroyu kabul eder ve şu oranı kullanarak sente dönüştürür: 1 EUR = 1.10 USD
    • getEuros(): tutarı euroya dönüştürülmüş şekilde (float, 2 ondalık basamak) döndürür
    • getInternalValue(): 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ı. Bir Money ö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ı)

?>
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

Kendi başına pratik yap: Online PHP derleyicisi