Cytat
skup się na interfejsach, nie natomiast na implementacji
Chodzi o to, by w miejscu gdzie spodziewasz się obiektu danego typu, korzystać z interfejsów zamiast konkretnych klas, przykładowo:
public function save(DatabaseStorage $storage) { ... } // źle, ograniczasz się wyłącznie do konkretnej implementacji
public function save(StorageInterface $storage) { ... } // dobrze, możesz skorzystać w tym miejscu z DatabaseStorage, ArrayStorage, MemchaeStorage, AmazonS3Storage czy czegokolwiek sobie zażyczysz
Cytat
uzależniaj kod od abstrakcji,a nie od klas rzeczywistych
j/w
Cytat
twórz klasy luźno ze sobą powiązane
Przede wszystkim: j/w. Kolejną sprawą jest IoC, czyli zamiast bezpośrednio "łączyć" ze sobą dwie klasy:
class Foo {
public function __construct() {
$this->service = new Bar();
}
}
// Klasa Foo jest bezpośrednio powiązana z klasą Bar
Utwórz zależność poprzez wstrzyknięcie jej jako argument konstruktora:
class Foo {
public function __construct(Bar $bar) { // bądź BarInterface $bar
$this->service = $bar;
}
}
Cytat
stosuj kompozycję obiektów, zamiast dziedziczenia (rozumiem, że ren punkt sie odnosi do nadmiernego uzywania extends tak?)
To się odnosi do jeden z fundamentalnych zasad OOP - rozumienia relacji pomiędzy obiektami/klasami. Kompozycja to relacja typu
has a (posiada) - obiekt A posiada/wykorzystuje w swoim działaniu obiekt B. Dziedziczenie z kolei to relacja
is a (jest) - obiekt A jest wyspecjalizowaną formą obiektu B, ale z ideologicznego punktu widzenia są tym samym.