Могу также ответить на это, поскольку вы зашли так далеко, что отправили мне электронное письмо;)
Во-первых, является ли user_service () подходящим именем класса для моей модели user () или есть другой стандарт?
Это приемлемо. Однако вам лучше использовать одно из установленных соглашений по кодированию PHP, такое как соглашения PEAR или ZF. В обоих случаях имена классов UpperCamelCase
и имена методов lowerCamelCase
. Используя это, классы будут User
и UserService
Поскольку методы в моем сервисе будут выполнять только одну задачу, правильно ли считать, что они всегда могут быть статическими функциями? Класс обслуживания не представляет данные, а представляет собой последовательность действий, поэтому это представляется целесообразным.
Нет. Создавать методы статично - плохой выбор, и это относится к большинству кода, а не только к сервисам. Одна из главных причин в случае службы заключается в том, что обычно вашей службе необходимо взаимодействовать с хранилищем данных или другим классом, представляющим уровень данных (хранилище, объект доступа к данным и т. Д.).
Если в вашем сервисе есть статические методы, это означает, что вам нужно будет создавать свои зависимости в своих методах. Это, в свою очередь, означает, что, среди прочего, код становится сложным для тестирования, поскольку вы не можете легко заменить зависимости.
Здесь хорошо читается, например, здесь (На самом деле почти все в этом блоге хорошо читается разработчиками программного обеспечения)
Должен ли метод службы принимать только один аргумент, который будет массивом?
Это зависит от того, что делает метод. Если предположить, что вы обрабатываете набор результатов формы, то да, это, вероятно, будет работать. В другом случае это может быть плохой выбор.
Я могу добавить другое поле в мою форму, и мне не придется обновлять контроллер, только сервис. [...]
Если бы я не передавал массив, я мог бы установить функции с несколькими аргументами. [...]
Да, на мой взгляд, ваша аргументация в отношении этих двух случаев довольно полезна для этого варианта использования.
Я мог бы передать объект, но имеет ли это смысл? Если я создаю объект, это должен быть объект, который он представляет (в данном случае, пользователь), верно? Но имеет ли смысл, что контроллер создает объект пользователя? Разве это не весь смысл сервисного уровня?
Это зависит. Например, если вы использовали каркас, который позволяет вам представлять формы как объекты (такие как Zend Framework и Zend_Form ), вы можете рассмотреть возможность передачи объекта формы прямо в сервис.
Возможно, есть аргумент для того, чтобы иметь несколько методов с несколькими аргументами (когда их всего от одного до трех) и некоторые методы, которые принимают массив (когда есть много полей). Это просто может показаться кошмаром, так как вам всегда нужно обращаться к классу, чтобы узнать, о чем просил этот конкретный метод.
Обычно вы должны стремиться сделать параметры хотя бы наполовину угадываемыми на основе имени метода. В , над которым я работаю , у нас есть модель, которая имеет, например, предприятия и продукты, где бизнес может спонсировать продукт. В ProductService
у нас есть метод под названием sponsorProduct
, который принимает бизнес и продукт в качестве параметров. Вы можете в значительной степени догадаться, что это займет эти два (если вы все равно были знакомы с кодовой базой)
Среда IDE, как правило, также помогает вам в этом - она предоставляет помощник по коду, который отображает, что принимают функции params. Это одна из основных причин, по которой я считаю, что IDE очень полезны в больших проектах, где вы не всегда можете вспомнить, что именно нужно определенной функции в качестве параметров.
Что касается количества параметров, я думаю, что обычно вы должны попытаться использовать отдельные параметры. Это позволяет любому легко увидеть, какие параметры требуются, просто взглянув на сигнатуру функции, и позволяет довольно легко определять шрифты и значения по умолчанию.
Однако есть момент, когда вы получаете столько параметров, что это слишком много. Это может быть +5 или около того, в зависимости от того, какой это метод. В этом случае вы можете использовать массив или объект Parameter Object, который по сути является объектом, содержащим все параметры для вызова. Подробнее об объектах параметров здесь