Булевские параметры методов
От: SV.  
Дата: 30.12.11 10:23
Оценка:
Можете ли вы привести пример, когда булевский параметр метода вам действительно необходим?
Re: Булевские параметры методов
От: 0x7be СССР  
Дата: 30.12.11 10:48
Оценка: +2
Здравствуйте, SV., Вы писали:

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

Таких ситуаций нет, хотя бы потому, что любую ситуацию, где используется булева переменная, модно переписать на использование какого-нибудь enum`а или int`a. Предлагаю изменить постановку вопроса на: "когда применение булевого параметра было бы оптимальным".
Re: Булевские параметры методов
От: Пацак Россия  
Дата: 30.12.11 11:12
Оценка:
Здравствуйте, SV., Вы писали:

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


element.setEnabled(condition)


Вариант element.enable()+element.disable() неоптимален, т.к. требудет лишней обвязки if'ами.
Ку...
Re[2]: Булевские параметры методов
От: hardcase Пират http://nemerle.org
Дата: 30.12.11 11:14
Оценка:
Здравствуйте, Пацак, Вы писали:

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


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


П>
П>element.setEnabled(condition)
П>


Это костыль в языках, где нет свойств.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Булевские параметры методов
От: hardcase Пират http://nemerle.org
Дата: 30.12.11 11:15
Оценка: 1 (1)
Здравствуйте, 0x7be, Вы писали:

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


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


Концептуально bool и есть перечисление из двух элементов: true и false. Так что вопрос автора не имеет смысла.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Булевские параметры методов
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 30.12.11 11:15
Оценка: +1 -1
Здравствуйте, SV., Вы писали:

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


public Font SetFontItalic(Font font, bool isItalic)

Пойдёт?
Вселенная бесконечна как вширь, так и вглубь.
Re: Булевские параметры методов
От: Anpek  
Дата: 30.12.11 11:42
Оценка: 6 (1)
Здравствуйте, SV., Вы писали:


void  InitLibrary(bool enable_logging)


Подойдет?
Re[3]: Булевские параметры методов
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 30.12.11 12:03
Оценка: +1
Здравствуйте, hardcase, Вы писали:

П>>
П>>element.setEnabled(condition)
П>>


H>Это костыль в языках, где нет свойств.


А вот и нифига. В том же C# обычно на свойства вешают что-то с относительно тривиальными методами-аксессорами. Если внутри set/get сложная логика, которая может подолгу крутиться и что-то тяжёлое поднимать, то рекомендуют так и писать методы GetSomething/SetSomething
Re: Булевские параметры методов
От: batu Украина  
Дата: 30.12.11 12:47
Оценка:
Здравствуйте, SV., Вы писали:

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

Совсем недавно создал такой метод. Надо было блокировать и разблокировать часть элементов формы в зависимости от развития ситуации. Свойство нафиг не нужно, потому как состояние меня не интересовало. Читать не надо было. А метод очень даже подошел.
Re[2]: Булевские параметры методов
От: ArhAngelVezel Россия  
Дата: 30.12.11 13:04
Оценка:
Здравствуйте, Anpek, Вы писали:

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



A>
A>void  InitLibrary(bool enable_logging)
A>


A>Подойдет?


Лучше писать:
void  InitLibrary(ILogger logger)
Re[2]: Булевские параметры методов
От: ArhAngelVezel Россия  
Дата: 30.12.11 13:05
Оценка: -1
Здравствуйте, Real 3L0, Вы писали:

R3>
R3>public Font SetFontItalic(Font font, bool isItalic)
R3>

R3>Пойдёт?

object.font.style.italic = true;
Re[3]: Булевские параметры методов
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 30.12.11 13:07
Оценка:
Здравствуйте, ArhAngelVezel, Вы писали:

AAV>object.font.style.italic = true;


italic имеет только геттер.
Вселенная бесконечна как вширь, так и вглубь.
Re[4]: Булевские параметры методов
От: hardcase Пират http://nemerle.org
Дата: 30.12.11 13:08
Оценка:
Здравствуйте, konsoletyper, Вы писали:

K>А вот и нифига. В том же C# обычно на свойства вешают что-то с относительно тривиальными методами-аксессорами. Если внутри set/get сложная логика, которая может подолгу крутиться и что-то тяжёлое поднимать, то рекомендуют так и писать методы GetSomething/SetSomething


