Re: Булевские параметры методов
От: Mamut Швеция http://dmitriid.com
Дата: 30.12.11 20:55
Оценка:
SV.>Можете ли вы привести пример, когда булевский параметр метода вам действительно необходим?

Какой-нибудь

Storage -> retrieveObject(doNotCache = true)


Вполне может себе быть. Ситуация редкая, но возможная. Или такое:

Storage -> saveObject(ignoreValidation = true)


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


dmitriid.comGitHubLinkedIn
Re: Булевские параметры методов
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 31.12.11 02:09
Оценка:
Здравствуйте, SV., Вы писали:

SV.>Можете ли вы привести пример, когда булевский параметр метода вам действительно необходим?


Курить термин: "дизъюнктивная когерентность".
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[2]: Булевские параметры методов
От: _NN_ www.nemerleweb.com
Дата: 03.01.12 13:43
Оценка:
Здравствуйте, 0x7be, Вы писали:

0>Здравствуйте, SV., Вы писали:


SV.>>Можете ли вы привести пример, когда булевский параметр метода вам действительно необходим?

0>Таких ситуаций нет, хотя бы потому, что любую ситуацию, где используется булева переменная, модно переписать на использование какого-нибудь enum`а или int`a. Предлагаю изменить постановку вопроса на: "когда применение булевого параметра было бы оптимальным".

Возьмем С++:

Было :
void DoSomething(bool flag)
{
  if (flag)
    DoSomethingNow();
  else
    DoSomethingLater();
}


Стало:
enum DoFlag
{
  DO_FLAG_NOW,
  DO_FLAG_LATER,
}

void DoSomething(DoFlag flag)
{
  switch (flag)
  {
    case DO_FLAG_NOW:
      DoSomethingNow();
      break;
    case DO_FLAG_LATER:
      DoSomethingLater();
      break;
    default:
      // Must never get here
      assert(false);
      break;
  }
}


Иногда это оправданно, иногда нет.

P.S.
enum class из С++11 не всем доступен.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Булевские параметры методов
От: 0x7be СССР  
Дата: 03.01.12 13:57
Оценка:
Здравствуйте, _NN_, Вы писали:

enum DoFlag
{
  DO_FLAG_NOW,
  DO_FLAG_LATER,
}

void DoSomething(DoFlag flag)
{
  if (flag == DO_FLAG_NOW)
    DoSomethingNow();
  else
    DoSomethingLater();
}

Не?
Re[4]: Булевские параметры методов
От: _NN_ www.nemerleweb.com
Дата: 03.01.12 14:20
Оценка:
Здравствуйте, 0x7be, Вы писали:

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


0>
0>enum DoFlag
0>{
0>  DO_FLAG_NOW,
0>  DO_FLAG_LATER,
0>}

0>void DoSomething(DoFlag flag)
0>{
0>  if (flag == DO_FLAG_NOW)
0>    DoSomethingNow();
0>  else
0>    DoSomethingLater();
0>}
0>

0>Не?

Нет, конечно.

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

Это вам не ADT с сопоставлением с образцом.

А вот у bool может быть только 2 состояния и никак не больше.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: Булевские параметры методов
От: 0x7be СССР  
Дата: 03.01.12 14:44
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Нет, конечно.

_NN>Ведь enum DoFlag когда-то может быть изменен.
Значит это уже не аналог bool => в первом варианте использовать bool нельзя.
Re[2]: Булевские параметры методов
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 05.01.12 21:56
Оценка:
R3>
R3>public Font SetFontItalic(Font font, bool isItalic)
R3>

R3>Пойдёт?

это костыль языка
с точки зрения вызывающего кода намного естественнее смотрелась бы запись
var newFont1 = MergeFont(font, Italic);
//или
var newFont2 = MergeFont(font, !Italic);
//или
var newFont2 = MergeFont(font, !Italic + Bold);

при этом для понимания из какого enum-а брать Italic достаточно вывести тип выражения на основе типа параметра функции MergeFont (что, кстати, уже делает intellisence, но не делает компилятор)
Re: Булевские параметры методов
От: 24  
Дата: 05.01.12 22:25
Оценка:
Здравствуйте, SV., Вы писали:

SV.>Можете ли вы привести пример, когда булевский параметр метода вам действительно необходим?


PerformSomethingOnMainThread(Something something, bool waitUntilDone);

CreateTimer(double interval, bool repeats);

InitApplication(bool isFirstRun);


А что значит "действительно необходим"? В любом случае можно обойтись без него, используия целые числа 0 и 1, или содержательные енумы из двух элементов (Для первого примера — WAIT_UNTIL_DONE и DONT_WAIT_UNTIL_DONE). Но не проще ли использовать бул?
Re[3]: Булевские параметры методов
От: Sinclair Россия https://github.com/evilguest/
Дата: 06.01.12 05:50
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>это костыль языка

