Здравствуйте, igna, Вы писали:
SV.>>Неявный вопрос, который заставил меня создать этот топик, такой: можем ли мы в языке Я запретить булевы параметры вообще, или какой-то ребенок тоже будет с ними выплеснут? I>Аналогично можно ведь и int запретить. Или ты видишь разницу? Какую?
Совсем вы зафилософствовались. Разница в том, что одно — целые, а другое — булевские значения. Какой еще вам разницы надо?
SV.>>В простейшем виде ваш implies не жалко. А вот более сложный — может быть, будет жалко. Но для этого его надо привести, а не абстрактно признать его существование. I>Тебе надо, ты и приводи.
Если бы это было надо мне, и никому больше, я бы пошел и заплатил денег. Но это, потенциально, много кому может быть интересно (сколько доморощенных языков тут довели до продукта?), поэтому я создал для тех, кому это интересно и/или полезно, эту ветку. Я не модератор, но на правах топикстартера хотелось бы внести посильный вклад в эффективность обсуждения. В частности, не дать ему стать абстрактным настолько, насколько хотят "необразованные люди" (цитата из неосиленного Гегеля — "Кто мыслит абстрактно?", всячески рекомендую).
Игра тут такая: я решил, что булевы параметры методов несут много всякого зла, а толку с них никакого. Этот тезис предлагается почтенной публике. Тот, кто его опровергнет примером, выигрывает в этой игре и кладет меня на обе лопатки. Некогда играть — иди, зарабатывай деньги. Кто ж неволит.
SV. wrote:
> Игра тут такая: я решил, что булевы параметры методов несут много > всякого зла, а толку с них никакого. Этот тезис предлагается > почтенной публике. Тот, кто его опровергнет примером, выигрывает в > этой игре и кладет меня на обе лопатки. Некогда играть — иди, > зарабатывай деньги. Кто ж неволит.
Здравствуйте, SV., Вы писали:
SV.>Совсем вы зафилософствовались. Разница в том, что одно — целые, а другое — булевские значения. Какой еще вам разницы надо?
Так по тем же соображениям по которым вместо bool имеет смысл использовать enum, часто вместо int имеет смысл использовать специальный тип, например какой-нибудь string_length. И точно так же иногда нужен именно int. Ситуация ничем принципиально не отличается.
Здравствуйте, avp_, Вы писали:
_>SV. wrote:
>> Игра тут такая: я решил, что булевы параметры методов несут много >> всякого зла, а толку с них никакого. Этот тезис предлагается >> почтенной публике. Тот, кто его опровергнет примером, выигрывает в >> этой игре и кладет меня на обе лопатки. Некогда играть — иди, >> зарабатывай деньги. Кто ж неволит.
_>bool IsSoftRegistered=...; _>... _>SuperButton.SetVisible( IsSoftRegistered )
Так было же уже. Если по уму, свойства нужны. Где их не сделали, там булевы параметры необходимы, вопросов нет.
Здравствуйте, 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, и да, окажется, что "ситуация ничем принципиально не отличается". Пока она принципиально отличается именно этим.
SV.>public uint abs(int a)
SV.>{
SV.> return a >= 0 ? a : -a;
SV.>}
SV.>Покажите такой же фокус с bool, и да, окажется, что "ситуация ничем принципиально не отличается". Пока она принципиально отличается именно этим.
Ну чем это implies "принципиально отличается" от abs? А скажем функция возвращающая true тогда и только тогда, когда один и только один из ее аргументов равен true?
Здравствуйте, 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).
Это что, пример, где нужно использовать int?! Тому, кто хочет заменить bool на enum везде, здесь вместо int два типа определить нужно, что-нибудь вроде XCoord и YCoord.
Здравствуйте, 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? Бессмысленно и беспощадно затайпдефить их, сохранив тот же диапазон допустимых значений?
Здравствуйте, SV., Вы писали:
SV.>Кто-нибудь еще понимает, что он хотел сказать своими XCoord и YCoord? Бессмысленно и беспощадно затайпдефить их, сохранив тот же диапазон допустимых значений?
Если не троллишь, то тебя основательно заклинило. Элементарные же вещи, да вот хотя бы так (C++):
class XCoord {
int x_;
public:
explicit XCoord(int x) : x_(x) {}
operator int() { return x_; }
};
Все-таки какая-никакая защита от непреднамеренного использования произвольного целого в качестве XCoord.
Здравствуйте, igna, Вы писали:
SV.>>Кто-нибудь еще понимает, что он хотел сказать своими XCoord и YCoord? Бессмысленно и беспощадно затайпдефить их, сохранив тот же диапазон допустимых значений?
I>Если не троллишь, то тебя основательно заклинило. Элементарные же вещи, да вот хотя бы так (C++):
I>
I>Все-таки какая-никакая защита от непреднамеренного использования произвольного целого в качестве XCoord.
Во-первых, какая польза от такой обертки? Не все ли равно, кто будет кидать exception, конструктор протектора или реализация SetPixel()?
Во-вторых, какое это имеет отношение к теме? Аналогичную обертку МОЖНО написать и вокруг bool'ов, а вот всегда заменить целочисленные параметры на свойства/enum'ы/конфигураторы к большей пользе (как в случае с параметрами-bool'ами) НЕЛЬЗЯ.
P.S. Про заклинило и троллинг — не надо валить с больной головы на здоровую. Я пытаюсь оставаться вежливым, пытаюсь понять вашу аргументацию и так далее. Наших людей это бесит. Перешел от витания в абстрактных облаках к примерам — тролль, задал уточняющий вопрос — заклинило. Что интересно, каждый раз оказывается, что и пытаться понять не стоило.
Здравствуйте, SV., Вы писали:
SV.>Во-первых, какая польза от такой обертки? Не все ли равно, кто будет кидать exception, конструктор протектора или реализация SetPixel()?
Вообще-то не все равно, лучше проверять диапазон в одном конструкторе, чем во всех функциях. Но в данном случае я никакой проверки диапазона и не предлагал, а только проверку типа. То есть до исключения дело и не дойдет, компилятор выдаст ошибку, если x и y в следующем примере объявлены как int:
SetPixel(x, y, Color.Red);
А если они объявлены как XCoord и YCoord соответственно, то код скомпилируется.
Твой вызов с константами нужно будет переписать так: