Как упростить код
От: Аноним  
Дата: 16.04.12 15:33
Оценка:
Вот такой лабиринт,


 if ( condition1 )
 { 
    if ( condition2 )
      return string.Format( "{0}", p[1] );
    else
      return string.Format( "{0}-{1}", p[1], p[0] );
 }
 else
 {
    if ( condition2 )
      return string.Format( "{0:N3}", p[1] );
    else
      return string.Format( "x:{0:N3} y:{0:N3}", p[1], p[0] );
 }



где condition1,2 — bool тип
p — массив double из двух элементов;
Re: Как упростить код
От: xvost Германия http://www.jetbrains.com/company/people/Pasynkov_Eugene.html
Дата: 16.04.12 15:39
Оценка: 1 (1) +1 -1
Здравствуйте, Аноним, Вы писали:


А>Вот такой лабиринт,


А чего тут упрощать? И так проще некуда.....
С уважением, Евгений
JetBrains, Inc. "Develop with pleasure!"
Re: Как упростить код
От: hardcase Пират http://nemerle.org
Дата: 16.04.12 15:39
Оценка:
Здравствуйте, Аноним, Вы писали:

Незачем упрощать этот код на C#, он и так понятен (в языках с PM можно переписать несколько иначе). Можно лишь привести к виду где лишь один вызов string.Format.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Как упростить код
От: vmpire Россия  
Дата: 16.04.12 16:34
Оценка: :)
Здравствуйте, Аноним, Вы писали:


А>Вот такой лабиринт,

А>


А> if ( condition1 )
А> { 
А>    if ( condition2 )
А>      return string.Format( "{0}", p[1] );
А>    else
А>      return string.Format( "{0}-{1}", p[1], p[0] );
А> }
А> else
А> {
А>    if ( condition2 )
А>      return string.Format( "{0:N3}", p[1] );
А>    else
А>      return string.Format( "x:{0:N3} y:{0:N3}", p[1], p[0] );
А> }

А>



А>где condition1,2 — bool тип

А>p — массив double из двух элементов;
Если это весь код, то упрощать, возможно, и не надо. Всё просто и очевидно.
Если же это часть большого куска однотипных проверок условий, который большой и растёт, то можно разово сформировать набор правил типа

List<Tuple<Predicate<bool[]>, Func<object[], string>>> formattingRules; // Да, я знаю, что читается плохо, можно свои классы ввести, будет гораздо лучше;

Заполнить его правилами

formattingRules.Add(new Tuple<Predicate<bool[]>, Func<object[], string>>(conditions => conditions[0] && conditions[1], p => string.Format( "{0}", p[1] )));
formattingRules.Add(new Tuple<Predicate<bool[]>, Func<object[], string>>(conditions => conditions[0] && !conditions[1], p => string.Format( "{0}-{1}", p[1], p[0] ) )));
formattingRules.Add(new Tuple<Predicate<bool[]>, Func<object[], string>>(conditions => !conditions[0] && conditions[1], p => string.Format( "{0:N3}", p[1] ) )));
formattingRules.Add(new Tuple<Predicate<bool[]>, Func<object[], string>>(conditions => !conditions[0] && !conditions[1], p => string.Format( "x:{0:N3} y:{0:N3}", p[1], p[0] ) )));



А потом, когда нужен результат, перебирать пока не сработает одно из условий

var conditions = new bool[] { текущие условия }
string result = formattingRules.Single(rule => rule.Item1(conditions)).Item2(p)


Если что, синтаксис не проверял.
Re: Как упростить код
От: namespace  
Дата: 16.04.12 17:20
Оценка:
Ожидалось нечто вроде этого?
string s1 = condition1 ? "{0}" : "{0:N3}";
string s2 = condition1 ? "{0}-{1}" : "x:{0:N3} y:{0:N3}";

return  string.Format(condition2 ? s1 : s2, p[1], p[0]));

Осторожно с условиями '?', не всем они нравятся.
Дальше сворачивать нет смысла — станет нечитабельно.
Задание c собеседования?
Re: Как упростить код
От: Flem1234  
Дата: 16.04.12 19:33
Оценка: -1
Здравствуйте, Аноним, Вы писали:

Можно сверстать табличкой, если условие станет лучше читаться:

             if  (condition1 &&  condition2) return string.Format("{0}", p[1]);
        else if  (condition2 && !condition2) return string.Format("{0}-{1}", p[1], p[0]);
        else if (!condition1 &&  condition2) return string.Format("{0:N3}", p[1]);
        else if (!condition1 && !condition2) return string.Format("x:{0:N3} y:{0:N3}", p[1], p[0]);


Только автоформатирование или рефакторинг может все испортить.
Re[2]: Как упростить код
От: andyag  
Дата: 16.04.12 19:55
Оценка: +1
Здравствуйте, Flem1234, Вы писали:

F>Здравствуйте, Аноним, Вы писали:


F>Можно сверстать табличкой, если условие станет лучше читаться:


F>
F>             if  (condition1 &&  condition2) return string.Format("{0}", p[1]);
F>        else if  (condition2 && !condition2) return string.Format("{0}-{1}", p[1], p[0]);
F>        else if (!condition1 &&  condition2) return string.Format("{0:N3}", p[1]);
F>        else if (!condition1 && !condition2) return string.Format("x:{0:N3} y:{0:N3}", p[1], p[0]);
F>


F>Только автоформатирование или рефакторинг может все испортить.


3 раза бессмысленный else для повышения читабельности?
Re[3]: Как упростить код
От: xvost Германия http://www.jetbrains.com/company/people/Pasynkov_Eugene.html
Дата: 16.04.12 19:58
Оценка:
Здравствуйте, andyag, Вы писали:

A>3 раза бессмысленный else для повышения читабельности?


Он ни разу не бессмысленный.
С уважением, Евгений
JetBrains, Inc. "Develop with pleasure!"
Re[4]: Как упростить код
От: andyag  
Дата: 16.04.12 20:04
Оценка:
Здравствуйте, xvost, Вы писали:

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


A>>3 раза бессмысленный else для повышения читабельности?


X>Он ни разу не бессмысленный.


Расскажите пожалуйста разницу между
            if  (condition1 &&  condition2) return string.Format("{0}", p[1]);
       else if  (condition2 && !condition2) return string.Format("{0}-{1}", p[1], p[0]);
       else if (!condition1 &&  condition2) return string.Format("{0:N3}", p[1]);
       else if (!condition1 && !condition2) return string.Format("x:{0:N3} y:{0:N3}", p[1], p[0]);

и
       if  (condition1 &&  condition2) return string.Format("{0}", p[1]);
       if  (condition2 && !condition2) return string.Format("{0}-{1}", p[1], p[0]);
       if (!condition1 &&  condition2) return string.Format("{0:N3}", p[1]);
       if (!condition1 && !condition2) return string.Format("x:{0:N3} y:{0:N3}", p[1], p[0]);
Re[5]: Как упростить код
От: xvost Германия http://www.jetbrains.com/company/people/Pasynkov_Eugene.html
Дата: 16.04.12 20:07
Оценка:
Здравствуйте, andyag, Вы писали:

A>Расскажите пожалуйста разницу между



Рву волосы на попе. В ночи не заметил что там return'ы
С уважением, Евгений
JetBrains, Inc. "Develop with pleasure!"
Re[6]: Как упростить код
От: andyag  
Дата: 16.04.12 20:11
Оценка: :))
Здравствуйте, xvost, Вы писали:

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


A>>Расскажите пожалуйста разницу между


X>

X>Рву волосы на попе. В ночи не заметил что там return'ы

Не поверите — были те же ощущения, когда ваш решарпер ткнул меня в такой код носом
Re: Как упростить код
От: Lloyd Россия  
Дата: 16.04.12 20:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>где condition1,2 — bool тип

А>p — массив double из двух элементов;

1. Дать condition1 и condition2 человеческие имена.
2. Завести структуктурку ConditionCase с 2-мя bool-овскими полями с именами данными на 1-м шаге
3. Завести static readonly Dictionary<ConditionCase, string> _CASE_FORMAT_MAPPING и зарегестрировать в ней форматные строки
4. Переписать гребенку if-ов на string.Format(_CASE_FORMAT_MAPPING[case], p[0], p[1]), где case это ConditionCase.
5. Понять, что получилось чрезчур overdesigned и вернуться к изначальному варианту.

Re[2]: Как упростить код
От: _d_m_  
Дата: 17.04.12 00:04
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, Аноним, Вы писали:


H>Незачем упрощать этот код на C#, он и так понятен (в языках с PM можно переписать несколько иначе). Можно лишь привести к виду где лишь один вызов string.Format.


Как?
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re[3]: Как упростить код
От: Lloyd Россия  
Дата: 17.04.12 00:09
Оценка:
Здравствуйте, _d_m_, Вы писали:

H>>Незачем упрощать этот код на C#, он и так понятен (в языках с PM можно переписать несколько иначе). Можно лишь привести к виду где лишь один вызов string.Format.


___>Как?


Завести переменную для форматной строки.
В зависимости от условий присвоить переменной то или иное значение.
Использовать форматную строку в string.Format

Re[4]: Как упростить код
От: _d_m_  
Дата: 17.04.12 00:27
Оценка:
Здравствуйте, Lloyd, Вы писали:

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


H>>>Незачем упрощать этот код на C#, он и так понятен (в языках с PM можно переписать несколько иначе). Можно лишь привести к виду где лишь один вызов string.Format.


___>>Как?


L>Завести переменную для форматной строки.

L>В зависимости от условий присвоить переменной то или иное значение.
L>Использовать форматную строку в string.Format

L>


И где здесь PM?
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re[5]: Как упростить код
От: Lloyd Россия  
Дата: 17.04.12 00:30
Оценка:
Здравствуйте, _d_m_, Вы писали:

L>>Завести переменную для форматной строки.

L>>В зависимости от условий присвоить переменной то или иное значение.
L>>Использовать форматную строку в string.Format

L>>


___>И где здесь PM?


В коде получения форматной строки.
Re[6]: Как упростить код
От: _d_m_  
Дата: 17.04.12 03:22
Оценка:
Здравствуйте, Lloyd, Вы писали:

___>>И где здесь PM?


L>В коде получения форматной строки.


И где код?
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re[2]: Как упростить код
От: -VaS- Россия vaskir.blogspot.com
Дата: 17.04.12 05:22
Оценка:
L>1. Дать condition1 и condition2 человеческие имена.
L>2. Завести структуктурку ConditionCase с 2-мя bool-овскими полями с именами данными на 1-м шаге
L>3. Завести static readonly Dictionary<ConditionCase, string> _CASE_FORMAT_MAPPING и зарегестрировать в ней форматные строки
L>4. Переписать гребенку if-ов на string.Format(_CASE_FORMAT_MAPPING[case], p[0], p[1]), где case это ConditionCase.
L>5. Понять, что получилось чрезчур overdesigned и вернуться к изначальному варианту.

+1, но п.5 вряд ли будет иметь место Маленькие классы — гуд, гуд и еще раз гуд.
Re[2]: Как упростить код
От: Nikita123 Россия  
Дата: 17.04.12 07:35
Оценка:
Здравствуйте, Flem1234, Вы писали:

F>Здравствуйте, Аноним, Вы писали:


F>Можно сверстать табличкой, если условие станет лучше читаться:


F>
F>             if  (condition1 &&  condition2) return string.Format("{0}", p[1]);
F>        else if  (condition2 && !condition2) return string.Format("{0}-{1}", p[1], p[0]);
F>        else if (!condition1 &&  condition2) return string.Format("{0:N3}", p[1]);
F>        else if (!condition1 && !condition2) return string.Format("x:{0:N3} y:{0:N3}", p[1], p[0]);
F>

Особенно веселое выделенное условие

F>Только автоформатирование или рефакторинг может все испортить.
Желаю успеха,
Никита.
Re[7]: Как упростить код
От: Lloyd Россия  
Дата: 17.04.12 10:10
Оценка:
Здравствуйте, _d_m_, Вы писали:

L>>В коде получения форматной строки.


___>И где код?


Там же, где и PM
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.