Що є більш доцільним - булеве призначення за допомогою вираза if / else чи булевого?


11

Що можна вважати більш ретельним?

if (a == b) c = true; else c = false;

або

 c = (a == b);

Я спробував шукати Code Complete, але не можу знайти відповідь.

Я думаю, що перший є більш читабельним (його можна буквально прочитати вголос), що, на мою думку, робить його більш ретельним. Другий, безумовно, має більше сенсу і зменшує код, але я не впевнений, що він є таким же ретельним для розробників C # (я би сподівався побачити цю ідіому ще в, наприклад, Python).


3
Два не є рівнозначними. Потрібно else c = falseдля першого або зробити завдання ||=за другим.

17
Я думаю, те, що вам довелося внести два редагування до першої форми, відповідає на ваше запитання!
Джеймс

7
Я згоден з @James. Друга форма, хоч і не є багатослівною, дуже зрозуміла і не залишає двозначності щодо її значення. Ніяких хитрощів чи ярликів не приймається, це просто коротко, оскільки концепція проста. Те, що ви зашифрували першу помилку, і довелося її відредагувати, щоб виправити її, і вона все ще не ідеальна (непослідовне використання брекетів), є підтвердженням того, що це не так просто, як ви думаєте.
Ерік Кінг

5
Нічого, чи справді C # devs вважає першу форму прийнятною? Це ... серйозно зменшує мою довіру до них. На мій досвід, використання першої форми сильно натякає на повне нерозуміння булевих виразів.
Андрес Ф.

2
Просто, щоб все було цікавим, ось ще один варіант:c = a==b ? true : false;
FrustratedWithFormsDesigner

Відповіді:


14

Другий варіант кращий.

Існує певна причина бути обережними щодо розумних ярликів програмування, які шкодять ремонтопридатності, затушовуючи наміри коду. Отже, я не звинувачую вас у питанні.

Однак я не вважаю c = (a == b);це прикладом розумного трюку. Це прямо уявлення про просту концепцію. Як завгодно прямо.

Належне, «ремонтопрігоден» форматування Вашого першого прикладу (без відсутніх дужок і одного рядка конструкції, які я робити розглянути розумний ярлик) дам цей код:

if (a == b)
{
    c = true; 
}
else 
{
    c = false;
}

На мій досвід, написання простої булевої логіки таким багатослівним, схильним до помилок ознакою коду "iffy". Мене змусить задуматися, наскільки складніша логіка обробляється в цій кодовій базі.


15

По-перше, зрозумійте, що ваші дві форми не рівнозначні.

if (a == b) c = true;

cбуде встановлено значення true, якщо aвоно дорівнює b, а якщо ні, його значення залишиться будь-яким, яке воно є.

c = (a == b);

cбуде встановлено значення true, якщо aдорівнює b, а якщо ні, то буде встановлено значення false.

Якщо ви хочете еквівалент другої форми в стилі першої форми, вам потрібно написати так:

if (a == b) {
  c = true;
} else c = false;

Тепер зрозуміло, хто з двох є більш читабельним, більш ретельним та менш ймовірно вводити помилки, якщо щось зміниться. Приклейте з другою формою.


Абсолютно правильно - я оновив своє запитання.
Брет Уокер

Я вважаю другу форму надто довгою і складною - якщо вам потрібен ефект, використовуйте булеве призначення.
Відновіть Моніку - М. Шредер

11

Я не погоджуюся з тим, що ваша перша форма є більш читаною - це, звичайно, не ідіоматичне C #, щоб мати два твердження в одному рядку, і не рекомендується мати ifоператор без використання дужок.

По-друге, я не бачу, наскільки друга форма є менш рентабельною - немає чого підтримувати. Це просте твердження про зв'язок між aі bі вона не може бути виражена більше просто.

Ще одна причина віддати перевагу другій формі полягає в тому, що ви можете оголосити cі призначити її в одному операторі, тобто

bool c = (a == b);

Модифікація змінних може легко призвести до помилок, тому я б цього уникав. Використання ifоператора вимагає, щоб змінна була оголошена перед умовною, а потім змінена.


