Уровень обслуживания приложений - как написать интерфейсы методов API

StackOverflow https://stackoverflow.com/questions/4093174

Вопрос

Как люди разрабатывают свои интерфейсы уровня обслуживания?

Я программирую большое веб-приложение (на PHP), и мы используем MVC и программируем тонкие контроллеры, например(далее следует псевдокод)

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

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

    ... etc
}

Должен ли savePerson в сервисе принимать аргумент всей структуры $input или контекста (в PHP ассоциативный массив)?

Например.это -

public function savePerson(array $input) {

или следует выделить все поля ввода и предоставить "жесткий" интерфейс, например

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

Спасибо.

Пол

Это было полезно?

Решение

Если вы собираетесь следовать духу MVC savePerson Метод не должен принимать сырье. Не следует напрямую связано с форматом данных, поступающих от UI. Вместо этого он должен принимать входные данные, определенные в условиях вашего сервисного домена, как объект «лица». (Это может быть просто ассоциативный массив, как предложил Кобби). Это будет работа метода действия контроллера для отображения необработанного входа в формат, требуемый сервисом.

Преимущество этого дополнительного шага перевода состоит в том, что он выделяет ваш сервис (модель) от UI. Если вы реализуете другой пользовательский интерфейс, вам не нужно менять сервисный интерфейс. Вам просто нужно писать новые контроллеры (и взгляды, конечно).

В то время как ваш пример savePerson($title, $firstName, $lastName...) Это правильная идея, это обычно плохой знак, когда у вас есть методы с более чем 2 или 3 аргументами. Вы должны иметь возможность группировать связанные аргументы в какой-то объект более высокого уровня.

Другие советы

Мои приложения MVC структурированы следующим образом:Контроллер -> Сервис -> ORM / другая библиотека

Чтобы ответить на ваш вопрос, обычно в вашем контроллере вы будете получать данные формы в виде массива, т.е.$form->getValues() или что-то подобное.С точки зрения ремонтопригодности лучше всего, если ваши сервисы используют массивы в качестве аргументов, таким образом, если вы добавите еще одно поле в форму, вам нужно будет только обновить форму и сервис, ваш контроллер может остаться нетронутым и продолжать работать.

Поэтому я думаю, что перейдем к вашему первому примеру:

public function savePerson($personArray);

Кроме того, вам не нужен "жесткий" интерфейс, потому что ваша библиотека форм позаботится о проверке / фильтрации / санитарной обработке, поэтому мы можем предположить, что ассоциативный массив будет действительным, плюс определение метода станет смехотворно длинным с именованными параметрами.

Я бы разделил все поля ввода и предоставляю «жесткий» интерфейс в сервисе, например,

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

Его очиститель и не требуется никаких предположений.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top