DG>с точки зрения вызывающего кода намного естественнее смотрелась бы запись
DG>
DG>var newFont1 = MergeFont(font, Italic);
DG>//или
DG>var newFont2 = MergeFont(font, !Italic);
DG>//или
DG>var newFont2 = MergeFont(font, !Italic + Bold);
DG>

DG>при этом для понимания из какого enum-а брать Italic достаточно вывести тип выражения на основе типа параметра функции MergeFont (что, кстати, уже делает intellisence, но не делает компилятор)
Или так:
font += Font.Italic;
font -= Font.Italic;
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Булевские параметры методов
От: SV.  
Дата: 06.01.12 07:00
Оценка: 2 (1) +1
Здравствуйте, 24, Вы писали:

SV.>>Можете ли вы привести пример, когда булевский параметр метода вам действительно необходим?


24>
PerformSomethingOnMainThread(Something something, bool waitUntilDone);

24>
CreateTimer(double interval, bool repeats);

24>
InitApplication(bool isFirstRun);


24>А что значит "действительно необходим"? В любом случае можно обойтись без него, используия целые числа 0 и 1, или содержательные енумы из двух элементов (Для первого примера — WAIT_UNTIL_DONE и DONT_WAIT_UNTIL_DONE). Но не проще ли использовать бул?


Проще, без сомнения. Enum сложнее — программа становится на 1 элемент больше. Но это простота, которая хуже воровства. Все, почему-то, приводят декларации: waitUntilDone, repeats, isFirstRun... А вы вызовы приведите:
PerformSomethingOnMainThread(something, true);
CreateTimer(100, false);
InitApplication(true);

PerformSomethingOnMainThread(something, WAIT_UNTIL_DONE);
CreateTimer(100, ONE_TIME);
InitApplication(FIRST_RUN);


Так вот. Очевидно, что авторы таких методов делают что — используют (reuse) не по делу встроенный в язык универсальный нетипизированный enum (true, false), лишь бы свой не объявлять. Популярные языки не позволяют писать так:

PerformSomethingOnMainThread(Something something, enum { WAIT_UNTIL_DONE, DONT_WAIT_UNTIL_DONE } waitUntilDone); // Scope - вызов.
...
PerformSomethingOnMainThread(something, WAIT_UNTIL_DONE);


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

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

Я пока вижу только работу с флагами, в сугубо закрытых методах реализаций. Неужели больше никто ничего придумать не может? Если так, то давно следует если не ошибку компиляции давать на bool в публичных методах, то уж warning точно. Не знаю, не ломлюсь ли я в открытую дверь — идея весьма очевидна.
Re[3]: Булевские параметры методов
От: C0s Россия  
Дата: 06.01.12 11:39
Оценка:
Здравствуйте, SV., Вы писали:

SV.>Вот людям и не хочется заводить отдельные сущности. Это относится к половине приведенных примеров.


я думал, что к этому ведёт вопрос, поэтому добавлю, что при вызовах методов с булевскими флагами практикую одно из двух:
1) либо объявляю для общего пользования в том же классе, где и метод с булевским параметром, две булевских константы с говорящими именами
2) либо пишу при вызове true /* isFirstRun */, false /* don't wait until done */
Re[3]: Булевские параметры методов
От: 24  
Дата: 06.01.12 11:39
Оценка:
Здравствуйте, SV., Вы писали:

SV.>Все, почему-то, приводят декларации: waitUntilDone, repeats, isFirstRun... А вы вызовы приведите:

Вот вызов на Objective-C:

[obj performSelectorOnMainThread:sel withObject:nil waitUntilDone:YES];

Какие альтернативы булу в данном случае?
Re: Булевские параметры методов
От: Ромашка Украина  
Дата: 06.01.12 11:56
Оценка: :)
Здравствуйте, SV., Вы писали:

SV.>Можете ли вы привести пример, когда булевский параметр метода вам действительно необходим?




public static bool operator ==(SomeClass p1, bool p2) 
{
...
}


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re[4]: Булевские параметры методов
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 06.01.12 13:16
Оценка:
S>Или так:
S>
S>font += Font.Italic;
S>font -= Font.Italic;
S>


в идеале слово Font здесь лишнее (однозначно восстанавливаемое из контекста)
S>
S>font += Italic;
S>font -= Italic;
S>


зы
вот этот метод мне не очень нравится, он создает неоднозначности при дальнейших расширениях
font -= Font.Italic;

одно из желаемых расширений — это чтобы можно было наложить сразу группу "эффектов" (это в частности необходимо, когда эффекты возвращаются внешней функций):
var effects = Italic + !Bold + 24px; //var effects = GetEffects();
font += effects;

