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 = 77FKlasa 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.
Wyzwanie
ŁatwyStwó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 centachgetDollars(): 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 USDgetEuros(): 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ę klasyMoney. 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)
?>Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe $thisMetodyWłaściwościKonstruktor (__construct)Destruktor (__destruct)Powtórka — prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe parent::Przesłanianie metodSłowo kluczowe finalKlasy abstrakcyjnePowtórzenie – hierarchia pracowników7Enkapsulacja
Public, protected, privateModyfikatory dostępu w szczegółachGettery i setteryUkrywanie informacjiPromocja parametrów konstruktora (8.0)Podsumowanie — system ewidencji studentów2Przestrzenie nazw i autoloading
Wprowadzenie do przestrzeni nazwSłowo kluczowe useStandard autoloadingu PSR-4Autoloader ComposeraPodsumowanie – uporządkowany projekt5Interfejsy i kontrakty
Wprowadzenie do interfejsówImplementowanie interfejsówImplementowanie wielu interfejsówInterfejs a klasa abstrakcyjnaPodpowiadanie typów za pomocą interfejsówPodsumowanie — kalkulator kształtów8Metody magiczne
Wprowadzenie do metod magicznych__toString i __debugInfo__get, __set, __isset, __unset__call i __callStatic__clone i klonowanie obiektów__serialize i __unserializePodsumowanie — własna kolekcja11System typów i obsługa błędów
Deklaracje typówTypy nullableTypy sumy i przecięciaKlasy wyjątkówNiestandardowa hierarchia wyjątkówTry, Catch, FinallyPodsumowanie — walidator formularzy14Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Właściwości klas
Właściwości instancji a właściwości statyczneStałe w klasachMetody i właściwości statyczneWłaściwości prywatne i chronioneWłaściwości tylko do odczytu (PHP 8.1)Podsumowanie — menedżer kont bankowych6Polimorfizm
Ponowne omówienie nadpisywania metodPolimorfizm za pomocą interfejsówPodpowiedzi typów i typy sumyPóźne wiązanie statycznePodsumowanie — procesor płatności9Cechy
Wprowadzenie do cechKorzystanie z wielu cechRozwiązywanie konfliktów cechMetody abstrakcyjne w cechachCechy a dziedziczenie12Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator PHP online