Я читав два твердження в одному рядку як псевдокод
Джиммі Хоффа

1
+1 для " Another reason to prefer the second form is that you can declare c and assign it in a single statement"
Андрес Ф.

0

"більш ремонтабельні" можуть бути дуже суб'єктивними.

Зазвичай я віддаю перевагу читабельності та наміру щодо скорочення коду. Я думаю, що ви зберігаєте 8 набраних символів, використовуючи зменшену форму.

На мою думку, мова і культура навколо мови є характеристикою «читабельності».

Бувають випадки, коли продуктивність може бути причиною зменшення коду для оптимізації отриманого байтового коду, але це слід робити обережно після деякого профілювання.


Суб’єктив: Дух. Скорочення коду: також може (якщо не перестаратися) підвищити чіткість та краще спілкуватися з наміром. Продуктивність: зовсім не викликає занепокоєння (оптимізація іноді життєво важлива, але це не те, що підпадає під оптимізацію, оскільки це практично ніколи не має значення - можливо, навіть не ви пишете ядра чи драйвери).

4
Перша форма мала щонайменше 1 помилку, яку потрібно було виправити, приховавши її багатослів’я. Друга форма була простою і до речі, і не мала помилок. Я решту своєї справи. У будь-якому випадку, головна мета полягала не в тому, щоб набрати менше символів! І це питання зовсім не стосувалося продуктивності, що в даному випадку не має значення.
Андрес Ф.

@delnan точно мій погляд, Да. чиєсь зменшення коду - чиясь ясність. Я не наводив оптимізацію як основну проблему ... Я використав це як приклад. Ваша причина додавання розумних хитрощів або виходу за межі норми повинна бути збалансована тим, що ви / культура / підприємство вважатимете читабельним.
Джонні

1
Написання чистого булевого виразу - це не хитра хитрість!
Андрес Ф.

Я думаю, я б більше поцікавився вашим коментарем, якби ви насправді вирішили суть питання, а не дурну аналогію, що використовується для підґрунтя основної концепції.
Джонні

0

Другий. Він має менше повторень (DRY) і простіше зрозуміти, що відбувається, що cмає значення, чи ні, aі бути bрівними.

ІМХО, ще краще було б

c = a == b

Так само, як я писав би

  • 1 + 2 + 3 замість ((1 + 2) + 3)
  • 5 + 3 * 7 замість (5 + (3 * 7))

Очевидно і тривіально непотрібний код не є чеснотою. Це захаращено.


-4

Виборці, будь ласка, розкажіть, що не так у моїй переглянутій відповіді.

Так, c = (a == b);важко читати (що ще гірше, StyleCop скаржиться на непотрібні дужки), але мені все одно подобається простота a == b. Тому ось що я люблю використовувати, коли обидва aі bоднакові:

private static bool NoPeriod
{
    get
    {
        return this.MyWaveLength == this.HerWaveLength;
    }
}

І тоді ви можете зробити: this.c = this.NoPeriodзамість:

this.c = this.MyWavelength == this.HerWaveLength;

1
так ти мав на увазі return this.MyWaveLength = this.HerWaveLength;чи return this.MyWaveLength == this.HerWaveLength;замість цього?
Джессі К. Слікер

5
Що!? c = (a == b);не схильний до помилок. Перша форма в оригінальному питанні - це спосіб більш схильний до помилок , як це демонструє сама ОП, що має редагувати своє питання, щоб виправити помилки!
Андрес Ф.

Я думаю, що у вашому запропонованому рішенні є помилка = vs. ==
Ondra

@Ondra Morský, дякую ... компілятор би це схопив для мене.
Робота

6
Я не знайомий із StyleCop, але якщо він говорить про те, що непотрібні круглі дужки погані, слід вимкнути його. Непотрібні дужки для компілятора не потрібні, але вони можуть бути дуже-дуже приємними для людських очей. Якщо ви написали c = a == b; компілятор може це зрозуміти просто чудово, але людині складніше.
Майкл Шоу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.