В таком случае делается класс-конфигурация параметров этого долгого и мучительного процесса. А у класса того исключительно примитивные свойства и будут (см ProcessStartInfo).
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Булевские параметры методов
От: batu Украина  
Дата: 30.12.11 13:10
Оценка:
Здравствуйте, hardcase, Вы писали:

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


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


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


H>Концептуально bool и есть перечисление из двух элементов: true и false. Так что вопрос автора не имеет смысла.

Это как посмотреть. Может оно и так если в языке L речь идет о каком-то объекте X, который равняется True. (Т.е. X=True). А вот когда мы о самом этом равенстве (X=True) как о высказывании говорим что оно True или False так мы переходим на другой семантический уровень рассуждая о самом высказывании. Здесь уже True или False объекты метаязыка манипулирующего с конструкциями языка L.
Может заумно.. но это ж ветка философия
ч
Re[4]: Булевские параметры методов
От: hardcase Пират http://nemerle.org
Дата: 30.12.11 13:18
Оценка:
Здравствуйте, batu, Вы писали:

B>Здесь уже True или False объекты метаязыка манипулирующего с конструкциями языка L.


И тем не менее этих объектов две штуки и над ними можно определить алгебру (например булеву).
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Булевские параметры методов
От: C0s Россия  
Дата: 30.12.11 15:47
Оценка:
Здравствуйте, SV., Вы писали:

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


(необходим — слишком сильно),

например, в таком случае он нужен:
метод выборки данных по фильтру, состоящему из нескольких его атрибутов, что-то типа findObjectsByCriteria(String param1, Integer param2, ... Boolean paramN, ..., Boolean paramM),
где paramN, paramM соответствуют каким-то булевским атрибутам объектов, среди которых производится поиск

необходимость, как нетрудно догадаться, проистекает из того, что изначально объекты согласно анализу могут иметь среди своих атрибутов либо простые флаговые (типа on/off, active/inactive, started/stopped), либо сочинённые (когда атрибут типа какого-то enum, но у каждого элемента enum, всё равно, есть свой набор булевских субпризнаков, по каждому из которых в программе обработки может появиться ветвление)
Re[5]: Булевские параметры методов
От: batu Украина  
Дата: 30.12.11 16:18
Оценка:
Здравствуйте, hardcase, Вы писали:

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


B>>Здесь уже True или False объекты метаязыка манипулирующего с конструкциями языка L.


H>И тем не менее этих объектов две штуки и над ними можно определить алгебру (например булеву).

Можно, можно..
Re: Булевские параметры методов
От: ononim  
Дата: 30.12.11 18:16
Оценка:
SV.>Можете ли вы привести пример, когда булевский параметр метода вам действительно необходим?
struct IBoolStorage
{
void Save(bool value) = 0;
bool Load() = 0;
}

Вопрос о необходимости булкохранилища считать офтопиком
Как много веселых ребят, и все делают велосипед...
Re[2]: Булевские параметры методов
От: alexeiz  
Дата: 30.12.11 18:55
Оценка:
Здравствуйте, ononim, Вы писали:

O>
O>struct IBoolStorage
O>{
O>void Save(bool value) = 0;
O>bool Load() = 0;
  half_bool CutHalf() = 0;
  bool_with_caviar AddCaviar(int how_much) = 0;
O>}
O>
Re: Булевские параметры методов
От: gegMOPO4  
Дата: 30.12.11 19:49
Оценка:
Здравствуйте, SV., Вы писали:
SV.>Можете ли вы привести пример, когда булевский параметр метода вам действительно необходим?

class Properties
{
    ...
    void setBoolean( string name, bool value );
    bool getBoolean( string name, bool defaultValue );
    ...
};
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 не одно ли из этих свойств, которые пачками устанавливаются?
Re[5]: Булевские параметры методов
От: Sinclair Россия https://github.com/evilguest/
Дата: 08.01.12 05:03
Оценка:
Здравствуйте, DarkGray, Вы писали:
DG>одно из желаемых расширений — это чтобы можно было наложить сразу группу "эффектов" (это в частности необходимо, когда эффекты возвращаются внешней функций):
Непонятно, зачем. Мы всегда можем переделать эту функцию в
Font ApplyEffects(Font source)
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Булевские параметры методов
От: rm822 Россия  
Дата: 08.01.12 09:09
Оценка:
SV.>AllowSnapshotIsolation(true); -- вот это вы называете "по возможности близки"? Если уж задаваться такой целью, нужен enum { ON, OFF }.
Ну и зачем изобретать собственный бул если читаеость от этого не улучшается?

