Как вы относитесь к жесткому кодированию?

Моя такая:

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

Я абсолютно ненавидел это, но факт в том, что «деловым людям» это нравится, потому что требуется меньше времени, чтобы получить то, что они хотели. И как разработчик программного обеспечения, особенно работающий в корпоративной среде, большинство людей скажут: «Да, зачем вообще, просто запрограммируйте это жестко». Как вы относитесь к жесткому программированию?


person Jeff    schedule 06.05.2009    source источник
comment
Я знаю, что в некоторых корпоративных средах люди намеренно жестко кодируют свой код, чтобы сохранить работу в долгосрочной перспективе.   -  person Jeff    schedule 06.05.2009
comment
И я подумал, что эта тема означает сложное кодирование!   -  person SteveL    schedule 10.09.2009


Ответы (17)


По возможности следует избегать жесткого кодирования.

Если вы жестко закодируете что-то в своем коде, это полностью «уничтожит» переносимость вашего кода в отличном степень. Даже с независимыми от платформы языками вы не сможете сказать: «Скомпилировать один раз, запустить где угодно». Поскольку это не очень хорошая практика разработки программного обеспечения, я думаю, что лучше избегать жесткого кода.

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

И в некоторых случаях нам может потребоваться жесткое кодирование из-за проблем с безопасностью и т. Д. :). вам может быть запрещено использовать реестр, файлы конфигурации, что угодно, потому что они могут увеличить поверхность атаки. Но я думаю, что это редкий случай.

person Chathuranga Chandrasekara    schedule 06.05.2009
comment
Я согласен, но часто в деловой среде люди не видят смысла в преобразовании своего продукта во что-то гибкое и простое в обслуживании. Они видят только окупаемость инвестиций, если что-то не вернется и не укусит их сильно. - person Jeff; 06.05.2009
comment
Вам нужно помнить одну вещь: все, что можно изменить с помощью внешней конфигурации, необходимо протестировать. Помните, что покупатель - идиот, и он возится с файлами, которые им не следует делать, и если все ломается, то это ваша вина. Жесткое кодирование не страдает этой проблемой. Вы можете запустить все свои тесты в данной конфигурации перед ее развертыванием на клиенте. - person Jacob Stanley; 06.05.2009
comment
Я согласен с тобой Джеффри, с точки зрения бизнеса рентабельность инвестиций может иметь более высокий приоритет .. :) - person Chathuranga Chandrasekara; 06.05.2009
comment
Я согласен с Джейкобом Стэнли. И я думаю, что именно поэтому людям нравится использовать m $ продуктов, потому что если что-то пойдет не так, они указывают пальцем на m $. - person Jeff; 06.05.2009
comment
Привет, Джейкоб! Что-то жестко кодируется тогда и только тогда, когда пользователю не требуется настраивать его. Тогда я предлагаю сделать это непонятным для пользователя. Затем он положил руку на это, это больше не изменение конфигурации .. Это повреждение файла ... Вы согласны? :) - person Chathuranga Chandrasekara; 06.05.2009
comment
Я согласен с тем, что есть кое-что, что нужно настроить. Но вы должны раскрывать эти вещи тогда и только тогда, когда они требуются покупателю. Код намного более гибкий, чем файл xml, вы можете выполнять ветвления, циклы, полиморфизм и т. Д. Не говоря уже о том, что у вас уже есть инструменты мирового класса для работы с кодом, такие как Visual Studio. Я не вижу, чтобы кто-то использовал intellisense на созданном вручную xml, и если он у них есть, где рентабельность инвестиций? - person Jacob Stanley; 06.05.2009
comment
Почему портативность? Я не вижу никакой связи между жестким кодированием значения и переносимостью. - person Stefan Steinegger; 06.05.2009
comment
Под переносимостью я имел в виду просто перенос кода с одного хоста на другой, а не через платформу и т. Д. Допустим, у нас есть жестко запрограммированный путь к файлу :) - person Chathuranga Chandrasekara; 06.05.2009
comment
Переносимость? Как Double LightSpeed ​​= 299792458.0 делает программу менее удобной? - person James Anderson; 06.05.2009
comment
Привет, Чатуранга, я немного подумал об этом, и, где это возможно, я бы предпочел конвенцию конфигурации. Например: изображения всегда хранятся в подпапке Images в каталоге приложения, вместо того, чтобы делать это местоположение полностью настраиваемым. - person Jacob Stanley; 06.05.2009
comment
Привет, Джейкоб! Возможность жесткого кодирования зависит только от требований пользователя. Если вы разрабатываете общее приложение, нет смысла хранить настраиваемый пользователем каталог для изображений, которые используются внутри. Но если приложение представляет собой систему управления персоналом, которая хранит информацию + фотографии сотрудников, тогда каталог изображений должен быть настраиваемым. Программист должен уметь различать параметры, которые должны настраиваться пользователем, но не должны. Получите ур пример. Вы используете подпапку в каталоге приложения. это означает ‹AppPath› \ images. Вы устанавливаете его как AppPath = C: \ pro \ images? - person Chathuranga Chandrasekara; 07.05.2009
comment
То же самое можно применить и к вопросу Джеймса. Кто-нибудь из пользователей говорит: "Эй, чувак, я хочу изменить скорость света на 12,1 км / ч"? Затем вы можете жестко запрограммировать его даже как константу в своем коде. - person Chathuranga Chandrasekara; 07.05.2009

