Есть ли правило, когда нужно использовать две функции или когда нужно передать логический параметр.Две функции или логический параметр?
Благодаря
Есть ли правило, когда нужно использовать две функции или когда нужно передать логический параметр.Две функции или логический параметр?
Благодаря
Это было некоторое время, так как я в последний раз перечитайте Совершенный код, но я смутно помню Макконнелл решения этого вопроса, и слова «дизъюнктивной conherence» поп в моей голове. Вкратце,
void f(int x, int y, bool b)
против
void f1(int x, int y)
void f2(int x, int y)
часто выбор, и в зависимости от того, как быть одинаковыми или разными f
будет вести себя под true
против false
, это может иметь смысл разбить его на две функции и дать им отличные имена. Часто нужен третий вариант, который должен изменить bool
на двухзначное перечисление, где имя перечисления делает различие понятным.
Ключ должен посмотреть на сайты вызовов и посмотреть, ясно ли смысл, просто прочитав код. Если вы склонны поставить комментарий на каждом булевом вызов сайте:
f(3, 4, true /* absoluteWidgetMode */)
и призывные сайты обычно называют с булевыми константами, что сильный запах, который вы должны разбить его на несколько функций.
Булевы параметры бессмысленнымибольшую часть времени, в основном заслуживающий же критика магические числа делать. У вас нет шансов не понимать, что делается, просто глядя на вызов функции.
Таким образом, даже если для очень похожих кодов (добавление/перезапись файла) удобно иметь логический параметр (добавление/переписывание файла), сохраните его как внутреннее, личное и не позволяйте этому быть видимым в интерфейсе.
Вместо всегда заставить программиста быть явно:
Использование перечислений дать содержательные описания для различения или просто использовать отдельные функции.
Сравнить:
WriteFile(path, "Hello, World", true)
с
WriteFile(path, "Hello, World", FileMode.Append)
или просто
AppendFile(path, "Hello, World")
Обратите внимание, что это не относится к языкам с именованными параметрами. 'WriteFile (Append: True)', вероятно, читается как 'WriteFile (Mode: FileMode.Append)'. – sepp2k
@ sepp2k: Правда, хотя мне не нравится подход с именованным параметром - несмотря на то, что он многословен, потому что их использование не применяется, и, следовательно, все еще могут иметь место бессмысленные параметры (например, из-за лени). Создание аргументов в именах компульсивных улучшит ситуацию, но, вероятно, уменьшит возможности абстракции (функции более высокого порядка, делегаты, частичное приложение, негласное программирование). В этом случае также предпочтительными являются сильные типы или различные функции. – Dario
Что это значит? Можете ли вы привести пример кода? – NullUserException
Да, есть много правил. Все они противоречивы, и все они - вопрос личного (или командного) предпочтения. Мое личное правило прост: если я чувствую необходимость добавления комментариев к методу или вызова метода, мне нужно его изменить. – Tergiver