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...
Пока на собственное сообщение не было ответов, его можно удалить.