LINUX.ORG.RU
ФорумTalks

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

 


0

3

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

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

Итак:

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

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

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

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

Deleted

Ответ на: комментарий от t184256

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

Используй бритву Оккама, она ещё уже.

pacify ★★★★★
()
Ответ на: комментарий от deep-purple

Мир не из одного пистона состоит. Не засчитано.

ага, уже бегу собирать для тебя ссылки на Java, Qt, Haskell, и прочие кроссплатформенные системы

сам справишься, если не баран

MyTrooName ★★★★★
()

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

Не угадал. Когда тебе надо поменять какой-то параметр (например строку), не надо будет долго лазить по коду и искать, где же он там используется.

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

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

Анонимус украл твой аккаунт?

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

чем ближе к железу

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

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

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

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

Когда тебе надо поменять какой-то параметр (например строку)

То она живет в конфиге, вовочка, не доставай учителя своими глупостями иди учись.

Deleted
()

Известная заповедь былокодера гласит: никаких строк в коде, все в константы и в заголовочные файлы

Смотри, мне, например, надо распарсить лор. Как лучше сделать?

#Вариант 1:
$text = wget("https://www.linux.org.ru/forum/talks/11928151");
#parsing...

#Вариант 2:
$url = "https://www.linux.org.ru/forum/talks/11928151";
#
#some code
#
$text = wget($url);
#parsing...
crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от crutch_master

оба варианта говно, ТЗ нет, даже здача «надо распарсить лор» поставленна не корректно

вон из программирования!

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

оба варианта говно

Но погоди, ты же сам написал, что

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

Исходя из твоих рассуждений - вариант 1. Почему же тогда оба варианта - говно?

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

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

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

вон из программирования!

Ну, напиши, как примерно должно всё это выглядеть. Можешь?

crutch_master ★★★★★
()

Белка написала тред в самый серьезный раздел форума, а все ведутся, словно это какой-то девелопмент.

Pavval ★★★★★
()

Лорчую, зачастую встречаются признаки обширного поражения головного мозга чекстайлами, но это можно и нужно лечить. Тоже думал, что тред про java. Вспомнил про интернирование. Это я о чем? Ок, не по теме уже.

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

Этоже ограничения языка, юзай языки где есть eval(YOU_CONSTANT) тогде код будет как тебе нравится - все легкоизменяемые константы.

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

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

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

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

выделение значений в константы снижает читабельность

Нет.

очередной фанатизм?

Тоже нет. Просто эффективность разработки.

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

Нет.

Да.

Тоже нет. Просто эффективность разработки.

Название своего бога пиши с большой буквы.

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

Нет
просто шлангуешь. А я думал

Ты думал? Ох, ты себе льстишь, ты даже прочитать пост не в интеллектуальных силах, не то чтобы вести аргументированную дискуссию 8)

Deleted
()

Ты пропустил вариант, связанный с группировкой сущностей. Например, тайминги или enum. Тогда проще вынести.

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

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

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

8) тем хуже

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

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

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

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

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

В яваскрипте я иногда выношу отдельно регулярки. Но причина другая - чтобы объект не пересоздавался когда скорость критична.

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

Не угадал. Когда тебе надо поменять какой-то параметр (например строку), не надо будет долго лазить по коду и искать, где же он там используется.

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

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

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

В общем случае да. Но некоторые вещи зарекомендовали себя тем, что «обязательно случится в будущем». К этому относится дупликация кода (понадобится поменять — забудешь поменять в копии), магические числа и строки и некоторые другие.

vurdalak ★★★★★
()

Пиши код, б***ь!

// Проследую-ка и я этому совету...

orm-i-auga ★★★★★
()
Последнее исправление: orm-i-auga (всего исправлений: 1)
Ответ на: комментарий от vurdalak

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

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

Правда то что я пишу касается яваскрипта и прочей динамики. Возможно для языков, где код управляется только через IDE, все иначе.

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

Чтобы не было магических чисел - обычно комментарии помогают, причем гораздо лучше.

Чем лучше?

Ну или если очень припекает - можно константу объявить локально, а не в начале файла.

Зачем? В чём профит обязательно нагадить в код, а не в начало файла?

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

Допустим есть методы «получитьПостыВыфера», «получитьКомментыВыфера» и «забанитьВыфера». В каждом из них понадобится строка «subwoofer».

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

когда я сменю ник ты выпустишь новую версию ПО?

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

Чем вынос в константы в начало файла. Код читать быстрее -> понимать быстрее. Намного. Сталкивался уже. Вероятность того что надо будет вникать в код намного выше, чем то что понадобится крутить константы не вникая.

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

оба варианта говно, ТЗ нет, даже здача «надо распарсить лор» поставленна не корректно

не уверен насчет запятых, у меня на твоих текстах спеллчек крашится

MyTrooName ★★★★★
()

1. Серебряной пули нет.

2. Хороший программист думает о структурах, плохой — о том, как выглядит код. — Линус Торвальдс.

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

Почему ты думаешь, что от прочтения имени константы понимание кода хуже, чем от прочтения строки текста?

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

Я не думаю, я знаю. Когда есть значение и комментарий - можно читать алгоритмы по диагонали, не задерживаясь на каждой стречке. Речь конечно о «значимых» константах, а не кодах конечного автомата и т.п.

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

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

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

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

С константами так же. Если ты не даёшь им имена A1 конечно. По имени константы ты видишь, что она значит, а на конкретный текст тебе абсолютно пофиг.

Я тебе больше скажу, когда код нестабильный, копировать куски тоже часто выгоднее, чем вытаскивать в библиотеки.

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

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

а на конкретный текст тебе абсолютно пофиг

Да нет, часто не пофик, в том-то и дело. Ну по крайней мере, в том коде, с которым мне приходится регулярно иметь дело.

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

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

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

Да нет, часто не пофик, в том-то и дело. Ну по крайней мере, в том коде, с которым мне приходится регулярно иметь дело.

А можно пример? Не обязательно реальный код, просто интересно понять, в каком случае надо видеть конкретную строку.

Например, если ты сравниваешь хреновой проект и хороший, а я хороший и очень хороший.

Я не сравниваю, у меня все проекты хорошие :) Но я видел проекты «извне» от всяких индусов, где строки прямо посреди кода встречаются и прочие прелести.

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

А можно пример? Не обязательно реальный код, просто интересно понять, в каком случае надо видеть конкретную строку.

Конкретно на ревью я проверяю что юзеру дается не какой-то, а правильный и понятный выхлоп. Строку надо смотреть. В случае с таймаутами тоже лучше знать конкретное значение.

В общем, когда нужно представить в голове результат или параллельно смотреть, что код не оторвался от реальной жизни. У меня «эволюционное прототипирование» во все поля. Код без реального результата, который можно потрогать руками, считается ненужным говном.

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

Ну это ж говнокод. А мы о том как хороший код сделать еще лучше.

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

на ревью я проверяю что юзеру дается не какой-то, а правильный и понятный выхлоп

А, ну тогда понятно. У нас ревьювят сам код и алгоритм, а на конкретные циферки и строчки пофиг всем кроме тестера.

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

Процесс разный. Просто в твоем не нужны всякие хипстерские фишки :).

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