Menu
Coddy logo textTech

Ukrywanie informacji

Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 41 z 91.

Ukrywanie informacji to zasada leżąca u podstaw hermetyzacji — idea, że klasa powinna udostępniać tylko to, co niezbędne, i ukrywać szczegóły swojej wewnętrznej implementacji. Modyfikatory dostępu oraz metody pobierające i ustawiające są narzędziami, natomiast ukrywanie informacji to filozofia projektowania, która wskazuje, jak z nich korzystać.

Celem jest wyraźne oddzielenie tego, co robi klasa (jej publicznego interfejsu), od tego, jak to robi (jej wewnętrznej implementacji). Dzięki temu rozdzieleniu możesz zmieniać wewnętrzne działanie klasy bez wpływu na kod, który z niej korzysta:

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

Wynik:

25C = 77F

Klasa przechowuje temperaturę wewnętrznie w stopniach Celsjusza, ale użytkownicy nie muszą o tym wiedzieć. Później możesz zmienić wewnętrzny sposób przechowywania na stopnie Fahrenheita lub Kelwina i dopóki metody publiczne będą działać tak samo, żaden zewnętrzny kod się nie zepsuje.

Najważniejsza kwestia: Ukrywanie informacji chroni Twój kod przed zmianami. Ukryj szczegóły implementacji, udostępniaj tylko stabilne interfejsy, a Twoje klasy z czasem staną się łatwiejsze w utrzymaniu i modyfikowaniu.

challenge icon

Wyzwanie

Łatwy

Stwórzmy konwerter walut, który pokaże, jak działa ukrywanie informacji. Utworzysz klasę, która wewnętrznie przechowuje pieniądze w jednej walucie, ale może płynnie przeliczać je na inne waluty i z nich, bez ujawniania zewnętrznemu kodowi sposobu przechowywania danych.

Rozmieścisz swój kod w dwóch plikach:

  • Money.php: Utwórz klasę Money, która wewnętrznie przechowuje wszystkie kwoty w centach (jako liczby całkowite), aby uniknąć problemów z precyzją liczb zmiennoprzecinkowych. Ten szczegół implementacyjny powinien być całkowicie ukryty przed użytkownikami klasy. Klasa powinna udostępniać:
    • Prywatną właściwość do przechowywania kwoty w centach
    • setDollars(float $amount): przyjmuje kwotę w dolarach i przechowuje ją wewnętrznie w centach
    • getDollars(): zwraca kwotę w dolarach (liczba zmiennoprzecinkowa, 2 miejsca po przecinku)
    • setEuros(float $amount): przyjmuje kwotę w euro i przelicza ją na centy według kursu: 1 EUR = 1.10 USD
    • getEuros(): zwraca kwotę przeliczoną na euro (liczba zmiennoprzecinkowa, 2 miejsca po przecinku)
    • getInternalValue(): zwraca surową wartość w centach (liczbę całkowitą) do celów debugowania
  • main.php: Dołącz plik Money. Otrzymasz dwa wejściowe dane: kwotę w dolarach i kwotę w euro. Utwórz instancję klasy Money. Najpierw ustaw kwotę w dolarach (przekonwertowaną na liczbę zmiennoprzecinkową) i wypisz trzy wiersze: kwotę w dolarach, równowartość w euro oraz wewnętrzną wartość w centach. Następnie ustaw kwotę w euro (przekonwertowaną na liczbę zmiennoprzecinkową) i ponownie wypisz te same trzy wartości.

Zaletą tego rozwiązania jest to, że zewnętrzny kod operuje na znanych wartościach w dolarach i euro, nie wiedząc, że wszystko jest wewnętrznie przechowywane w centach. Później możesz zmienić wewnętrzny sposób przechowywania na inną walutę bazową lub zastosować inną strategię precyzji. Jeśli metody publiczne nadal będą działać poprawnie, nie będzie potrzeby zmieniania zewnętrznego kodu.

Formatuj wszystkie kwoty w dolarach i euro z dokładnością do 2 miejsc po przecinku. Każdą wartość wypisz w osobnym wierszu, uzyskując łącznie sześć wierszy danych wyjściowych.

Spróbuj swoich sił

<?php

require_once 'Money.php';

// Odczytaj dane wejściowe
$dollarAmount = floatval(trim(fgets(STDIN)));
$euroAmount = floatval(trim(fgets(STDIN)));

// TODO: Utwórz instancję klasy Money

// TODO: Ustaw kwotę w dolarach i wypisz:
// - Wartość w dolarach (2 miejsca po przecinku)
// - Równowartość w euro (2 miejsca po przecinku)
// - Wewnętrzną wartość w centach (liczba całkowita)

// TODO: Ustaw kwotę w euro i wypisz:
// - Wartość w dolarach (2 miejsca po przecinku)
// - Równowartość w euro (2 miejsca po przecinku)
// - Wewnętrzną wartość w centach (liczba całkowita)

?>
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator PHP online