SV.>Если вы не читаете из этого свойства (оно write-only), то его МОЖНО описать булом.

см п1
во первых это нетривиальная операция и пропертей ей быть не следует
Re[6]: Булевские параметры методов
От: SV.  
Дата: 08.01.12 10:51
Оценка:
Здравствуйте, rm822, Вы писали:

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

R>Ну и зачем изобретать собственный бул если читаеость от этого не улучшается?

Читаемость не улучшится, но зато соблюдается требование "по возможности близки".

Если забить на это странное требование, и принять во внимание то, что вы написали про цепочку состояний, получается, что это асинхронный запрос сколько-нибудь длительной операции. И я бы его сделал так, как написал — отдельным безпараметровым методом, либо (если архитектура к тому располагает) методом с одним параметром — классом-конфигурацией.

SV.>>Если вы не читаете из этого свойства (оно write-only), то его МОЖНО описать булом.

R>см п1
R>во первых это нетривиальная операция и пропертей ей быть не следует

Если вы забираете п.2, то я забираю назад метод GetState(). Я просто объяснил, откуда он взялся.

Нет, знаете что — расскажите лучше про типовой юз-кейс вызова AllowSnapshotIsolation. Не могу представить, как так получается, что делается запрос на изменение состояния и не интересует результат.
Re[4]: Булевские параметры методов
От: SV.  
Дата: 08.01.12 10:55
Оценка:
Здравствуйте, 24, Вы писали:

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

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

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

24>Какие альтернативы булу в данном случае?

Скажу честно, вопроса не понял. Если буквально, то ответ — все те же. Если это утверждение, что булевы параметры становятся не так плохи, когда имя параметра явно указывается, то я с ним согласен, но это решение порождает другие проблемы.
Re[5]: Булевские параметры методов
От: 24  
Дата: 08.01.12 11:32
Оценка:
Здравствуйте, SV., Вы писали:

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


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

24>>Какие альтернативы булу в данном случае?

SV.>Скажу честно, вопроса не понял. Если буквально, то ответ — все те же. Если это утверждение, что булевы параметры становятся не так плохи, когда имя параметра явно указывается,


Нет, это не утверждение. Мне интересно посмотреть, что, при способе именования как в Objective-C, можно использовать вместо BOOL, и чем это будет лучше. Если заменить на
[obj performSelectorOnMainThread:sel withObject:nil waitingPolicy:WAIT_UNTIL_DONE];

То в этом случае нужно смотреть либо определение, либо доки, чтоб по вызову понять, какие туда можно передавать константы. А по первому вызову сразу видно, что варианта всего два, и смысл waitUntilDone:YES воспринимается вполне однозначно.

SV.>но это решение порождает другие проблемы.

Какие проблемы в этом решении, и как можно преобразовать этот вызов, чтоб стало лучше?
Re[6]: Булевские параметры методов
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 08.01.12 13:11
Оценка:
DG>>одно из желаемых расширений — это чтобы можно было наложить сразу группу "эффектов" (это в частности необходимо, когда эффекты возвращаются внешней функций):
S>Непонятно, зачем. Мы всегда можем переделать эту функцию в
S>
S>Font ApplyEffects(Font source)
S>


а где сами эффекты?
или это метод? и source — это effects? но тогда какие поля из source надо накладывать, а какие нет?

вообще, если разбирать базовые операции над типами — то они развиваются следующим образом:
сравнение -> получение разницы -> применение разницы (и тот же css — это как раз возможность записать разницу между аттрибутами элемента, а потом ее применить)
для структурного типа результат получения разницы имеет тип более расширенный, чем исходный тип: у каждого поля еще появляется значение, что поле не поменялось (и если для reference типов полей это можно отобразить в null, то для value-type-ов приходится вводить новую структуру, например, nullable-поля)