Серебряных пуль в IT не существует.

  • Сделай это, если умно.
  • Не делай этого, если он тупой.

Если кто-то скажет вам сделать глупость, сохраните цепочку писем и сохраните свой J.O.B.

person user102015    schedule 06.05.2009
comment
+1. Для меня жесткое кодирование и мягкое кодирование не имеют общепринятого значения - жесткое кодирование оставляет в коде определенные детали, которые заслуживают абстракции из-за скорости, с которой они требуют изменений. Мягкое кодирование абстрагируется от специфики кода, даже если не ожидается, что они изменятся. хорошее кодирование - это смесь двух вещей, которые могут измениться, но вряд ли изменятся; вещи, которые будут измениться или могут быть упрощены за счет абстракции, абстрагируются. Все мы знаем, что слишком много жесткого кодирования - это плохо; но попытка разобраться в n-слоях абстракции на предмет чего угодно может быть столь же плохой. - person STW; 07.05.2009
comment
@ Yoooder - вы должны поместить этот комментарий в ответ. - person RichardOD; 29.08.2009

Нет ничего плохого в жестком кодировании, если оно сделано правильно по правильным причинам!

«Делать правильно» означает сосредоточить все ваше жесткое кодирование в одном или двух модулях.

Для C определите все значения в файле codes.h для Java есть класс code.java, который просто заполнен общедоступными константами.

Есть несколько «правильных причин» для жесткого кодирования.

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

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

person James Anderson    schedule 06.05.2009

Концептуально я не люблю слишком много жесткого кодирования.

Но на практике я стараюсь жестко кодировать некоторые значения. Основные причины жесткого кодирования:

  • По спецификации должно быть именно это значение, его нельзя менять. Внесение изменений может сделать программное обеспечение нестабильным.
  • Значение, вероятно, могло быть изменено позже, но неизвестно, кем и как, поэтому вы не знаете, где оно принадлежит. Он может принадлежать конфигурационному файлу, файлам ресурсов, базе данных, реестру или где-то еще. Поместить его в неправильное место хуже, чем жестко его закодировать.

Есть некоторые "лучшие практики жесткого кодирования", которые, я думаю, никогда не требуют чрезмерной инженерии:

  • Жестко закодированные значения всегда следует объявлять в центре констант.
  • Даже если значение жестко запрограммировано, его все равно следует передавать в качестве аргумента компонентам, которым не нужно заботиться о том, откуда взялось значение. Это делает ваш компонент многоразовым.

Это позволяет позже переместить жестко запрограммированные значения в другое место.

