LINUX.ORG.RU
ФорумTalks

Хардкодьте строки: строковые константы - признак пахучего кода.

 


0

3

Известная заповедь былокодера гласит: никаких строк в коде, все в константы и в заголовочные файлы (ну или их аналог в любимом ЯП).

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

Итак:

- если строка используется только один раз, то вынесение ее в констаны лишь добавляет строк в коде и проблем при чтении кода/отладке.

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

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

И да, это не правило, это констатация очевидного факта, для тех кто бездумно кодит «по правилам», хотя они обычно такие вещи не воспринимают 8).

Deleted

о вынесение ее в констаны лишь добавляет строк в коде и проблем при чтении кода/отладке.

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

Stahl ★★☆ ()
Ответ на: комментарий от Stahl

Если не придумал то выноси в константы, все в константы просто шоб было, во имя великой справедливости!

Deleted ()

у нас есть одна бд, архитектор которой придерживался этих правил.
у него все строковые поля вынесены в отдельную табличку, когда наша контора взяла этот проект, там было порядка 200млн записей, и с ней были связаны практически все другие таблички. а еще для какой-то беды нужны были представления. на то время их было порядка 60тыс. всякие там dbview-ры которые пытались отрисовать список объектов бд при этом вешалось.

bl ★★★ ()

Второе «если» не раскрыто.

bbk123 ★★★★★ ()

- если строка используется только один раз, то вынесение ее в констаны лишь добавляет строк в коде и проблем при чтении кода/отладке.

Эту мысль стоит развить, иначе низачот.

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

staseg ★★★★★ ()

Если у кого-то код начинает пахнуть - это начинается Фоулер головного мозга.

Dimez ★★★★★ ()

бла-бла-бла goto — это плохо бла бла бла.

БРЕД

Oxdeadbeef ★★★ ()

- если строка используется только один раз, то вынесение ее в констаны лишь добавляет строк в коде и проблем при чтении кода/отладке.

А потом иди разбирай, что значит «aeeex12» а коде, хотя могло быть просто HANDSHAKE_UID.

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

Про использование сторонних api ничего не слышали? Там иногда нужны всякие id.

holuiitipun ()

Белки это такие же собаки, как кошки, только собаки.

Kaschenko ()
Последнее исправление: Kaschenko (всего исправлений: 1)

Жаваутенок свихнулся, вызовите санитаров.

Deleted ()

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

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

t184256 ★★★★★ ()

либо попытка получить доступ к одному ресурсу (файлу, узлу дерева настроек, урлу)

А если урл везде почти одинаковый, но всё же немного отличается?

GanGSISoft ★★ ()
Ответ на: комментарий от staseg

Эту мысль стоит развить, иначе низачот.

бритва оккама + чтобы узнать значение константы надо кудато лезть, хорошо если прокрутить вверх, а то в другой файл (дя, дя, у некоторых есть специально обученные иде диктующие писать абы как - иде то поможет разобраться )

Deleted ()
Ответ на: комментарий от holuiitipun

А потом иди разбирай, что значит «aeeex12» а коде, хотя могло быть просто HANDSHAKE_UID.

т.е. еслиб не необходимость в документации то тыб переменными не пользовался? познакомить тебя с комментариями?

Deleted ()
Ответ на: комментарий от GanGSISoft

то очевидно что это публичный интерфейс к какомуто API, а значит все это строковое колхозничество должно быть скрыто за абстракцией , иначе у тебя подставить этот самый api при тестировании не выйдет 8).

Deleted ()
Ответ на: комментарий от Deleted

т.е. еслиб не необходимость в документации то тыб переменными не пользовался? познакомить тебя с комментариями?

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

holuiitipun ()
Ответ на: комментарий от holuiitipun

Константа описана отдельным комментарием. Сверху использования это было бы не так явно.

Ты что-то путаешь - вот код, вот использование значения, вот коммент - все явно, и явнее быть не может.

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

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

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

Deleted ()
Ответ на: комментарий от Deleted

без навороченной ide

Проблемы людей без ide, в около java мире без ide особо никуда.

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

Дока на всё и ведется в основном на случай ввода новых девелопероа. Ну и полная дока - требование безопасников)

holuiitipun ()
Ответ на: комментарий от holuiitipun

Проблемы людей без ide, в около java мире без ide особо никуда.

При чем тут java?

Ну и полная дока - требование безопасников)

Значит надо так и писать - безопасники требуют делать константы 8)

Deleted ()

Ну а вообще всё это надо без фанатизма. Если один-пять раз используется что-то понятное, как «methods», а не бессмысленный набор букв, то константа не нужна.

