LINUX.ORG.RU
ФорумTalks

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

 


0

3

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

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

Итак:

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

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

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

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

Deleted

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

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

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

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

Deleted
()

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

bl ★★★
()

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

bbk123 ★★★★★
()

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

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

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

staseg ★★★★★
()

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

Deleted
()

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

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

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

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

holuiitipun
()

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

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

Если у кого-то код начинает пахнуть

Это синестезия.

Kaschenko
()

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

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 ★☆☆☆
()
Ответ на: комментарий от holuiitipun

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

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

drull ★☆☆☆
()

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

DIRECTORY_SEPARATOR

Дооо...

deep-purple ★★★★★
()

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

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

http://tsya.ru

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

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

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

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

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

drull ★☆☆☆
()

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

Pavval ★★★★★
()
Ответ на: комментарий от 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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.