Принцип дизайна DRY в C? - PullRequest
       11

Принцип дизайна DRY в C?

0 голосов
/ 27 апреля 2018

Мой вопрос для большей перспективы кодирования, но я пытаюсь понять на простом примере. Допустим, у меня есть несколько строк кода

int main(void) {
    int input_1 = 10;
    int input_2 = 10;
    /* some stuff */
    return 0;
}

После прочтения принципов проектирования (я не уверен, было ли это общим для языка программирования или нет, я надеюсь, что он является общим), я узнал, что код выше является допустимым кодом C, но это грязный код потому что здесь я не следую принципу DRY (не повторяйся) , поскольку магическое число 10 повторяется.

Во-первых, я сомневаюсь, что в стандарте C говорится то же самое о лучших методах кодирования, я читал спецификации, но точно не понял?

И я изменил, как показано ниже, чтобы избежать фразы Грязный код

int main(void) { /* I'm not 100 percent sure that this is not dirty code ? */
    const int value = 10; /*assigning 10 to const variable*/
    int input_1 = value; 
    int input_2 = value;  
    /* some stuff */
    return 0;
}

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

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

СУХОЙ в основном относится к единственному источнику истины . Определенные бизнес-правила или шаблоны кода многократного использования должны быть выражены только один раз, , особенно если они могут быть изменены в будущем. Примеры включают код для расчета стоимости доставки или налоговых ставок, которые вы хотите кодировать ровно один раз и точно изменить в одном месте, если они меняются; или создание адаптера базы данных, который можно изменить только в одном месте при изменении данных базы данных.

DRY не означает, что вы должны сводить каждую строку кода, которая похожа на другую строку кода, в одну строку.

0 голосов
/ 27 апреля 2018

Это больше о том, как избежать магических чисел . Ваше 10 должно иметь некоторое семантическое значение, если вы заявляете, что это " то же самое 10 ". Тогда вы должны сделать что-то вроде

#define FROBNUM 10 // use a name here that explains the meaning of the number

int main(void) {
    int input_1 = FROBNUM; 
    int input_2 = FROBNUM;  
    /* some stuff */
    return 0;
}

Ввод const не требуется, макросы решают эту проблему хорошо. Здесь рассматривается DRY, определение макроса является единственным источником конкретного значения.


Если, с другой стороны, нет семантических отношений между двумя 10 значениями, #define вместо двух макросов. Это не «повторение», если они действительно имеют другое значение. Не поймите неправильно DRY здесь.


Примечание о вашей версии с const: у него есть два недостатка

  • Имя value совсем не семантическое, поэтому ничего не получилось, число все еще magic
  • С помощью этого объявления вы вводите новый объект с автоматической продолжительностью хранения и вводите int, который вам на самом деле не нужен. Хороший компилятор мог бы оптимизировать его, но лучше не полагаться на это - вот почему макрос подходит лучше.
...