Re: Как бы это написать красивее?
Здравствуйте, 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 если иначе то придется по умному кастовать или брать контейнер вместо массива.
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: Как бы это написать красивее?
Здравствуйте, R1K0, Вы писали:
DoSomething(bool right);
Re: Как бы это написать красивее?
Здравствуйте, R1K0, Вы писали:
RK>Всем привет. Вот делал вычитку и нашел достаточно распространенную процедуру реакцию кода. В общем виде выглядит так:
Ничего не трожь — это понятный код, его легко читать.
Re: Как бы это написать красивее?
Здравствуйте, R1K0, Вы писали:
RK>Вот можно ли как-то обернуть это в более красивую форму (если говорить про С++98) ?
Красота — в глазах смотрящего. Что вам не нравится?
И каждый день — без права на ошибку...
Как бы это написать красивее?
От:
R1K0
Дата: 23.06.15 08:55
Оценка:
Всем привет. Вот делал вычитку и нашел достаточно распространенную процедуру реакцию кода. В общем виде выглядит так:
bool test = DoSome();
if (test)
{
DoItRight();
}
else
{
DoItWrong();
}
Вот можно ли как-то обернуть это в более красивую форму (если говорить про С++98) ?
Re: Как бы это написать красивее?
Здравствуйте, R1K0, Вы писали:
RK>Вот можно ли как-то обернуть это в более красивую форму (если говорить про С++98) ?
(DoSome() ? DoItRight : DoItWrong)();
P.S. Каковы критерии красоты?
Re: Как бы это написать красивее?
Здравствуйте, 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: Как бы это написать красивее?
Здравствуйте, 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();
Третий Рим должен пасть!
От:
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) ?
По моему это эталон
Re[2]: Как бы это написать красивее?
От:
andy1618
Дата: 25.06.15 09:43
Оценка:
Здравствуйте, GhostCoders, Вы писали:
GC>как вариант
GC>GC>if (DoSome()) DoItRight(); else DoItWrong();
GC>
Тут классический недостаток — неудобство простановки брейкпойнтов.
Re[3]: Как бы это написать красивее?
Здравствуйте, andy1618, Вы писали:
A>Здравствуйте, GhostCoders, Вы писали:
GC>>как вариант
GC>>GC>>if (DoSome()) DoItRight(); else DoItWrong();
GC>>
A>Тут классический недостаток — неудобство простановки брейкпойнтов.
Что правда — то правда. Но автор топика, похоже, экономит на спичках, ибо другим путём сокращать уже некуда.
Re[2]: Как бы это написать красивее?
От:
omgOnoz
Дата: 25.06.15 13:14
Оценка:
Здравствуйте, MTD, Вы писали:
MTD>Ничего не трожь — это понятный код, его легко читать.
Причем не только на С — но и на других языках.
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;
}
Хотя, конечно, фабрики надо добавить...
И каждый день — без права на ошибку...
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить