Количество аргументов в методах. ООП?

Доброго времени суток.


Перечитывая книгу Роберта Мартина, «Чистый Код», я нашёл очень интересные советы связанные с количеством аргументов в методах.

Всё сводится к тому, что нужно писать методы только с 1 (унарные), 2(бинарные) и 3 (тернарные) аргументами (ну и без аргументов тоже).


Всё что больше, нужно отсекать, да и тернарные функции писать очень редко.

Первое что я сделал после прочтения, начал смотреть свой код (много PHP :) ), и естественно нашёл множественное несоблюдение этому правилу.


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


Вопросы:

1. соблюдаете ли вы советы Мартина по количеству аргументов в методах?

2. случались ли у вас проблемы или просто ненужные затраты времени связанные с этой проблемой?

3. при рефакторинге тестов, является ли для вас увеличение количества аргументов проблемой?


И хотелось бы услышать просто мнение, узнать о чужом опыте.

Спасибо за внимание.
  • Вопрос задан
  • 8711 просмотров
Решения вопроса 1
renskiy
@renskiy
Следуя принципу Single Responsibility (кстати придуманный как раз Робертом Мартином) при описании методов, количество аргументов действительно редко превышает значения 1.

Вообще, читая такие книги надо всегда обращать внимание на то, что написано мелким шрифтом (обычно под громким заголовком). Думаю, написав целую книгу советов о программировании, Мартин должен был объяснить исходя из каких соображений он дает такие советы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 7
nazarpc
@nazarpc
Open Source enthusiast
В большинстве — да, но есть методы, которые принимают 4-5 аргументов, и я не вижу в этом ничего плохого.
Все подобные правила — на самом деле рекомендации, которым нельзя следовать отключая собственную логику и здравый смысл.
Ответ написан
Комментировать
deleted-mifki
@deleted-mifki
Интересно, авторы всех этих книженций действительно думают, что количество аргументов в методах и прочие аттрибуты «хорошего кода» имеют хоть какое-то отношение к качеству конечного продукта?
Ответ написан
Читая эту книгу нужно иметь ввиду что она написана для объектно-ориентированного языка программирования. В ООП данные могут передаваться в конструкторе, сеттере и в самих методах. Т.е. аргументы метода относятся непосредственно к методу. Если аргументов много то их можно объединить в какой-нибудь класс типа <бизнесметод>.
Ответ написан
Комментировать
EugeneOZ
@EugeneOZ
1. Да. Исключение — конструкторы.
2. Конечно — чем больше аргументов, тем сложнее рефакторить использование этого метода. Растёт в геометрической прогрессии.
3. Да

Если у метода 1-2 аргумента, его назначение можно полностью описать его названием так, чтобы из названия было понятно, что ему нужно передать и как это будет использоваться. Например: sendEmail(email), setPasswordForUser(password, user). А читаемость кода это очень, очень важный фактор.
Ответ написан
IDOL1234
@IDOL1234
Если следуете этому правилу, создавая обёртки для однотипных переменных (например, Point), оставляйте функцию с исходным набором параметров. Очень часто приходится видеть вещи вида
setPlayerCoord(new Point(1, 2, 3));
Ответ написан
Комментировать
Основное мое правило — метод должен как можно меньше распылятся: выполнять явную задачу. При таком подходе кол-во аргументов точно не превысит максимальное по Мартину.

И да, что по поводу массива который сойдет за один аргумент с кучей значений?
Ответ написан
@anitspam
Одним из видов кода с большим количеством аргументов — это получение данных из базы. В нём можно на практике увидеть, почему большое количество аргументов — это плохо.

habrahabr.ru/post/154245/#comment_5254885
//Получаем запись
abstract public function getRecords($what='*',$where=NULL, $limit=NULL, $order=NULL,$join=NULL,$debug=false);

самое интересное начинается, когда сортируем чаще, чем ограничиваем и решаем поменять параметры $limit и $order местами. или когда решаем добавить ещё один параметр, который ставится после $debug. или когда решаем переделать список параметров на параметр в виде массив. или когда…
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы