W umowach inżynierii oprogramowania są cenniejsze niż ich implementacje.
Oto kilka powodów:
można przetestować klas, które zależą od interfejsu nie opierając się na implementacji interfejsu (który sam może być wadliwy). Przykład z PHPUnit:
//Will return an object of this type with all the methods returning null. You can do more things with the mock builder as well
$mockInterface = $this->getMockBuilder("MyInterface")->getMock();
$class = new ClassWhichRequiresInterface($mockInterface);
//Test class using the mock
Można napisać klasy, która używa umowę bez konieczności implementacji np
function dependentFunction(MyInterface $interface) {
$interface->contractMethod(); // Assume it's there even though it's not yet implemented.
}
Mieć jedną umowę, ale wiele wdrożeń.
interface FTPUploader { /* Contract */ }
class SFTPUploader implements FTPUploader { /* Method implementation */ }
class FTPSUploader implements FTPUploader { /* Method implementation */ }
laravel oferuje wsparcie ostatnim użyciu jego Container Service następująco:
$app->bind(FTPUploader::class, SFTPUploader::class);
resolve(FTPUploader::class); //Gets an SFTPUploader object
Potem jest również fakt, że jej łatwiej udokumentować interfejsy ponieważ nie ma rzeczywiste implementacje tam tak nadal są czytelne.
W kontraktach inżynierii oprogramowania są cenniejsze niż ich implementacje. Możesz napisać klasę, która używa wieku umowy, zanim ktoś faktycznie stworzy implementację umowy i nadal będzie mógł ją przetestować przez kpiny. Istnieje wiele różnych implementacji (np. Buforowanie umowy za pomocą pliku, redis, db itp.). – apokryfos
. Więc Laravel stworzył interfejsy, aby napisać testy przed wprowadzeniem implementacji? –
Dlaczego twórca laravel napisał interfejsy to dla niego pytanie. Mogę tylko powiedzieć, że pisanie interfejsów to po prostu dobra praktyka kodowania dla dużego projektu oprogramowania. – apokryfos