Dependency Inversion Principle (DIP)
Założenie: Zrozumieć i zaimplementować zasadę odwrócenia zależności (DIP) w PHP, aby stworzyć luźno sprzęgnięty kod.
Krok po kroku:
- Zły przykład – silne sprzężenie: Załóżmy, że mamy klasę `EmailSender` wysyłającą emaile za pomocą funkcji `mail()`. Klasa `OrderProcessor` bezpośrednio zależy od `EmailSender`.
- Wprowadzenie abstrakcji: Stwórzmy interfejs `EmailService` definiujący metodę wysyłania emaili.
- Implementacja interfejsu: `EmailSender` implementuje teraz `EmailService`.
- Zmiana `OrderProcessor`: `OrderProcessor` teraz zależy od `EmailService`, a nie od konkretnej implementacji.
- Testowanie: Możemy teraz łatwo testować `OrderProcessor` z mockową implementacją `EmailService`.
class EmailSender {
public function sendEmail(string $to, string $subject, string $message): void {
mail($to, $subject, $message);
}
}
class OrderProcessor {
private EmailSender $emailSender;
public function __construct(EmailSender $emailSender) {
$this->emailSender = $emailSender;
}
public function processOrder(): void {
// ... przetwarzanie zamówienia ...
$this->emailSender->sendEmail('user@example.com', 'Zamówienie', 'Twoje zamówienie zostało złożone.');
}
}
$emailSender = new EmailSender();
$orderProcessor = new OrderProcessor($emailSender);
$orderProcessor->processOrder();
interface EmailService {
public function sendEmail(string $to, string $subject, string $message): void;
}
class EmailSender implements EmailService {
public function sendEmail(string $to, string $subject, string $message): void {
mail($to, $subject, $message);
}
}
class OrderProcessor {
private EmailService $emailService;
public function __construct(EmailService $emailService) {
$this->emailService = $emailService;
}
public function processOrder(): void {
// ... przetwarzanie zamówienia ...
$this->emailService->sendEmail('user@example.com', 'Zamówienie', 'Twoje zamówienie zostało złożone.');
}
}
Podsumowanie: Ten przykład pokazuje, jak zastosować zasadę DIP, aby stworzyć bardziej elastyczny i testowalny kod. Zachęcamy do dalszego zgłębiania tematu programowania obiektowego w PHP!