Frage

Wie gestalten Menschen ihre Service-Layer-Schnittstellen?

Ich programmiere eine große Web-Anwendung (in PHP) und wir MVC verwenden und Programmierung dünne Controller z.B. (Pseudo-Code folgt)

public savePersonAction() {
    $input = filter($_GET);
    ... input validation ...

    $result = $this->_service->savePerson( ? );

    ... etc
}

Should savePerson in dem Dienst nimmt ein Argument der gesamten $ Input-Struktur oder Kontextes (in PHP, ein assoziatives Array)?

z. dies -

public function savePerson(array $input) {

oder sollte man alle die Eingabefelder trennen und bieten eine „harte“ Schnittstelle z.

public function savePerson($title, $firstName, $lastName, $dateOfBirth, ... etc.. for many more) {

Danke.

Paul

War es hilfreich?

Lösung

Wenn Sie vorhaben, die MVC-Geist Ihrer savePerson Methode zu folgen, soll nicht die rohe Eingabe akzeptieren. Es sollte nicht direkt mit dem Format der Daten gekoppelt wird aus dem ui kommen. Stattdessen sollten sie Eingang in den Bedingungen Ihrer Servicedomäne, wie ein „Person“ Objekt definiert akzeptieren. (Dies könnte nur ein assoziatives Array vorgeschlagen wie Cobby sein). Es wäre die Aufgabe des Aktionsmethode des Controllers die rohe Eingabe in das Format, das von dem Dienst erforderlich abzubilden.

Der Vorteil dieses zusätzlichen Übersetzungsschrittes ist, dass es Ihr Service-Isolaten (Modell) von der ui. Wenn Sie eine andere ui implementieren, müssen Sie nicht die Service-Schnittstelle ändern. Sie müssen nur neue Controller schreiben (und Ansichten, natürlich).

Während Ihr Beispiel wie savePerson($title, $firstName, $lastName...) die richtige Idee ist, es ist in der Regel ein schlechtes Zeichen, wenn Sie haben Methoden mit mehr als 2 oder 3 Argumenten. Sie sollten, um verwandte Argumente in eine Art übergeordnete Objekt der Lage sein.

Andere Tipps

Meine MVC-Anwendungen sind wie folgt strukturiert: Controller -> Service -> ORM / andere Bibliothek

Um Ihre Frage zu beantworten, in der Regel in Ihrem Controller werden Sie Formulardaten als Array bekommen, das heißt $ form-> getValues ??() oder etwas ähnliches. In Bezug auf der Wartbarkeit ist es am besten, wenn Ihre Dienste außer Arrays als Argumente, auf diese Weise, wenn Sie ein anderes Feld zu einem Formular hinzufügen, müssen Sie nur das Formular zu aktualisieren und den Service, den Controller kann unberührt bleiben und immer noch arbeiten.

Also ich denke, mit dem ersten Beispiel gehen:

public function savePerson($personArray);

Darüber hinaus sollten Sie keine „harte“ Schnittstelle benötigen, weil Sie Ihre Formularbibliothek kümmern wird die Validierung / filteration / sanitization so können wir davon ausgehen, dass die assoziative Arrays gültig sein wird, sowie die Methodendefinition wird lächerlich lange erhalten mit dem Namen Parameter.

Ich möchte alle die Eingabefelder trennen und bieten eine „harte“ Schnittstelle in Service z.

public function savePerson($title, $firstName, $lastName, $dateOfBirth) {...}

Sein sauberer und es gibt keine Annahmen erforderlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top