или если вернуться к примеру, то тип выражения: Italic + !Bold + Size(24px) — есть FontDifference(или даже более общий), а не Font
Re[7]: Булевские параметры методов
От: rm822 Россия  
Дата: 08.01.12 15:47
Оценка:
SV.>Нет, знаете что — расскажите лучше про типовой юз-кейс вызова AllowSnapshotIsolation. Не могу представить, как так получается, что делается запрос на изменение состояния и не интересует результат.
О, это довольно занятная тема. SI — это режим версионника для MSSQL, т.е. нам дозволяется читать старые версии данных. Для того чтобы их читать нужен undo-log, ведение которого на самом-то деле и включает AllowSnapshotIsolation.
Долгий переход(упрощенно) же связан с тем что на момент переключения уже есть транзакции, которые никакого undo-лога не вели, и пока все они не завершатся — переход не произойдет.

Поэтому типичный сценарий выглядит так
1. AllowSnapshotIsolation
2. подождать К-минут, пока завершатся все активные транзакции
3. убить все транзакции старше К-минут, считаем их неадекватными
Re[7]: Булевские параметры методов
От: Sinclair Россия https://github.com/evilguest/
Дата: 08.01.12 16:04
Оценка:
Здравствуйте, DarkGray, Вы писали:


DG>>>одно из желаемых расширений — это чтобы можно было наложить сразу группу "эффектов" (это в частности необходимо, когда эффекты возвращаются внешней функций):

S>>Непонятно, зачем. Мы всегда можем переделать эту функцию в
S>>
S>>Font ApplyEffects(Font source)
S>>


DG>а где сами эффекты?

Внутри функции, вестимо. Вы зачем-то хотите их сначала вытащить, а потом применить. В то время, как надо просто дать их применить и всё.

DG>вообще, если разбирать базовые операции над типами — то они развиваются следующим образом:

DG>сравнение -> получение разницы -> применение разницы (и тот же css — это как раз возможность записать разницу между аттрибутами элемента, а потом ее применить)
Какую разницу? В CSS ничего про разницу нету. Это вы что-то не то курите.

DG>или если вернуться к примеру, то тип выражения: Italic + !Bold + Size(24px) — есть FontDifference(или даже более общий), а не Font

Зачем вам вообще такое выражение?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: Булевские параметры методов
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 08.01.12 16:34
Оценка:
DG>>а где сами эффекты?
S>Внутри функции, вестимо. Вы зачем-то хотите их сначала вытащить, а потом применить. В то время, как надо просто дать их применить и всё.

потому что я хочу декларативный подход, а не императивный.
а при декларативном подходе все состояния меняются явно, а не внутри инкапсуляций.

DG>>вообще, если разбирать базовые операции над типами — то они развиваются следующим образом:

DG>>сравнение -> получение разницы -> применение разницы (и тот же css — это как раз возможность записать разницу между аттрибутами элемента, а потом ее применить)
S>Какую разницу? В CSS ничего про разницу нету. Это вы что-то не то курите.

подумай еще раз, в этот раз подольше.
и попробуй ответить на простой вопрос — каким типом с точки зрения статической типизации является конструкция?:
        {
                margin: 0;
                padding: 0;
                height: 100%;
                border: none
            }


и в чем отличие этого типа от типа результата функции diff(element1.style, element2.style)?


DG>>или если вернуться к примеру, то тип выражения: Italic + !Bold + Size(24px) — есть FontDifference(или даже более общий), а не Font

S>Зачем вам вообще такое выражение?

чтобы в коде можно было записать в один в один то, что можно записать через css (со всеми статик-проверками и т.д.)
сейчас получается, что css мощнее, чем универсальный язык.
Re[9]: Булевские параметры методов
От: Sinclair Россия https://github.com/evilguest/
Дата: 08.01.12 18:37
Оценка:
Здравствуйте, DarkGray, Вы писали:
DG>потому что я хочу декларативный подход, а не императивный.
DG>а при декларативном подходе все состояния меняются явно, а не внутри инкапсуляций.
1. Неправда. Декларативный подход никак не отменяет инкапсуляцию.
2. В коде, который я привёл, вообще никакие состояния не меняются, ни явно, ни неявно.
DG>и в чем отличие этого типа от типа результата функции diff(element1.style, element2.style)?
Ну, на мой взляд, он ничем не отличается от типа element1.style.

DG>чтобы в коде можно было записать в один в один то, что можно записать через css (со всеми статик-проверками и т.д.)

