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

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

challenge icon

Görev

Kolay

Bilgi 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 bir Money sı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 saklar
    • getDollars() — 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 USD
    • getEuros() — 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ı. Bir Money ö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ı)

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