person Stefan Steinegger    schedule 06.05.2009
comment
Я думаю, что это настоящий ключ: даже если вы жестко закодируете его в своем основном приложении, вы должны передать это значение всем своим компонентам. Храните жесткую кодировку в одном месте, и это не означает, что повсюду важны общедоступные статические final MAGIC_NUMBER. - person Kevin Peterson; 07.05.2009

Как человек, у которого был некоторый опыт жесткого кодирования в ранние годы (не говори никому, приятель), я могу с уверенностью сказать вам, что он вернется, чтобы преследовать вас. Это приложение, которое я сделал (о котором я не сейчас говорю), которое пришлось полностью переписать, потому что в нем было много жестко запрограммированного контента. Это было еще в 1998 году, приятель.

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

person Cyril Gupta    schedule 06.05.2009
comment
Я предполагаю, что если кто-то, кто пишет программное обеспечение, также будет поддерживать его, история будет другой. Если кто-то просто пишет программное обеспечение и передаст его кому-то другому, чтобы тот поддержал его, я вижу, как этот сопровождающий громко плачет! - person Jeff; 06.05.2009
comment
это больше похоже на плохую структуру, а не на слишком много жесткого кодирования. Плохо спланированную программу с большим количеством абстракций поддерживать еще хуже, чем плохо спланированную программу, в которой все находится на месте, где оно используется. Я виноват в том, что отскакивал от обеих стен, нужен опыт, чтобы найти золотую середину - person STW; 07.05.2009
comment
пахнет преувеличением: если жестко запрограммированное значение никогда не изменится, с хорошими комментариями и юнит-тестами все будет в порядке. - person Junchen Liu; 16.02.2015
comment
жестко запрограммированные коды, заставляющие вас переписывать, нелогично, если проблема заключается в жестком кодировании, замените биты настраиваемыми данными, проблема должна быть решена, не так ли? если вы утверждаете, что жестко запрограммированное значение сделало ваш код нечитаемым, возможно, из-за отсутствия комментариев или из-за ошибки документации? - person Junchen Liu; 16.02.2015

Во встроенном и критически важном программном обеспечении жесткое кодирование имеет два основных преимущества:

  • это быстрее
  • это проще

Это означает меньшую нагрузку на ЦП, т.е. меньшее энергопотребление, меньшее или полное отсутствие распределения динамической памяти, меньшую алгоритмическую сложность, т.е. более легкую отладку, ...

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

Более того, гибкость обеспечивается за счет автоматического создания этого файла заголовка из базы данных.

person mouviciel    schedule 06.05.2009

Я думаю, что жесткое кодирование значений по умолчанию - это способ пойти на все, что может потребоваться для настройки:

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

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

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

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

person Tobias Schulte    schedule 06.05.2009
comment
Я думаю, он имеет в виду не настраиваемые значения, а любое значение, которое может измениться - например, максимальное количество свиней, которое может иметь пользователь. - person IAdapter; 06.05.2009

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

person Makis    schedule 06.05.2009
comment
Как человек, выпустивший множество коммерческих продуктов, я могу сказать вам, что некоторый код выходит один раз и никогда не поддерживается. Например, игровые тележки и диски для игровых систем. В таких случаях на техническое обслуживание тратится 0% от общей суммы. Но даже в случае продукта, который, как ожидается, будет иметь долгий срок службы, иногда самая важная эра жизни программного обеспечения наступает до того, как оно будет отправлено. Если вы пропустите установленный срок, программное обеспечение может умереть, и его никогда не придется обслуживать. - person Nosredna; 07.05.2009
comment
Я думаю, это сильно изменилось. Я не могу вспомнить, например, многие игры, которые не были бы потом исправлены, по крайней мере, в какой-то степени. И, конечно, если ваш продукт будет успешным, вы захотите сделать продолжение, и в этом случае, чем больше вы сможете повторно использовать свой старый код, тем лучше. Например, EA просто каждый год добавляет немного больше в свои спортивные игры (Madden, FIFA Soccer, NHL) и зарабатывает серьезные деньги. - person Makis; 07.05.2009

