Как бы это написать красивее?
От: R1K0 Россия  
Дата: 23.06.15 08:55
Оценка:
Всем привет. Вот делал вычитку и нашел достаточно распространенную процедуру реакцию кода. В общем виде выглядит так:

bool test = DoSome();
if (test)
{
    DoItRight();
}
else
{
    DoItWrong();
}


Вот можно ли как-то обернуть это в более красивую форму (если говорить про С++98) ?
Re: Как бы это написать красивее?
От: Pzz Россия https://github.com/alexpevzner
Дата: 23.06.15 08:58
Оценка:
Здравствуйте, R1K0, Вы писали:

RK>Вот можно ли как-то обернуть это в более красивую форму (если говорить про С++98) ?


(DoSome() ? DoItRight : DoItWrong)();


P.S. Каковы критерии красоты?
Re: Как бы это написать красивее?
От: Varavva  
Дата: 23.06.15 09:04
Оценка: +1 -2 :)
Здравствуйте, R1K0, Вы писали:

DoSomething(bool right);

Re: Как бы это написать красивее?
От: B0FEE664  
Дата: 23.06.15 10:11
Оценка: +1
Здравствуйте, R1K0, Вы писали:

RK>Вот можно ли как-то обернуть это в более красивую форму (если говорить про С++98) ?

Красота — в глазах смотрящего. Что вам не нравится?
И каждый день — без права на ошибку...
Re: Как бы это написать красивее?
От: Mr.Delphist  
Дата: 23.06.15 10:12
Оценка:
Здравствуйте, R1K0, Вы писали:

Тернарный оператор, что ж тут ещё придумывать.

https://en.wikipedia.org/wiki/%3F:#C
Re[2]: Как бы это написать красивее?
От: zaufi Земля  
Дата: 23.06.15 15:57
Оценка:
Здравствуйте, B0FEE664, Вы писали:

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


RK>>Вот можно ли как-то обернуть это в более красивую форму (если говорить про С++98) ?

BFE>Красота — в глазах смотрящего. Что вам не нравится?

я бы еще добавил `const bool test = ...` -- помочь возможно туповатому компилятору и намекнуть читателью что мы не собираемся этот `test` менять (это просто "проходная константа")
а в целом соглсен с B0FEE664.
Re: Как бы это написать красивее?
От: GhostCoders Россия  
Дата: 24.06.15 21:17
Оценка:
Здравствуйте, R1K0, Вы писали:

RK>Всем привет. Вот делал вычитку и нашел достаточно распространенную процедуру реакцию кода. В общем виде выглядит так:


RK>
RK>bool test = DoSome();
RK>if (test)
RK>{
RK>    DoItRight();
RK>}
RK>else
RK>{
RK>    DoItWrong();
RK>}
RK>


RK>Вот можно ли как-то обернуть это в более красивую форму (если говорить про С++98) ?


как вариант
if (DoSome()) DoItRight(); else DoItWrong();
Третий Рим должен пасть!
Re: По моему это эталон
От: omgOnoz  
Дата: 24.06.15 22:17
Оценка:
Здравствуйте, R1K0, Вы писали:

RK>Всем привет. Вот делал вычитку и нашел достаточно распространенную процедуру реакцию кода. В общем виде выглядит так:


RK>
RK>bool test = DoSome();
RK>if (test)
RK>{
RK>    DoItRight();
RK>}
RK>else
RK>{
RK>    DoItWrong();
RK>}
RK>


RK>Вот можно ли как-то обернуть это в более красивую форму (если говорить про С++98) ?


По моему это эталон
Отредактировано 24.06.2015 22:18 omgOnoz . Предыдущая версия . Еще …
Отредактировано 24.06.2015 22:18 omgOnoz . Предыдущая версия .
Re: Как бы это написать красивее?
От: MTD https://github.com/mtrempoltsev
Дата: 25.06.15 05:44
Оценка: +2
Здравствуйте, R1K0, Вы писали:

RK>Всем привет. Вот делал вычитку и нашел достаточно распространенную процедуру реакцию кода. В общем виде выглядит так:


Ничего не трожь — это понятный код, его легко читать.
Re[2]: Как бы это написать красивее?
От: andy1618 Россия  
Дата: 25.06.15 09:43
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>как вариант