если же есть функция -=, то необходимо разбираться что дает минус группа: эффект пропадает только при строгом сравнении, при нестрогом, как-то еще.
Re: Булевские параметры методов
От: rm822 Россия  
Дата: 07.01.12 22:36
Оценка:
Здравствуйте, SV., Вы писали:

SV.>Можете ли вы привести пример, когда булевский параметр метода вам действительно необходим?

Конечно.
database.AllowSnapshotIsolation(true);

во первых это нетривиальная операция и пропертей ей быть не следует
во вторых переход выглядит как disabled -> enabling -> enabled и булом его описать нельзя
Re[2]: Булевские параметры методов
От: SV.  
Дата: 07.01.12 23:07
Оценка:
Здравствуйте, rm822, Вы писали:

SV.>>Можете ли вы привести пример, когда булевский параметр метода вам действительно необходим?

R>Конечно.
R>
R>database.AllowSnapshotIsolation(true);
R>

R>во первых это нетривиальная операция и пропертей ей быть не следует
R>во вторых переход выглядит как disabled -> enabling -> enabled и булом его описать нельзя

Здесь вообще никакие параметры не нужны, IMHO. Ни булевы, ни не булевы.

enum State
{
    Disabling,
    Disabled,
    Enabling,
    Enabled,
}

class Database
{
    State GetState();
    void EnableSnapshotIsolation();
    void DisableSnapshotIsolation();
}
Re[3]: Булевские параметры методов
От: rm822 Россия  
Дата: 07.01.12 23:42
Оценка:
SV.>
SV.>class Database
SV.>{
SV.>    State GetState();
SV.>    void EnableSnapshotIsolation();
SV.>    void DisableSnapshotIsolation();
SV.>}
SV.>


Интерфейс определяется решаемыми задачами, а не твоими фантазиями
привычный синтаксис таков
ALTER DATABASE <dbname> SET ALLOW_SNAPSHOT_ISOLATION <ON|OFF>;

и методы должны по возможности близки к нему
State же просто никому не нужен, это твои фантазии

ну и в конце концов батарея из 30 методов начинающихся на Enable\Disable это просто нечитаемый отстой, колторый к тому же и не комплитится нормально
Re[4]: Булевские параметры методов
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 08.01.12 00:04
Оценка:
R>
R>ALTER DATABASE <dbname> SET ALLOW_SNAPSHOT_ISOLATION <ON|OFF>;
R>

R>и методы должны по возможности близки к нему

значит и вызов должен быть вида
database.AllowSnapshotIsolation(On) // а не true
Re[4]: Булевские параметры методов
От: SV.  
Дата: 08.01.12 00:58
Оценка:
Здравствуйте, rm822, Вы писали:

SV.>>
SV.>>class Database
SV.>>{
SV.>>    State GetState();
SV.>>    void EnableSnapshotIsolation();
SV.>>    void DisableSnapshotIsolation();
SV.>>}
SV.>>


R>Интерфейс определяется решаемыми задачами, а не твоими фантазиями

R>привычный синтаксис таков
R>
R>ALTER DATABASE <dbname> SET ALLOW_SNAPSHOT_ISOLATION <ON|OFF>;
R>


Я не в курсе про SQL-ный интерфейс к этому классу.

R>и методы должны по возможности близки к нему


AllowSnapshotIsolation(true); -- вот это вы называете "по возможности близки"? Если уж задаваться такой целью, нужен enum { ON, OFF }.

R>State же просто никому не нужен, это твои фантазии


Извините, вот это кто написал? "во вторых переход выглядит как disabled -> enabling -> enabled и булом его описать нельзя". Если вы не читаете из этого свойства (оно write-only), то его МОЖНО описать булом. А если читаете, то читать надо отдельным методом GetSatate(), поскольку такие свойства, в которых кладешь одно, а они возвращают другое, делать Заратустра не позволяет.

R>ну и в конце концов батарея из 30 методов начинающихся на Enable\Disable это просто нечитаемый отстой, колторый к тому же и не комплитится нормально
Re[5]: Булевские параметры методов
От: SV.  
Дата: 08.01.12 01:09
Оценка:
Здравствуйте, SV., Вы писали:

R>>и методы должны по возможности близки к нему

SV.>AllowSnapshotIsolation(true); -- вот это вы называете "по возможности близки"? Если уж задаваться такой целью, нужен enum { ON, OFF }.

Я не силен в сиквелах, но: а это не случай ли с классом-конфигурацией? В SQL Server Management Studio я смутно припоминаю несколько диалогов с PropertyBrowser'ами, что и навело меня на такое подозрение. AllowSnapshotIsolation не одно ли из этих свойств, которые пачками устанавливаются?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.