Смерть булевским аргументам!
От: jazzer Россия Skype: enerjazzer
Дата: 09.09.09 22:33
Оценка: 4 (1) +1
Robert C. Martin's Clean Code Tip #12: Eliminate Boolean Arguments
http://www.informit.com/articles/article.aspx?p=1392524
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Смерть булевским аргументам!
От: K13 http://akvis.com
Дата: 10.09.09 03:21
Оценка:
J>Robert C. Martin's Clean Code Tip #12: Eliminate Boolean Arguments
J>http://www.informit.com/articles/article.aspx?p=1392524

В случае единственного параметра bool никуда девать не надо.
set_visible( true );

А так — согласен, enum гораздо понятнее.
Re[2]: Смерть булевским аргументам!
От: IT Россия linq2db.com
Дата: 10.09.09 03:23
Оценка: 1 (1) +2
Здравствуйте, K13, Вы писали:

K13>А так — согласен, enum гораздо понятнее.


Или именованные параметры.
//rsdn.org/forum/images/bis.gif Если нам не помогут, то мы тоже никого не пощадим.
Re: Смерть булевским аргументам!
От: wallaby  
Дата: 10.09.09 04:24
Оценка: 1 (1) +4
Здравствуйте, jazzer, Вы писали:

J>Robert C. Martin's Clean Code Tip #12: Eliminate Boolean Arguments

J>http://www.informit.com/articles/article.aspx?p=1392524

Так много слов для одной простой мысли:
Вместо одной функции с булевым аргументом часто правильнее использовать две функции.
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true
Re: Смерть булевским аргументам!
От: igna Россия  
Дата: 10.09.09 04:41
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Robert C. Martin's Clean Code Tip #12: Eliminate Boolean Arguments

J>http://www.informit.com/articles/article.aspx?p=1392524

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

Все в сослагательном наклонении, потому-что конкретная проблема надумана, аргумент конечно же должен задаваться в радианах. Кому нужно, пусть преобразовывает градусы в радианы перед вызовом, например так:

    int status = controlRod.rotate(fromDegree(30))


Хотя на Java скорее нужно будет дополнительно указать имя класса, зато код станет законченно объектно-ориентированным :

    int status = controlRod.rotate(AngleConversion.fromDegree(30))


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

PS. Этот автор у тебя тоже в числе экспертов?
Re[2]: Смерть булевским аргументам!
От: igna Россия  
Дата: 10.09.09 04:45
Оценка:
Здравствуйте, wallaby, Вы писали:

W>Так много слов для одной простой мысли:


Согласен, там словоблудие. И ведь приходится читать, чтобы убедиться, что автор не спрятал хоть какую-нибудь полувменяемую мыслишку среди строк. Но не спрятал.
Re[2]: Смерть булевским аргументам!
От: Константин Б. Россия  
Дата: 10.09.09 09:02
Оценка:
Здравствуйте, wallaby, Вы писали:

W>Здравствуйте, jazzer, Вы писали:


J>>Robert C. Martin's Clean Code Tip #12: Eliminate Boolean Arguments

J>>http://www.informit.com/articles/article.aspx?p=1392524

W>Так много слов для одной простой мысли:

W>Вместо одной функции с булевым аргументом часто правильнее использовать две функции.

Или например:
Вместо magic number'ов правильнее использовать именованые константы или енумы.

Кому как больше нравится
Re[3]: Смерть булевским аргументам!
От: Flying Dutchman Украина  
Дата: 10.09.09 09:09
Оценка: +1
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, K13, Вы писали:


K13>>А так — согласен, enum гораздо понятнее.


IT>Или именованные параметры.


Еще можно использовать константы, примерно так:

  const bool Radians = true;
  ...
  int status = fuelRod.rotate(0.5, Radians);


Я как-то учавствовал в проекте, в котором все числа, строки и т.д. должны были предварительно определены как константы (за исключением чисел 0 и 1). Очень разумное правило.
http://www.linkedin.com/img/webpromo/btn_liprofile_blue_80x15.gif
Re[2]: Смерть булевским аргументам!
От: jazzer Россия Skype: enerjazzer
Дата: 10.09.09 09:38
Оценка:
Здравствуйте, wallaby, Вы писали:

W>Так много слов для одной простой мысли:

W>Вместо одной функции с булевым аргументом часто правильнее использовать две функции.
+1

ну так одну простую мысль в голом виде высказывать бесполезно, ее уже все высказали по многу раз
А тут — наглядный пример.

В качестве иллюстрации для начинающих программеров — самое оно.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Смерть булевским аргументам!
От: igna Россия  
Дата: 10.09.09 09:39
Оценка:
Здравствуйте, Flying Dutchman, Вы писали:

FD>Еще можно использовать константы, примерно так:


FD>  const bool Radians = true;
FD>  ...
FD>  int status = fuelRod.rotate(0.5, Radians);


Так у него true то радианы, то градусы означает:

    int status = controlRod.rotate(30, Radians); // Здесь твоя константа Radians означает градусы
Re[2]: Смерть булевским аргументам!
От: jazzer Россия Skype: enerjazzer
Дата: 10.09.09 09:47
Оценка: +1
Здравствуйте, igna, Вы писали:

I>В рассматриваемом случае и при использовании языка, позволяющего определять свои типы, не уступающие по эффективности встроенным, можно было бы просто определить типы degree и radian, и тогда можно было бы и булевый параметр убрать, и метод/функцию переименовывать не пришлось бы.

+1

I>Все в сослагательном наклонении, потому-что конкретная проблема надумана, аргумент конечно же должен задаваться в радианах.

Можете выбрать любой цвет, при условии что вы выбираете черный
Не все так однозначно.
Градусы хороши своей целочисленностью.

I>Возможно стоит добавить, что это преобразование нужно выполнять только при вводе информации от пользователя, внутри программа должна иметь дело только с радианами.

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

I>PS. Этот автор у тебя тоже в числе экспертов?

Я *там* в качестве эксперта упоминал Глассборо — есть сомнения, что он эксперт? Тот, кого ты *там* нашел, я впервые увидел. Ладно, здесь это офтопик в любом случае.
А эта конкретная статья в RSS прилетела, посмеялся, пока читал, решил сюда запостить.
Надеюсь, что вы тоже посмеялись.

С другой стороны, хоть и смешно, но проблема реальная: во многих признанных API (в винде, например) булевские переменные летают только в путь, в результате смотришь в вызов функции с пятью true, как дурак, и пытаешься понять, что же они все означают.
Так что мысль вроде как и очевидна, да, видать, лень побеждает — bool же проще сунуть, чем целое перечисление объявлять или вообще специальный полноценный тип ваять.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Смерть булевским аргументам!
От: igna Россия  
Дата: 10.09.09 10:04
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Градусы хороши своей целочисленностью.


Ась? Полградуса тоже бывают.

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


Относится, но не тоже.

J>С другой стороны, хоть и смешно, но проблема реальная: во многих признанных API (в винде, например) булевские переменные летают только в путь, в результате смотришь в вызов функции с пятью true, как дурак, и пытаешься понять, что же они все означают.

J>Так что мысль вроде как и очевидна, да, видать, лень побеждает — bool же проще сунуть, чем целое перечисление объявлять или вообще специальный полноценный тип ваять.

IMHO в Windows API проблема другая, многие функции этого API выполняет несколько эээ ... функций, отсюда и неприятности. А сами по себе булевые параметры ничуть не хуже, к примеру, параметров целых; и те, и другие можно перепутать. Но сторонников определять типы вроде XCoordinate, YCoordinate, XDistance и YDistance, которые нельзя просто по ошибке использовать друг вместо друга, немного.
Re[3]: По поводу финансовых программ
От: igna Россия  
Дата: 10.09.09 10:08
Оценка:
Здравствуйте, jazzer, Вы писали:

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


Кстати, а что, все же есть финансовые программы, которые хранят цены как float? Никогда подобными вещами не занимался, но вроде это расхожий пример неправильного выбора типа.
Re: Смерть булевским аргументам!
От: Pavel Dvorkin Россия  
Дата: 10.09.09 10:52
Оценка: -1
Здравствуйте, jazzer, Вы писали:

J>Robert C. Martin's Clean Code Tip #12: Eliminate Boolean Arguments

J>http://www.informit.com/articles/article.aspx?p=1392524

Кое-что по существу верно, но вообще — проблема ИМХО не стоит выеденного яйца. Пустяками заниматься изволим
With best regards
Pavel Dvorkin
Re[4]: По поводу финансовых программ
От: jazzer Россия Skype: enerjazzer
Дата: 10.09.09 10:58
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, jazzer, Вы писали:


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


I>Кстати, а что, все же есть финансовые программы, которые хранят цены как float? Никогда подобными вещами не занимался, но вроде это расхожий пример неправильного выбора типа.


Есть, конечно.
Зависит от задачи.
Финансовые программы очень разные бывают.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Смерть булевским аргументам!
От: Pro100Oleh Украина  
Дата: 10.09.09 12:50
Оценка:
В чем прелесть bool — в том что он гарантированно может хранить лишь два значения, отчего код по анализу параметра будет проще:

        public void TestBool(bool arg)
        {
            if (arg)
            {
                Console.WriteLine("first situation");
            }
            else
            {
                Console.WriteLine("second situation");
            }
        }

        public enum MyEnum
        {
            FirstSituation,
            SecondSituation
        }

        public void TestEnum(MyEnum situation)
        {
            switch (situation)
            {
                case MyEnum.FirstSituation:
                    Console.WriteLine("first situation");
                    break;
                case MyEnum.SecondSituation:
                    Console.WriteLine("second situation");
                    break;
                default:
                    throw new Exception("Unknown situation");
            }
        }
Pro
Re[2]: Смерть булевским аргументам!
От: samius Россия http://sams-tricks.blogspot.com
Дата: 10.09.09 13:20
Оценка: :)
Здравствуйте, Pro100Oleh, Вы писали:

PO>В чем прелесть bool — в том что он гарантированно может хранить лишь два значения, отчего код по анализу параметра будет проще:


нет такой гарантии
static unsafe void Main(string[] args)
{
    int x = 0x03;
    bool b = *(bool*)(void*)(&x);
    Console.WriteLine(*(int*)(void*)(&b)); // 3

    Console.WriteLine(b == false);         // False
    bool b2 = true;
    Console.WriteLine(b == b2);            // False
}

Недавно эта тема обсасывалась на rsdn.
Re[3]: Смерть булевским аргументам!
От: samius Россия http://sams-tricks.blogspot.com
Дата: 10.09.09 13:29
Оценка:
Здравствуйте, samius, Вы писали:

S>нет такой гарантии

S>Недавно эта тема обсасывалась на rsdn.
здесь
Автор: Пельмешко
Дата: 20.07.09
Re[5]: Смерть булевским аргументам!
От: Flying Dutchman Украина  
Дата: 10.09.09 14:17
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Flying Dutchman, Вы писали:


FD>>Еще можно использовать константы, примерно так:


I>
FD>>  const bool Radians = true;
FD>>  ...
FD>>  int status = fuelRod.rotate(0.5, Radians);
I>


I>Так у него true то радианы, то градусы означает:


I>
I>    int status = controlRod.rotate(30, Radians); // Здесь твоя константа Radians означает градусы
I>


Да, тяжелый случай. По-хорошему надо код отрефакторить, а пока этого не сделано, завести две константы: FuelRadians и ControlRadians.
http://www.linkedin.com/img/webpromo/btn_liprofile_blue_80x15.gif
Re[4]: Смерть булевским аргументам!
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 10.09.09 15:49
Оценка:
Здравствуйте, Flying Dutchman, Вы писали:

FD>Еще можно использовать константы, примерно так:


FD>
FD>  const bool Radians = true;
FD>  ...
FD>  int status = fuelRod.rotate(0.5, Radians);
FD>


Имхо, лучше так:

const bool Radians = true;
...
int status = fuelRod.rotate(0.5 * ONE_RADIAN);
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.