Не вижу проблемы.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Булевские параметры методов
От: cppnick  
Дата: 02.02.12 19:30
Оценка:
Здравствуйте, hardcase, Вы писали:

K>>А вот и нифига. В том же C# обычно на свойства вешают что-то с относительно тривиальными методами-аксессорами. Если внутри set/get сложная логика, которая может подолгу крутиться и что-то тяжёлое поднимать, то рекомендуют так и писать методы GetSomething/SetSomething


H>В таком случае делается класс-конфигурация параметров этого долгого и мучительного процесса. А у класса того исключительно примитивные свойства и будут (см ProcessStartInfo).

Класс-конфигурация, состоящая из единственного поля?
Re[6]: Булевские параметры методов
От: blackhearted Украина  
Дата: 02.02.12 19:48
Оценка:
Здравствуйте, cppnick, Вы писали:
C>Класс-конфигурация, состоящая из единственного поля?

oop , сударь, ресурсов хватит на всех.
Re[3]: Булевские параметры методов
От: konstardiy  
Дата: 02.02.12 20:14
Оценка:
Здравствуйте, SV., Вы писали:

SV.>Проще, без сомнения. Enum сложнее — программа становится на 1 элемент больше. Но это простота, которая хуже воровства. Все, почему-то, приводят декларации: waitUntilDone, repeats, isFirstRun... А вы вызовы приведите:

На C# можно так:

PerformSomethingOnMainThread(something, waitUntilDone:true);

помоему, это решает обе проблемы — и енам вводть не надо и что делает вызов — понятно.
Re[7]: Булевские параметры методов
От: cppnick  
Дата: 03.02.12 05:28
Оценка:
Здравствуйте, blackhearted, Вы писали:

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

C>>Класс-конфигурация, состоящая из единственного поля?

B>oop , сударь, ресурсов хватит на всех.


А удобство использования? И кто там говорил, не плодить лишних сущностей?
Re[8]: Булевские параметры методов
От: blackhearted Украина  
Дата: 03.02.12 06:27
Оценка:
Здравствуйте, cppnick, Вы писали:

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


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

C>>>Класс-конфигурация, состоящая из единственного поля?

B>>oop , сударь, ресурсов хватит на всех.


C>А удобство использования? И кто там говорил, не плодить лишних сущностей?


bool и так сущность, пусть и встроенная.
Re: Импликация
От: igna Россия  
Дата: 03.02.12 09:37
Оценка:
Здравствуйте, SV., Вы писали:

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


Могу. Вот:

bool implies(bool p, bool q)
{
    return !p || q;
}
Re[2]: Импликация
От: SV.  
Дата: 05.02.12 16:24
Оценка:
Здравствуйте, igna, Вы писали:

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


I>Могу. Вот:


I>
I>bool implies(bool p, bool q)
I>{
I>    return !p || q;
I>}
I>


А просто !p || q написать?
Re[3]: Импликация
От: igna Россия  
Дата: 06.02.12 09:01
Оценка:
Здравствуйте, SV., Вы писали:

SV.>А просто !p || q написать?


Написать можно что угодно. implies это простейший пример, в котором необходим именно булевый параметр, но конечно же можно представить себе и более сложный. А умея мыслить абстрактно и представлять ничего не надо, implies в достаточной мере демонстрирует, что методы, в которых необходимы булевые параметры, существуют.
Re[4]: Импликация
От: SV.  
Дата: 06.02.12 10:25
Оценка:
Здравствуйте, igna, Вы писали:

I>Написать можно что угодно. implies это простейший пример, в котором необходим именно булевый параметр, но конечно же можно представить себе и более сложный. А умея мыслить абстрактно и представлять ничего не надо, implies в достаточной мере демонстрирует, что методы, в которых необходимы булевые параметры, существуют.


Есть такая чисто философская статья — "Кто мыслит абстрактно?". Можете полюбопытствовать. Спойлер: в этом смысле абстрактно мыслят невежды, а инженеры мыслят примерами.

Неявный вопрос, который заставил меня создать этот топик, такой: можем ли мы в языке Я запретить булевы параметры вообще, или какой-то ребенок тоже будет с ними выплеснут?

