Уровень обслуживания приложений - как написать интерфейсы методов API
-
28-09-2019 - |
Вопрос
Как люди разрабатывают свои интерфейсы уровня обслуживания?
Я программирую большое веб-приложение (на 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) {...}
Его очиститель и не требуется никаких предположений.