2010-10-02 2 views
5

Есть ли правило, когда нужно использовать две функции или когда нужно передать логический параметр.Две функции или логический параметр?

Благодаря

+2

Что это значит? Можете ли вы привести пример кода? – NullUserException

+0

Да, есть много правил. Все они противоречивы, и все они - вопрос личного (или командного) предпочтения. Мое личное правило прост: если я чувствую необходимость добавления комментариев к методу или вызова метода, мне нужно его изменить. – Tergiver

ответ

7

Это было некоторое время, так как я в последний раз перечитайте Совершенный код, но я смутно помню Макконнелл решения этого вопроса, и слова «дизъюнктивной 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 */) 

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

4

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

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

Вместо всегда заставить программиста быть явно:

Использование перечислений дать содержательные описания для различения или просто использовать отдельные функции.

Сравнить:

WriteFile(path, "Hello, World", true) 

с

WriteFile(path, "Hello, World", FileMode.Append) 

или просто

AppendFile(path, "Hello, World") 
+2

Обратите внимание, что это не относится к языкам с именованными параметрами. 'WriteFile (Append: True)', вероятно, читается как 'WriteFile (Mode: FileMode.Append)'. – sepp2k

+0

@ sepp2k: Правда, хотя мне не нравится подход с именованным параметром - несмотря на то, что он многословен, потому что их использование не применяется, и, следовательно, все еще могут иметь место бессмысленные параметры (например, из-за лени). Создание аргументов в именах компульсивных улучшит ситуацию, но, вероятно, уменьшит возможности абстракции (функции более высокого порядка, делегаты, частичное приложение, негласное программирование). В этом случае также предпочтительными являются сильные типы или различные функции. – Dario

Смежные вопросы