В простейшем виде ваш implies не жалко. А вот более сложный — может быть, будет жалко. Но для этого его надо привести, а не абстрактно признать его существование.
Re[5]: Импликация
От: igna Россия  
Дата: 06.02.12 10:48
Оценка:
Здравствуйте, SV., Вы писали:

SV.>Неявный вопрос, который заставил меня создать этот топик, такой: можем ли мы в языке Я запретить булевы параметры вообще, или какой-то ребенок тоже будет с ними выплеснут?


Аналогично можно ведь и int запретить. Или ты видишь разницу? Какую?

SV.>В простейшем виде ваш implies не жалко. А вот более сложный — может быть, будет жалко. Но для этого его надо привести, а не абстрактно признать его существование.


Тебе надо, ты и приводи.
Re[6]: Импликация
От: SV.  
Дата: 09.02.12 14:52
Оценка:
Здравствуйте, igna, Вы писали:

SV.>>Неявный вопрос, который заставил меня создать этот топик, такой: можем ли мы в языке Я запретить булевы параметры вообще, или какой-то ребенок тоже будет с ними выплеснут?

I>Аналогично можно ведь и int запретить. Или ты видишь разницу? Какую?

Совсем вы зафилософствовались. Разница в том, что одно — целые, а другое — булевские значения. Какой еще вам разницы надо?

SV.>>В простейшем виде ваш implies не жалко. А вот более сложный — может быть, будет жалко. Но для этого его надо привести, а не абстрактно признать его существование.

I>Тебе надо, ты и приводи.

Если бы это было надо мне, и никому больше, я бы пошел и заплатил денег. Но это, потенциально, много кому может быть интересно (сколько доморощенных языков тут довели до продукта?), поэтому я создал для тех, кому это интересно и/или полезно, эту ветку. Я не модератор, но на правах топикстартера хотелось бы внести посильный вклад в эффективность обсуждения. В частности, не дать ему стать абстрактным настолько, насколько хотят "необразованные люди" (цитата из неосиленного Гегеля — "Кто мыслит абстрактно?", всячески рекомендую).

Игра тут такая: я решил, что булевы параметры методов несут много всякого зла, а толку с них никакого. Этот тезис предлагается почтенной публике. Тот, кто его опровергнет примером, выигрывает в этой игре и кладет меня на обе лопатки. Некогда играть — иди, зарабатывай деньги. Кто ж неволит.
Re[7]: Импликация
От: avp_  
Дата: 09.02.12 15:26
Оценка:
SV. wrote:

> Игра тут такая: я решил, что булевы параметры методов несут много

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

bool IsSoftRegistered=...;
...
SuperButton.SetVisible( IsSoftRegistered )
Posted via RSDN NNTP Server 2.1 beta
Re[7]: Импликация
От: igna Россия  
Дата: 12.02.12 08:13
Оценка:
Здравствуйте, SV., Вы писали:

SV.>Совсем вы зафилософствовались. Разница в том, что одно — целые, а другое — булевские значения. Какой еще вам разницы надо?


Так по тем же соображениям по которым вместо bool имеет смысл использовать enum, часто вместо int имеет смысл использовать специальный тип, например какой-нибудь string_length. И точно так же иногда нужен именно int. Ситуация ничем принципиально не отличается.
Re[8]: Импликация
От: SV.  
Дата: 14.02.12 09:09
Оценка:
Здравствуйте, avp_, Вы писали:

_>SV. wrote:


>> Игра тут такая: я решил, что булевы параметры методов несут много

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

_>bool IsSoftRegistered=...;

_>...
_>SuperButton.SetVisible( IsSoftRegistered )

Так было же уже. Если по уму, свойства нужны. Где их не сделали, там булевы параметры необходимы, вопросов нет.
Re[3]: Булевские параметры методов
От: GlebZ Россия  
Дата: 14.02.12 09:16
Оценка:
Здравствуйте, ArhAngelVezel, Вы писали:

A>>
A>>void  InitLibrary(bool enable_logging)
A>>


A>>Подойдет?


AAV>Лучше писать:

AAV>
AAV>void  InitLibrary(ILogger logger)
AAV>

Это не эквивалент. Инициализация библиотеки сама может решать как и куда логгировать.
Re[8]: Импликация
От: SV.  
Дата: 14.02.12 10:03
Оценка:
Здравствуйте, igna, Вы писали:

SV.>>Совсем вы зафилософствовались. Разница в том, что одно — целые, а другое — булевские значения. Какой еще вам разницы надо?


I>Так по тем же соображениям по которым вместо bool имеет смысл использовать enum, часто вместо int имеет смысл использовать специальный тип, например какой-нибудь string_length. И точно так же иногда нужен именно int. Ситуация ничем принципиально не отличается.


Тогда я вас не понял. Теперь понял. Возвращаюсь в исходную точку:

>Аналогично можно ведь и int запретить.


Отвечаю. Запретить int и запретить bool (контекст: как параметры публичных методов) — вещи разные. Разница вот в чем. Для int легко придумать пример, когда он будет, цитирую, "действительно необходим".

public uint abs(int a)
{
    return a >= 0 ? a : -a;
}


Возьмите любую математическую формулу, с целыми числами, и это готовый шаблон функции с целочисленными параметрами. Я от математики далек, но какая-нибудь малая теорема Ферма, по-моему, опирается на класс целых (необязательно положительных) чисел. Далее, даже если по смыслу формула одинаково работает для вещественных и целых чисел, для оптимизации есть смысл разделять эти два класса (отдельно считать, например, степени — int pow(int n, int p)).

То есть, хотя "часто вместо int имеет смысл использовать специальный тип, например какой-нибудь string_length", часто имеет смысл использовать обобщенный int.

Покажите такой же фокус с bool, и да, окажется, что "ситуация ничем принципиально не отличается". Пока она принципиально отличается именно этим.
Re[9]: Импликация
От: igna Россия  
Дата: 14.02.12 10:45
Оценка:
Здравствуйте, SV., Вы писали:

SV.>public uint abs(int a)
SV.>{
SV.>    return a >= 0 ? a : -a;
SV.>}


SV.>Покажите такой же фокус с bool, и да, окажется, что "ситуация ничем принципиально не отличается". Пока она принципиально отличается именно этим.


Ну чем это implies "принципиально отличается" от abs? А скажем функция возвращающая true тогда и только тогда, когда один и только один из ее аргументов равен true?
Re[10]: Импликация
От: SV.  
Дата: 14.02.12 12:34
Оценка:
Здравствуйте, igna, Вы писали:

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


I>
SV.>>public uint abs(int a)
SV.>>{
SV.>>    return a >= 0 ? a : -a;
SV.>>}
I>


SV.>>Покажите такой же фокус с bool, и да, окажется, что "ситуация ничем принципиально не отличается". Пока она принципиально отличается именно этим.


I>Ну чем это implies "принципиально отличается" от abs? А скажем функция возвращающая true тогда и только тогда, когда один и только один из ее аргументов равен true?


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

Есть и чисто компьютерный пример:

void SetPixel(int x, int y, Color color);


в относительной системе координат (иначе был бы смысл заменить int на uint).
Re[11]: Импликация
От: igna Россия  
Дата: 14.02.12 12:42
Оценка:
Здравствуйте, SV., Вы писали:

SV.>void SetPixel(int x, int y, Color color);


Это что, пример, где нужно использовать int?! Тому, кто хочет заменить bool на enum везде, здесь вместо int два типа определить нужно, что-нибудь вроде XCoord и YCoord.
Re[12]: Импликация
От: SV.  
Дата: 14.02.12 17:21
Оценка:
Здравствуйте, igna, Вы писали:

I>
SV.>>void SetPixel(int x, int y, Color color);
I>


I>Это что, пример, где нужно использовать int?!


Да, один из.

>Тому, кто хочет заменить bool на enum везде, здесь вместо int два типа определить нужно, что-нибудь вроде XCoord и YCoord.


А покажите.

void InitApplication(bool firstRun);      |              void InitApplication(EInitOption option);
...                                       |              ...
InitApplication(true);                    |              InitApplication(EInitOption.FirstRun);
------------------------------------------------------------------------
SetPixel(int x, int y, Color color);      |              
...                                       |              ???
SetPixel(42, 34, Color.Red);              |
Re[13]: Импликация
От: igna Россия  
Дата: 15.02.12 06:47
Оценка:
Здравствуйте, SV., Вы писали:

SV.>А покажите.


