Постоянное насилие? - PullRequest
       36

Постоянное насилие?

19 голосов
/ 07 декабря 2009

Я столкнулся с кучей кода в нескольких проектах на C #, которые имеют следующие константы:

    const int ZERO_RECORDS = 0;
    const int FIRST_ROW = 0;
    const int DEFAULT_INDEX = 0;
    const int STRINGS_ARE_EQUAL = 0;

Кто-нибудь когда-нибудь видел что-нибудь подобное? Есть ли способ рационализировать использование констант для представления языковых конструкций? IE: первый индекс C # в массиве находится в позиции 0. Я бы подумал, что если разработчик должен зависеть от константы, чтобы сказать им, что язык основан на 0, то есть большая проблема под рукой.

Чаще всего эти константы используются при обработке таблиц данных или внутри циклов for.

Я неуместен, думая, что это запах кода? Я чувствую, что это не намного лучше, чем:

const int ZERO = 0;
const string A = "A";

Ответы [ 17 ]

1 голос
/ 07 декабря 2009

Я не знаю, назову ли я их запахами, но они кажутся излишними. Хотя DEFAULT_INDEX действительно может быть полезен.

Смысл в том, чтобы избегать магических чисел и нули на самом деле не являются магическими.

1 голос
/ 07 декабря 2009

Я бы пошел на запах кода. Если нужны такие константы, поместите их в перечисление:

enum StringEquality
{
    Equal,
    NotEqual
}

(Однако я подозреваю, что STRINGS_ARE_EQUAL - это то, что возвращается string.Compare, поэтому взломать его, чтобы вернуть перечисление, может быть еще более многословно.)

Редактировать: Также SHOUTING_CASE не особенно .NET-стиль именования .

0 голосов
/ 08 декабря 2009

Вы можете увидеть что-то подобное в кроссплатформенной ситуации, когда вы будете использовать файл с набором констант, соответствующих платформе. Но, вероятно, не с этими фактическими примерами. Это похоже на то, что кодер COBOL пытался сделать свой C # похожим на английский язык (без обид для кодеров COBOL).

0 голосов
/ 08 декабря 2009

Правильно, вы сомневаетесь в этом запахе, молодой кодовый воин. Однако эти именованные константы являются производными от методов кодирования, которые намного старше, чем на заре Visual Studio. Они, вероятно, являются избыточными, но вы могли бы сделать хуже, чем понять происхождение соглашения. Подумайте о компьютерах НАСА, еще тогда, когда ...

0 голосов
/ 08 декабря 2009

Немного пахнет, но я мог видеть случаи, когда это имело бы смысл, особенно если у вас есть программисты, постоянно переключающиеся с языка на язык.

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

0 голосов
/ 13 декабря 2009

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

const int FIRST_ROW = 0 не имеет смысла.

const int MINIMUM_WIDGET_COUNT = 0 имеет больше смысла.

Предположение о том, что вы должны следовать стандарту кодирования, имеет смысл. (То есть стандарты кодирования предположительно правильны внутри организации.) Рабынно следовать им, когда презумпция не соблюдается, не имеет смысла.

Так что я согласен с предыдущими постерами, что некоторые из вонючих констант, вероятно, возникли в результате следования стандарту кодирования («без магических чисел») к букве без исключения. Вот в чем проблема.

0 голосов
/ 07 декабря 2009

Если ноль указывает на что-то отличное от нуля (в данном случае STRINGS_ARE_EQUAL), то это ВОЛШЕБНО Создание константы для нее является приемлемым и делает код более читабельным.

Создание константы под названием ZERO бессмысленно и трата энергии пальца!

...