holuiitipun ()
Ответ на: комментарий от holuiitipun

Эээ ну собственно о том и речь, что без фанатизма надо 8)

Deleted ()

если строка используется только один раз

Сегодня используется один раз, завтра два, а послезавтра - три. А послепослезавтра эту строку понадобится поменять.

drull ★☆☆☆ ()
Ответ на: комментарий от Deleted

чтобы узнать значение константы надо кудато лезть

Поставь себе нормальный IDE.

drull ★☆☆☆ ()
Ответ на: комментарий от holuiitipun

что-то понятное, как «methods»

А потом попробуешь выполнить по коду какого-то распространенного слова и офигеешь.

drull ★☆☆☆ ()

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

DIRECTORY_SEPARATOR

Дооо...

deep-purple ★★★★★ ()

А как насчёт одинаковых сообщений в программе? Предлагаешь везде хардкодить строки?

могут не парится

http://tsya.ru

Deleted ()
Ответ на: комментарий от drull

Сегодня используется один раз, завтра два, а послезавтра - три. А послепослезавтра эту строку понадобится поменять.

Правильно! Поэтому, при подозрении на такое, следует сразу написать класс для абстракции. Ещё один класс. И ещё один, попутно сломав совместимость со старыми сборками, наводя красоту. Разложить все по разным файлам и перейти к документированию.

Suigintou ★★★★ ()
Последнее исправление: Suigintou (всего исправлений: 1)
Ответ на: комментарий от Suigintou

И тут константы нужны - если тебе придется в результате изменения бизнес-логики искать что-то вроде «active» по нескольким десяткам файлов - ты офигеешь.

drull ★☆☆☆ ()

Испугался, вынес все константы в синглтон, обращаюсь через геттеры. Теперь-то я спокоен.

Pavval ★★★★★ ()
Ответ на: комментарий от Deleted

Если у тебя однаковые сообщения в разных местах, то это показывает как все плохо 8)

Deleted ()
Ответ на: комментарий от drull

Если строка начала «внезапно» использоваться три раза, значит ты накосячил и теперь лепишь костыли.

Deleted ()

а вот любителям динамической фигни навроде питона стоит задуматься.

В перле часто использую что-нибудь типа:

use constant DEFAULT_CONFIG => '/usr/local/etc/belka.conf';
DELIRIUM ★★☆☆☆ ()
Ответ на: комментарий от Deleted

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

Deleted ()
Ответ на: комментарий от Deleted

Например, компилятор может выдавать одинаковые сообщения, обрабатывая разные директивы.

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

Pavval ★★★★★ ()
Ответ на: комментарий от Pavval

Почему же? Компилятор может ожидать, например, точку где-нибудь и выдавать одинаковое сообщение, указывая номера строки и символа.

Deleted ()
Ответ на: комментарий от DELIRIUM

ага а потом при установке в /usr оно опупливается

Deleted ()
Ответ на: комментарий от Deleted

Подумай еще раз если копилятор выдает одинаковое сообщение при разных условиях - то они должны сыпаться из одного места тогда строка используется один раз, если условия разные а сообщение одинаковое то дурит юзера.

Причем подобное поведение характерно для некоторый проприетарных СУБД, например оракле и db2, последняя жжот особенно феерична выдавая три кода ошибки и витиеватое сообщение на совершенно разные ситуации, видимо это ты писал.

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)

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

upcFrost ★★★★★ ()
Ответ на: комментарий от Oxdeadbeef

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

upcFrost ★★★★★ ()
Ответ на: комментарий от upcFrost

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

Deleted ()

А как быть, если необходима интернационализация приложения?

ThePretender ()
Ответ на: комментарий от Deleted

Приведу пример. Допустим, существует некий ЯП, вот пример:

class Bar, inherits Foo {...}; var dummyArray = {a, b, c};
Теперь неправильный пример:
class Bar inherits Foo {...}; /* 1:11: error: expected a comma */ var dummyArray = {a b, c}; // 3:21: error: expected a comma
Строка одна и используется два раза в:

  • модуле, который обрабатывает токены, описывающие класс;
  • модуле, который обрабатывает списки, разделяемые запятой.
Deleted ()

лишь добавляет строк в коде

если строка используется больше одного раза

Как быть, если реализация адекватной обёртки «лишь добавляет строк в коде» (что вполне реально при количестве повторений порядка среднего размера реализации тривиальной абстракции(класса/функции/whatever), особенно в некоторых популярных в «энтэрпрайзе» языках)?

DonkeyHot ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.