GC>
GC>if (DoSome()) DoItRight(); else DoItWrong();
GC>


Тут классический недостаток — неудобство простановки брейкпойнтов.
Re[3]: Как бы это написать красивее?
От: Mr.Delphist  
Дата: 25.06.15 10:02
Оценка:
Здравствуйте, andy1618, Вы писали:

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


GC>>как вариант

GC>>
GC>>if (DoSome()) DoItRight(); else DoItWrong();
GC>>


A>Тут классический недостаток — неудобство простановки брейкпойнтов.


Что правда — то правда. Но автор топика, похоже, экономит на спичках, ибо другим путём сокращать уже некуда.
Re[2]: Как бы это написать красивее?
От: omgOnoz  
Дата: 25.06.15 13:14
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Ничего не трожь — это понятный код, его легко читать.


Причем не только на С — но и на других языках.
Re: Как бы это написать красивее?
От: comm Россия http://bipulse.ru
Дата: 27.06.15 16:29
Оценка: -2 :))) :))
Здравствуйте, R1K0, Вы писали:

RK>Всем привет. Вот делал вычитку и нашел достаточно распространенную процедуру реакцию кода. В общем виде выглядит так:


RK>
RK>bool test = DoSome();
RK>if (test)
RK>{
RK>    DoItRight();
RK>}
RK>else
RK>{
RK>    DoItWrong();
RK>}
RK>


RK>Вот можно ли как-то обернуть это в более красивую форму (если говорить про С++98) ?


Полагаю что хочется что-то вроде этого:

typedef void (method*)();
method methods = method[][ DoItRight, DoItWrong ];
(*(methods[ DoSome() ]))();


плюсы: нет ветвлений, совсем
минусы: истина = 1 , ложь = 0 если иначе то придется по умному кастовать или брать контейнер вместо массива.
С уважением, Алексей Васильев. http://bipulse.ru
Re: Как бы это написать красивее?
От: Zenden Россия  
Дата: 29.06.15 19:48
Оценка: +3 :))) :)
Здравствуйте, R1K0, Вы писали:

RK>Всем привет. Вот делал вычитку и нашел достаточно распространенную процедуру реакцию кода. В общем виде выглядит так:


RK>
RK>bool test = DoSome();
RK>if (test)
RK>{
RK>    DoItRight();
RK>}
RK>else
RK>{
RK>    DoItWrong();
RK>}
RK>


RK>Вот можно ли как-то обернуть это в более красивую форму (если говорить про С++98) ?


Можно. Сделать фабрику фабрик, применить паттерн декоратор, сервис локатор, DI и observer и тогда будет красиво.
Re[2]: Как бы это написать красивее?
От: B0FEE664  
Дата: 01.07.15 10:49
Оценка:
Здравствуйте, Zenden, Вы писали:

Z>Можно. Сделать фабрику фабрик, применить паттерн декоратор, сервис локатор, DI и observer и тогда будет красиво.


Сейчас модно и современно делать так:
   DoIf(DoSome(), []{DoItRight();}, []{DoItWrong();})();

  решение
#include <array>
#include <functional>
#include <iostream>
#include <stdlib.h>
#include <time.h>


template <class TFnTrue, class TFnFalse>
const std::function<void()>& DoIf(bool bCondition, TFnTrue&& fTrue, TFnFalse&& fFalse)
{
    static const std::array<std::function<void()>, 2> arr{ fFalse, fTrue };
    return arr[bCondition];
}


void DoItRight()
{
    std::cout << "DoItRight\n";
}
void DoItWrong()
{
    std::cout << "DoItWrong\n";
}
//bool DoSome() { return true; }
bool DoSome() { return rand() % 2; }


void DoItRight2(int n)
{
    std::cout << "DoItRight2 : " << n << "\n";
}
void DoItWrong2(const char* str)
{
    std::cout << "DoItWrong2 : " << str << "\n";
}


int main(int argc, char* argv[])
{
    srand(time(NULL));
    for(int i = 0; i < 10; i++)
    {
        DoIf(DoSome(), []{DoItRight();}, []{DoItWrong();})();

        int n = i;
        char* str = "asdf";
        DoIf(DoSome(), [&n]{DoItRight2(n);}, [&str]{DoItWrong2(str);})();
    }
    return 0;
}


Хотя, конечно, фабрики надо добавить...
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.