Здравствуйте, michael_isu, Вы писали:
_>Оператор if — это наверное самый зловещий оператор, которым мне приходилось пользоваться. Он является основной причиной возникновения спагетти-кода и как следствие причиной сильной головной боли, когда проект развивается много лет. Только вот пока не додумал, как от него избавиться совсем. Какие варианты? или мне пора в ФП?
Как не прогер-задрот официально заявляю, чо if — это один из лучших операторов (после присвоения, конечно ). Потому что это самый понятный и простой оператор. Даже в этом долбанном for постоянно забываешь в какой последовательности чо там идёт: сначала условие или приращение.
Здравствуйте, Real 3L0, Вы писали:
R3>Даже в этом долбанном for постоянно забываешь в какой последовательности чо там идёт: сначала условие или приращение.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, michael_isu, Вы писали:
_>Оператор if — это наверное самый зловещий оператор, которым мне приходилось пользоваться. Он является основной причиной возникновения спагетти-кода и как следствие причиной сильной головной боли, когда проект развивается много лет. Только вот пока не додумал, как от него избавиться совсем. Какие варианты? или мне пора в ФП?
Здравствуйте, Real 3L0, Вы писали:
R3>Здравствуйте, michael_isu, Вы писали:
_>>Оператор if — это наверное самый зловещий оператор...
R3>Как не прогер-задрот официально заявляю, чо if — это один из лучших операторов (после присвоения, конечно ).
Как начинающий тролль, официально заявляю:
самый лучший оператор — goto.
Это самый понятный оператор из существующих, притом куда понятнее чем оператор присваивания, т.к. совершенно не известно, что именно будет выполнятся за ширмой
a = b;
Всё сказанное выше — личное мнение, если не указано обратное.
Здравствуйте, michael_isu, Вы писали:
_> Какие варианты? или мне пора в ФП?
C++ к вашим услугам :
class NoOp
{
public:
virtual int GetResult() = 0;
virtual ~NoOp() = 0;
};
//virtual
NoOp::~NoOp()
{
}
class NoOp_Yes : public NoOp
{
public:
virtual int GetResult() { return 1; }
virtual ~NoOp_Yes(){}
};
class NoOp_ReallyNo : public NoOp
{
public:
virtual int GetResult() { return 6; }
virtual ~NoOp_ReallyNo(){}
};
NoOp* NewNoOp_ReallyNo()
{
return new NoOp_ReallyNo;
}
NoOp* NewNoOp_Yes()
{
return new NoOp_Yes;
}
NoOp* WithoutOp(bool b)
{
NoOp* (*arr[2])();
arr[0] = NewNoOp_ReallyNo;
arr[1] = NewNoOp_Yes;
NoOp* p = arr[b]();
return p;
}
int main()
{
int n = 2;
// int a;
//
// if ( n > 2 )
// a = 1;
// else
// a = 6;
//
// No 'if' ! Just call:
NoOp* pResultGenerator = WithoutOp(n > 2);
int a = pResultGenerator->GetResult();
delete pResultGenerator;
std::cout << "Result:" << a << std::endl;
std::cout << "end" << std::endl;
//getch();return 0;
}
Программа выводит на печать 1 при условии, что n больше 2, и 6 — в противном случае.
Хоть и без tempate'ности, зато с виртуальным деструктором и массивом указателей на функции!
Нарекаю данный паттерн No-if-pattern. Говоря по-русски: Паттерн Несли.
Здравствуйте, Ops, Вы писали:
Ops>Здравствуйте, Real 3L0, Вы писали:
R3>>Даже в этом долбанном for постоянно забываешь в какой последовательности чо там идёт: сначала условие или приращение.
Помню как-то раз полдня провел в веселой отладке из-за перепутанных условий в for
Здравствуйте, michael_isu, Вы писали:
_>Оператор if — это наверное самый зловещий оператор, которым мне приходилось пользоваться. Он является основной причиной возникновения спагетти-кода и как следствие причиной сильной головной боли, когда проект развивается много лет. Только вот пока не додумал, как от него избавиться совсем. Какие варианты? или мне пора в ФП?
Лучше сразу в пролог, там от оператора if одна стрелка осталась
Здравствуйте, Философ, Вы писали:
Ф>Как начинающий тролль, официально заявляю: Ф>самый лучший оператор — goto.
Ф>Это самый понятный оператор из существующих, притом куда понятнее чем оператор присваивания, т.к. совершенно не известно, что именно будет выполнятся за ширмой Ф>a = b;
В некоторых диалектах бейсика был возможен такой вариант:
goto a
где a — переменная. Ну и куда перейдёт управление? Как это узнать просто глядя на код? Только прогоняя код пошагово...
Здравствуйте, Qbit86, Вы писали:
N>>В Erlang условное выражение и оператор if — одно и то же.
Q>Ну какбе во всех порядочных языках if — это не то что в Си-подобных языках «if», а то, что в Си-подобных языках «тернарный оператор».
А почему только тернарный? Что за дискриминация? В Erlang у if сколько угодно веток.
ты что считаешь что можешь загаживать темы про программирование своими любимым нытьем про политику? С чего ты это взял. Тебя банить надо, во первых на "обсуждение" личности а второе за офтопик, а в третьих за глупость. А ну кышь в СВ-помойту.
Здравствуйте, Just Men, Вы писали:
JM>ты что считаешь что можешь загаживать темы про программирование своими любимым нытьем про политику? С чего ты это взял. Тебя банить надо, во первых на "обсуждение" личности а второе за офтопик, а в третьих за глупость. А ну кышь в СВ-помойту.
Не надо пальцы гнуть, я бана не боюсь. Он повышает продуктивность.
Здравствуйте, michael_isu, Вы писали: _>Оператор if — это наверное самый зловещий оператор, которым мне приходилось пользоваться. Он является основной причиной возникновения спагетти-кода и как следствие причиной сильной головной боли, когда проект развивается много лет. Только вот пока не додумал, как от него избавиться совсем. Какие варианты? или мне пора в ФП?
мне кажется что проблема спагетти кода и прочего надуманная.
то есть нет большой проблемы писать так, чтобы было просто и понятно.
чаще применяется "осознанный вандализм" — код специально усложняется, чтобы его было сложно поддерживать
Здравствуйте, koodeer, Вы писали:
K>В некоторых диалектах бейсика был возможен такой вариант: K>goto a K>где a — переменная. Ну и куда перейдёт управление? Как это узнать просто глядя на код? Только прогоняя код пошагово...
Между прочим это прародитель ФВП. По крайней мере я это как-то раз использовал в школе как указатель на функцию (хотя и не знал этого) и был ужасно горд красотой решения.
Давайте делиться "изобретенными" костылями, которые легко и удобно делаются на других языках (особенно если знаешь теорию).
Я лично "изобретал":
Односвязные списки на массивах в том же бейсике. Полиморфизм в С через union и указатель на функцию. Аналог продолжений на C# через yield return.
Все это уже можно было найти в литературе в то время, но я не знал как это называется и изобретал сам. Рассказывайте, уверен, например, что большинство старожилов "изобрели" почти все паттерны GoF до прочтения книги.
Здравствуйте, Ziaw, Вы писали:
Z>Все это уже можно было найти в литературе в то время, но я не знал как это называется и изобретал сам. Рассказывайте, уверен, например, что большинство старожилов "изобрели" почти все паттерны GoF до прочтения книги.
Так GoF только с терминологией и помогает разобраться, у них так и написано. Эти "паттерны" сами возникают при решении задач, читал ты книжку, или нет.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, Ops, Вы писали:
Z>>Все это уже можно было найти в литературе в то время, но я не знал как это называется и изобретал сам. Рассказывайте, уверен, например, что большинство старожилов "изобрели" почти все паттерны GoF до прочтения книги.
Ops>Так GoF только с терминологией и помогает разобраться, у них так и написано. Эти "паттерны" сами возникают при решении задач, читал ты книжку, или нет.
В целом верно. Но тот же визитор, при решении задач сам не возникает. Его "изобрести" надо.
Здравствуйте, Ziaw, Вы писали:
Z>В целом верно. Но тот же визитор, при решении задач сам не возникает. Его "изобрести" надо.
Я лично «изобретал» двойную диспетчеризацию на базе двумерной таблички функций (точнее, ассоциативный контейнер с ключом из пары типов), лишь бы Визитор не «изобретать» :)
Здравствуйте, Qbit86, Вы писали:
Q>Я лично «изобретал» двойную диспетчеризацию на базе двумерной таблички функций (точнее, ассоциативный контейнер с ключом из пары типов), лишь бы Визитор не «изобретать»
И я подобное делал, правда по одному типу. Визитор тот еще монстр. Но само решение достаточно интересное.