Производительность и читаемость C # с кнопками включения / выключения - PullRequest
0 голосов
/ 27 октября 2010

Я часто оказывался перед кодом такого типа:

if(Something > 0)
{
    btnOne.Enabled = true;
    btnTwo.Enabled = true;
    btnThree.Enabled = false:
}
else
{
    btnOne.Enabled = false;
    btnTwo.Enabled = false;
    btnThree.Enabled = true:
}

И я всегда задавался вопросом, лучше ли было бы позволить ему так или сказать так:

bool ButtonEnabled = (Something > 0);

btnOne.Enabled = ButtonEnabled;
btnTwo.Enabled = ButtonEnabled;
btnThree.Enabled = !ButtonEnabled;
1006 * Осознавая вопрос немного аргументированный, давайте оставим в стороне «читаемость» фактор и сосредоточиться на фактор производительности ... что было бы лучше?Еще одно задание или условие?

Заранее спасибо за советы (или даже лучший способ написать это)!

Редактировать: Исправлена ​​ошибка в моем втором фрагменте.Изменить: два первоначальных примера не были эквивалентны ...

Ответы [ 4 ]

5 голосов
/ 27 октября 2010

Это зависит от вызываемых свойств.Как вы знаете, недвижимость может приносить любую прибыль.В Windows Forms или WPF я бы об этом не беспокоился.Я бы поспорил за последний стиль для правильности и читабельности.Если вы устанавливаете все необходимые переменные каждый раз, меньше вероятность пропустить что-то и оставить одну кнопку в недопустимом состоянии.

Я бы сделал что-то вроде

bool ButtonEnabled = (Something > 0);
btnOne.Enabled = ButtonEnabled;
btnTwo.Enabled = ButtonEnabled;
btnThree.Enabled = !ButtonEnabled;
btnFour.Enabled = !ButtonEnabled;
1 голос
/ 27 октября 2010

Да, в отличие от вашего приложения, отображающего одновременно сто тысяч кнопок, сконцентрируйте HEAVILY на удобочитаемости, а не на микрооптимизации!Время, необходимое для обновления пользовательского интерфейса на уровне пользовательского интерфейса, будет в 10 000 раз больше, чем ваши «Включенные» назначения в любом случае!

Решение 2 - это практически то, что вы захотите сделать при использовании привязки данных (вы были очень близки: p).На самом деле, вы должны написать что-то более похожее на:

public class MyClass {
    public bool IsSomethingTrue { get; set; } // with notification on property changed
    public bool IsSomethingFalse { get { return !IsSomethingTrue; } }

    private AMethod() {
        ...
        IsSomethingTrue = Something > 0;
        ...
    }

А ваш пользовательский интерфейс будет выглядеть примерно так (WPF flavored):

<Button IsEnabled={Binding IsSomethingTrue} /> <!-- btn 1 -->
<Button IsEnabled={Binding IsSomethingTrue} /> <!-- btn 2 -->
<Button IsEnabled={Binding IsSomethingFalse} /> <!-- btn 3 -->
<Button IsEnabled={Binding IsSomethingFalse} /> <!-- btn 4 -->
<!-- Want a 5th button ? just add it without changing your code-behind ! -->

Этот шаблон позволяет вам добавить столько кнопок, сколькохочу, не меняя ваши методы каждый раз.Это особенно полезно, когда методы имеют тенденцию быть довольно сложным, и это улучшает удобочитаемость.

Это работает для WPF, Qt, Java, и я думаю, что Winforms должен обеспечить некоторую возможность привязки данных.

1 голос
/ 27 октября 2010

Вы не можете сравнить эти две части кода ни по удобочитаемости, ни по производительности, так как они дают разные результаты.

Версия первого кода, эквивалентного второму, будет:

if(Something > 0)
{
    btnOne.Enabled = true;
    btnTwo.Enabled = true;
    btnThree.Enabled = false;
    btnFour.Enabled = false;
}
else
{
    btnOne.Enabled = false;
    btnTwo.Enabled = false;
    btnThree.Enabled = true;
    btnFour.Enabled = true;
}

Версия второго кода, эквивалентного первому, будет:

bool ButtonEnabled = (Something > 0);

btnOne.Enabled = ButtonEnabled ? true : btnOne.Enabled;
btnTwo.Enabled = ButtonEnabled ? true : btnTwo.Enabled;
btnThree.Enabled = !ButtonEnabled ? false : btnThree.Enabled;
btnFour.Enabled = !ButtonEnabled ? false : btnFour.Enabled;

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

1 голос
/ 27 октября 2010

Какую бы разницу между показателями производительности вы ни увидели, в этом случае, скорее всего, она будет незначительной, поэтому я выбрал бы наиболее читаемый.

...