Должны ли функции, которые только выводят, возвращать что-нибудь? - PullRequest
2 голосов
/ 31 марта 2009

Я переписываю ряд функций PHP в контейнерный класс. Многие из этих функций выполняют небольшую обработку, но, в конце концов, просто выводят содержимое в STDOUT.

У меня вопрос: должно ли быть возвращаемое значение в этих функциях? Существует ли «наилучшая практика» в этом отношении?

Ответы [ 9 ]

4 голосов
/ 31 марта 2009

В системах, которые сообщают об ошибках, главным образом, через исключения, не возвращайте возвращаемое значение, если его нет.

В системах, которые используют возвращаемые значения для обозначения ошибок, полезно, чтобы все функции возвращали код ошибки. Таким образом, пользователь может просто предположить, что каждая функция возвращает код ошибки, и разработать шаблон для проверки того, что они следуют повсюду. Даже если функция никогда не сможет выйти из строя прямо сейчас, верните код успеха. Таким образом, если в будущем изменение может привести к ошибке, пользователи уже будут проверять ошибки, а не молча игнорировать их (и запутываться, почему система ведет себя странно).

4 голосов
/ 31 марта 2009

Может ли обработка завершиться неудачно? Если да, должен ли звонящий знать об этом? Если одного из них нет, то я не вижу значения в возврате. Однако, если обработка может завершиться неудачей и это может изменить ситуацию для вызывающей стороны, я бы предложил вернуть код состояния или ошибки.

2 голосов
/ 31 марта 2009

Не возвращать значение, если нет значения для возврата. Если у вас есть какое-то значение, которое нужно передать вызывающей стороне, верните его, но в данном случае это не похоже на случай.

1 голос
/ 31 марта 2009

Чтобы сделать «правильную» вещь, если целью метода является только печать данных, то он не должен ничего возвращать.

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

В конце концов, выбор за вами. Я бы сказал, это зависит от того, насколько вы «пурист» относитесь к таким вещам.

1 голос
/ 31 марта 2009

Обратите внимание, что в C / C ++ функции вывода (включая printf () ) возвращают количество записанных байтов или -1, если это не удается. Возможно, стоит изучить это дальше, чтобы понять, почему это было сделано так. Признаюсь, что

  1. Я не уверен, что запись в stdout может практически завершиться неудачей (если вы активно не закроете свой поток STDOUT)
  2. Я никогда не видел, чтобы кто-нибудь собирал это значение, не говоря уже о том, чтобы что-то с ним делать.

Обратите внимание, что это отличается от записи в файловые потоки - я не считаю перенаправление потоков в оболочке.

1 голос
/ 31 марта 2009

Я часто буду "возвращаться: правда;" в этих случаях, поскольку это обеспечивает способ проверить, что функция работала. Не уверен насчет лучших практик.

0 голосов
/ 31 марта 2009

Нет необходимости возвращать что-либо или даже иметь оператор возврата. Это фактически пустая функция, и она достаточно понятна, чтобы они не возвращали значения. Ввод «возврата»; только для есть возвращаемое утверждение - шум ради педантичности.

0 голосов
/ 31 марта 2009

По моему мнению, SRP (принцип единой ответственности) применим и к методам / функциям, а не только к объектам. Один метод должен делать одну вещь: если он выводит данные, он не должен обрабатывать данные - если он не выполняет обработку, он не должен возвращать данные.

0 голосов
/ 31 марта 2009

Вы должны просто:

return;
...