SV.>void InitApplication(bool firstRun);      |              void InitApplication(EInitOption option);
SV.>...                                       |              ...
SV.>InitApplication(true);                    |              InitApplication(EInitOption.FirstRun);
SV.>------------------------------------------------------------------------
SV.>SetPixel(int x, int y, Color color);      |              
SV.>...                                       |              ???
SV.>SetPixel(42, 34, Color.Red);              |


То есть самому не понятно, как? Что-то сильно похоже на троллинг, не обессудь, если не так, но не буду ничего показывать.
Re[14]: Импликация
От: SV.  
Дата: 15.02.12 09:26
Оценка:
Здравствуйте, igna, Вы писали:

SV.>>А покажите.


I>
SV.>>void InitApplication(bool firstRun);      |              void InitApplication(EInitOption option);
SV.>>...                                       |              ...
SV.>>InitApplication(true);                    |              InitApplication(EInitOption.FirstRun);
SV.>>------------------------------------------------------------------------
SV.>>SetPixel(int x, int y, Color color);      |              
SV.>>...                                       |              ???
SV.>>SetPixel(42, 34, Color.Red);              |              
I>


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


Кто-нибудь еще понимает, что он хотел сказать своими XCoord и YCoord? Бессмысленно и беспощадно затайпдефить их, сохранив тот же диапазон допустимых значений?
Re[15]: Импликация
От: igna Россия  
Дата: 15.02.12 10:54
Оценка:
Здравствуйте, SV., Вы писали:

SV.>Кто-нибудь еще понимает, что он хотел сказать своими XCoord и YCoord? Бессмысленно и беспощадно затайпдефить их, сохранив тот же диапазон допустимых значений?


Если не троллишь, то тебя основательно заклинило. Элементарные же вещи, да вот хотя бы так (C++):

class XCoord {
    int x_;
public:
    explicit XCoord(int x) : x_(x) {}
    operator int() { return x_; }
};


Все-таки какая-никакая защита от непреднамеренного использования произвольного целого в качестве XCoord.
Re[16]: Импликация
От: SV.  
Дата: 15.02.12 13:43
Оценка:
Здравствуйте, igna, Вы писали:

SV.>>Кто-нибудь еще понимает, что он хотел сказать своими XCoord и YCoord? Бессмысленно и беспощадно затайпдефить их, сохранив тот же диапазон допустимых значений?


I>Если не троллишь, то тебя основательно заклинило. Элементарные же вещи, да вот хотя бы так (C++):


I>
I>class XCoord {
I>    int x_;
I>public:
I>    explicit XCoord(int x) : x_(x) {}
I>    operator int() { return x_; }
I>};
I>


I>Все-таки какая-никакая защита от непреднамеренного использования произвольного целого в качестве XCoord.


Во-первых, какая польза от такой обертки? Не все ли равно, кто будет кидать exception, конструктор протектора или реализация SetPixel()?

Во-вторых, какое это имеет отношение к теме? Аналогичную обертку МОЖНО написать и вокруг bool'ов, а вот всегда заменить целочисленные параметры на свойства/enum'ы/конфигураторы к большей пользе (как в случае с параметрами-bool'ами) НЕЛЬЗЯ.

P.S. Про заклинило и троллинг — не надо валить с больной головы на здоровую. Я пытаюсь оставаться вежливым, пытаюсь понять вашу аргументацию и так далее. Наших людей это бесит. Перешел от витания в абстрактных облаках к примерам — тролль, задал уточняющий вопрос — заклинило. Что интересно, каждый раз оказывается, что и пытаться понять не стоило.
Re[17]: Импликация
От: igna Россия  
Дата: 15.02.12 13:57
Оценка:
Здравствуйте, SV., Вы писали:

SV.>Во-первых, какая польза от такой обертки? Не все ли равно, кто будет кидать exception, конструктор протектора или реализация SetPixel()?


Вообще-то не все равно, лучше проверять диапазон в одном конструкторе, чем во всех функциях. Но в данном случае я никакой проверки диапазона и не предлагал, а только проверку типа. То есть до исключения дело и не дойдет, компилятор выдаст ошибку, если x и y в следующем примере объявлены как int:

SetPixel(x, y, Color.Red);


А если они объявлены как XCoord и YCoord соответственно, то код скомпилируется.

Твой вызов с константами нужно будет переписать так:

SetPixel(XCoord(42), YCoord(34), Color.Red);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.