РЕДАКТИРОВАТЬ: Обновлен ответ, чтобы соответствовать вопросу
Вызовы функций выполняются медленнее, чем циклы, то есть, например, создание цепочки, например, метода addRecipient()
, значительно снижает производительность по сравнению с вызовом метода addRecipients()
, который принимает массив, который затем обрабатывается в цикле.
Кроме того, более сложный метод, соединяющийся в цепочку с текущими API, может потребовать дополнительного учета данных, связанных с последним вызванным методом, чтобы следующий вызов мог продолжить работу с этими данными, поскольку все методы возвращают один и тот же объект, на котором построена цепочка ,
Давайте посмотрим на ваш пример:
...
->With(22, 'TAL')
->With(38, 'HPK')->Skippable()
->With(2, 'LGV')
...
Это требует, чтобы вы помнили, что Skippable()
должен применяться к (38, 'HPK')
вместо (22, 'TAL')
.
Вы вряд ли заметите снижение производительности, если только ваш код не будет вызываться очень часто в цикле или когда у вас так много одновременных запросов к вашему веб-серверу, что он приближается к своим пределам (что имеет место для тяжелых загружать сайты).
Другим аспектом является то, что шаблон цепочки методов обеспечивает использование исключений для сообщений об ошибках (что я не говорю, что это плохо, просто оно отличается от классического стиля кодирования «вызов и проверка функции»).
Однако обычно существуют функции, которые дают другие значения, отличные от объекта, которому они принадлежат (например, те, которые возвращают статус объекта и методов доступа).
Важно, чтобы пользователь вашего API мог определять, какие функции являются цепочечными, а какие нет, и при этом не нужно обращаться к документации каждый раз, когда он встречает новый метод (например, руководство, которое говорит, что все мутаторы и только мутаторы поддерживают сцепление).
Ответ на оригинальный вопрос:
[...] Проблемы с цепочкой, которые у меня возникают, заключаются в том, что вы не можете выполнить дополнительную проверку [...]
Альтернативно, реализуйте специальный метод проверки, который вы вызываете после установки всех свойств, и он возвращает вам массив ошибок проверки (которые могут быть простыми строками или объектами, например с именем ValidationFailure
).