Жесткое кодирование - лучший способ!

Но, как упомянул Энтони, я помещаю настраиваемые значения в отдельный класс. Таким образом, их можно настроить во время компиляции, но без дополнительных сложностей, связанных с наличием внешнего файла xml / txt для настройки.

Я использую файлы xml / txt для настройки только там, где это абсолютно необходимо. В противном случае вы просто переусердствуете, что может быть так же плохо, если не хуже, чем жесткое кодирование. Не говоря уже о том, что есть много вещей, которые люди помещают в файлы конфигурации, которые вы вообще не хотите, чтобы клиент менял.

Если вам нужны разные конфигурации для разных клиентов, не проблема, поместите жестко запрограммированные значения в их собственную сборку / dll и разверните разные сборки конфигурации для каждого клиента.

Как сообщает Айенде, жесткое кодирование всего - это ключ к разрешению изменений.

person Jacob Stanley    schedule 06.05.2009

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

Для общесистемных констант я обычно создаю класс и создаю в нем константы.

person Anthony    schedule 06.05.2009

Здесь задействовано несколько факторов, которые вряд ли охватят все случаи.

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

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

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

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

person Ismael    schedule 06.05.2009

требуется меньше времени, чтобы получить то, что они хотели.

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

Конечно, это не значит, что жесткое кодирование всегда очень плохо. (Я имею в виду, что было бы глупо хранить, скажем, математическую константу, такую ​​как π, e или постоянная Планка, в файле конфигурации. Кроме того, жесткое кодирование таблицы поиска, скажем, для значений синуса / косинуса, вероятно, быть намного эффективнее, чем загрузка их из файла.) Но жесткое кодирование данных исключительно ради удобства не является разумной идеей. Он негибкий и делает последующее изменение данных гораздо более проблематичным, чем должно быть.

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

person hbw    schedule 06.05.2009

Если мне нужно char *, чтобы указать на 12 символов, я могу спокойно написать malloc(12), потому что sizeof(char) всегда будет 1. Если мне нужно int *, чтобы указать на 12 целых чисел, я пишу malloc(12 * sizeof(int)).

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

person Chris Lutz    schedule 06.05.2009

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

person sybreon    schedule 06.05.2009

Я всегда создаю константу, но как можно более близкую к тому месту, где должно быть ее «единственное» использование.

Если мне он понадобится где-то еще в блоке, он перемещается в верхнюю часть блока.

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

Если кто-то хочет его изменить, он перемещается в блок настроек (если еще не) и устанавливается из файла конфигурации и т. Д.

В конце концов, имя, которое вы даете этой вещи, является ее документацией, по крайней мере, это означает, что вы не путаете свой 73 с кем-то elses 73. Если вы понимаете, о чем я.

person Bill99    schedule 06.05.2009

Что касается жестко закодированных строк в C / C ++; Я обычно # определяю их как самый простой способ избежать жесткого кодирования (хотя в некотором смысле он все еще жестко запрограммирован). Причина в том, что определенный идентификатор с ошибкой будет обнаружен компилятором, тогда как все, что находится в кавычках, не будет.

person Community    schedule 09.05.2009

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

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

Однако крайне распространен этот тип антипаттерна:

File.Open(configuration["widgetsFileStorage"] + "/" + widgetImage)

Или это (вы бы когда-нибудь помещали вводимые пользователем данные непосредственно в href? Я бы не стал. Почему-то многие люди слишком доверяют значениям конфигурации).

LinkWriter.href=configuration["supportUrl"]

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

File.Open(new WidgetFileLocater().GetUncPath(widgetImage))

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

Также: Конфигурация почти всегда слабо типизирована, не компилируется и, следовательно, намного опаснее кода. Разработчики редко соблюдают этот риск (но очень уважают системные администраторы). Я обсуждал использование языка сценариев, такого как python / ironpython / boo, для нужд конфигурации. Я бы получил возможность изменять материал после компиляции с гораздо более свободным синтаксисом и проверкой типов, чем xml или текст.

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

person Precipitous    schedule 09.05.2009