Какое было самое странное стандартное правило кодирования, которому вы были вынуждены следовать? [закрыто]

173

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

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

Под странным я имею в виду самое смешное, худшее или просто странное.

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

Брайан Р. Бонди
источник
19
После прочтения этого списка внезапно я чувствую, что мне очень повезло, что я избежал этой принудительной стандартной чепухи!
Мэтт б
В следующий раз, когда я соберу интервью для работы, я собираюсь просмотреть этот вопрос, чтобы служить "Красным флагом. Беги!" показатель. Кодирование стандартных анти-паттернов, действительно.
Стю Томпсон
5
И мне стыдно признать, что в самом начале своей карьеры я навязал один из ответов команде. Мне очень жаль, ребята.
JasonFruit

Ответы:

434

Я ненавижу, когда использование нескольких возвратов запрещено.

Саймон Джонсон
источник
26
Какова предполагаемая точка этого правила? Лично я бы провалил проверку кода для кода, который можно было бы сделать проще, вставив другой возврат.
Марк Бейкер
22
С другой стороны, удаление опции в начале, такой как «if (param == null) return null», может немного очистить ваш код, чтобы запретить это вместо поощрения, что это несколько преступно.
Билл К
39
Обходной путь: if (! Initialize ()) {RetVal = ERR_BADINIT; Перейти к ReturnPoint; } (намного больше кода) ReturnPoint: return RetVal; } Задача решена! ;)
Марк Бернье
9
До недавнего времени многократные возвраты были запрещены. Затем был обнаружен тот факт, что это был остаток от C, устаревший C ++ RAII и функции с размером менее 15 строк. С тех пор как Храброе Сердце: "СВОБОДА !!!!" ... :-p ...
paercebal
122
Ваш выбор: множественные возвраты или несколько вложенных операторов if. Я возьму несколько возвратов.
Лэнс Фишер
333

обратный отступ. Например:

    for(int i = 0; i < 10; i++)
        {
myFunc();
        }

и:

    if(something)
        {
// do A
        }
    else
        {
// do B
    }
code_g03s_g00d
источник
152
Боже мой ... Могу ли я встретить социопата, который придумал это? Он мог бы научить меня кое-чему о человеконенавистничестве.
Джон Руди
23
Это не может быть правдой.
датчанин
191
Каждый раз, когда вы отменяете отступ, Бог убивает разработчика технического обслуживания.
Крис Вест
14
OMG, ты шутишь?
Андреа Амбу
21
экономит драгоценные байты ... бесценно, много
пользуйся
326

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

Galwegian
источник
5
Разве это не просто венгерская запись для БД?
АРКБАН
19
Разве это не похоже на префикс переменных с помощью var?
Брайан Р. Бонди
26
В том же духе я ненавижу, когда столбцы идентификаторов в базах данных имеют префикс имени таблицы, как в таблице продуктов будет столбец productid. Избыточность, которая иногда делает сценарии без ORM более головной болью, чем нужно
Эндрю Ингрэм
30
Я на самом деле предпочитаю, чтобы столбец идентификатора начинался с имени таблицы. Делает написание запросов немного проще. А для внешних ключей вы можете иметь поле внешнего ключа такое же, как поле ключа.
Крейг
38
С другой стороны, я ненавижу, когда имена таблиц должны быть единичными. Мой инстинкт состоит в том, чтобы назвать таблицу, которая содержит, скажем, клиентов, «Клиенты», а не «Клиент». Звучит незначительно, пока вы не поймете все проблемы, которые вы бы сэкономили, если бы вы могли назвать свою таблицу «Транзакции» вместо «[Транзакция]».
Atario
248

Почти любой вид венгерской нотации.

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

int appCount = 0; // Number of apples.
int pearCount = 0; // Number of pears.

Но большинство людей используют его для определения типа.

int iAppleCount = 0; // Number of apples.
int iPearCount = 0;  // Number of pears.

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

Toon Krijthe
источник
71
См. Этот пост Джоэля о программном обеспечении о том, как правильное использование венгерской нотации может помочь уменьшить количество ошибок: joelonsoftware.com/articles/Wrong.html
flicken
9
Конечно, используя C ++ вместо C, вы можете написать код, чтобы компилятор выдавал ошибку при сравнении яблок и груш.
Андреас Магнуссон
5
Да, Джоэл понял это правильно. Хотелось бы, чтобы компиляторы могли использовать версию Джоэла.
Лорен Печтел
9
Разве это не должно быть "int cntApples = 0; int cntPeas = 0;"? То есть. Префикс - это переменная «kind».
Blorgbeard выйдет
42
По крайней мере, первое правильно ... все с «Apple» должно иметь префикс «i». ;)
Йоханнес Чарра
240

Территориальный оператор, где я сейчас работаю, не допускается:

int value = (a < b) ? a : b;

... потому что не каждый "получает это". Если бы вы сказали мне: «Не используйте это, потому что нам пришлось переписывать их, когда структуры становятся слишком сложными» (вложенные троичные операторы, кто-нибудь?), Тогда я бы понял. Но когда вы говорите мне, что некоторые разработчики их не понимают ... хм ... Конечно.

Джаррет Мейер
источник
235
Каждый босс имеет в виду себя.
Брайан Р. Бонди
13
Раньше я попадал в этот лагерь ... Но вырос из него и научился любить условного оператора (когда это уместно).
Джон Руди
22
Во всяком случае, правило должно быть «всегда использовать троичный оператор», оператор чистой красоты :)
Бобби Джек,
16
Я люблю это, но причина, которую я получаю чаще всего за то, что я не использую это то же самое, что ваш опыт "люди не поймут этого" Я утверждаю, что они не должны работать, если они не могут понять концепцию ...
Aidos
7
Иначе как бы вы условно инициализировали постоянную переменную без написания совершенно новой функции (что не принесет пользы для удобства чтения). Использование const для локальных «переменных» гораздо полезнее для понимания и следования коду, чем запрет троичного оператора.
Андреас Магнуссон
239

НИКОГДА не удаляйте код при внесении изменений. Нам сказали, чтобы прокомментировать все изменения. Имейте в виду, что мы используем контроль источников. Эта политика длилась недолго, потому что разработчики были в шуме из-за этого и того, как он сделает код нечитаемым.

George
источник
3
Я действительно ненавижу это ... есть несколько человек, которые делают это здесь (это не стандарт или что-то еще)
chills42
7
Именно по таким правилам я чувствую необходимость печатать исходный код, который я наследую от других в цвете. На десяти страницах это не очень приятно для моей компании - но это единственный способ, которым я могу прочитать ее, если мне нужно ее распечатать. (Мы унаследовали многое, следуя этому правилу ...)
Джон Руди
3
Звучит как правило, разработанное до исходного контроля. Или из-за того, что программисты регистрируются только раз в неделю.
Крейг
6
Я люблю читать эти ответы, потому что это делает мою работу в 100 раз лучше.
rjh
2
Желаю вам ... мы находимся в SVN уже более 4-х лет, но старший разработчик ненавидит его и проверяет примерно раз в два месяца, тратя следующие три дня на компиляцию неисправного кода: /
Виктор Свуб,
204

Я когда - то работал под тиранией Могучей Б. Кинг .

VB король был чистый мастером MS Excel и VBA, а также баз данных ( отсюда его фамилии: Он играл с Excel в то время как разработчики работали с составителями, и бросить ему вызов на базах данных может иметь пагубные последствия для вашей карьеры ... ).

Конечно, его огромные навыки дали ему уникальное видение проблем разработки и решений по управлению проектами: хотя VB King не совсем точно соответствовал стандартам кодирования в самом строгом смысле, у него регулярно появлялись новые идеи о «стандартах кодирования» и «лучших практиках», которые он пробовал (и часто удавалось) навязать нам. Например:

  • Все массивы C / C ++ должны начинаться с индекса 1, а не с 0. Действительно, использование 0 в качестве первого индекса массива устарело и было заменено проницательным управлением индексами массива в Visual Basic 6.

  • Все функции должны возвращать код ошибки: в VB6 нет исключений, так зачем они вообще нужны? ( т.е. в C ++ )

  • Поскольку «Все функции должны возвращать код ошибки» непрактично для функций, возвращающих значимые типы, все функции должны иметь код ошибки в качестве первого параметра [in / out].

  • Весь наш код будет проверять коды ошибок ( это привело к худшему случаю VBScript if-indentation, который я когда-либо видел в своей карьере ... Конечно, так как предложения «else» никогда не обрабатывались, никакой ошибки на самом деле не было найдено, пока не стало слишком поздно ». ).

  • Поскольку мы работаем с C ++ / COM, начиная с сегодняшнего дня, мы будем кодировать все наши служебные функции DOM в Visual Basic.

  • Ошибки ASP 115 - это зло. По этой причине мы будем использовать On Error Resume Next в нашем VBScript / ASP-коде, чтобы избежать их.

  • XSL-T является объектно-ориентированным языком. Используйте наследство, чтобы решить ваши проблемы ( тупой сюрприз чуть не сломал мне челюсть в один прекрасный день ).

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

  • перехватить все исключения в COM-интерфейсе наших COM-модулей и утилизировать их молча ( таким образом, вместо сбоя модуль будет казаться быстрее ... Shiny! ... Поскольку мы использовали обработку ошибок über, описанную выше, нам даже потребовалось некоторое время, чтобы понять, что на самом деле происходит ... У вас не может быть ни скорости, ни правильных результатов, не так ли? ).

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

Все, кроме массивов C / C ++ , служебных функций VB DOM и XSL-T в качестве языка ООП, были реализованы, несмотря на наши протесты. Конечно, с течением времени некоторые из них были обнаружены, хм , сломаны и вообще заброшены.

Конечно, авторитет В.Б. Кинга никогда не пострадал за это: среди высшего руководства он оставался техническим экспертом "высшего класса" ...

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

paercebal
источник
28
Re: 1-индексация. Иногда вам просто нужно встать и сказать что-то сильное, типа «это глупо и неправильно». Нарисуйте линию на песке. Забудь об успокоении эго и просто скажи это. Я могу почти гарантировать, что любой другой стоящий программист немедленно начнет кивать и присоединяться.
Кирк Штраузер
31
@jrista: Если ВЫ НЕ комментируете написание моего текста, пожалуйста, игнорируйте следующее ... ... ... ... ... ... ... ... Если вы комментируете мой текст, пожалуйста (1) предложите исправления, (2) исправьте орфографию самостоятельно, или (3) примите во внимание, что не каждый разработчик в мире (далеко не так) является носителем английского языка, поэтому я предполагаю, что терпение к неправильному написанию - это минимум, который вы можете сделать, или докажите, что вы можете сделать лучше, отправив мне правильный перевод на французском ... ^ _ ^ ...
paercebal
4
Если бы этот парень был моим начальником, я бы обратился к каждому руководителю высшего звена с хорошо написанным и задокументированным списком жалоб и уволил бы его. -1 за то, что у меня нет шаров, чтобы постоять за себя.
muusbolla
34
@muusbolla: Кто тебе сказал, что мы не жалуемся? Он рос, пока делегация из двух человек (включая меня) не пошла прямо к генеральному директору, чтобы объяснить проблему. Но я сожалею, что должен сказать вам, что есть разница между идеалистическим миром, где царит справедливость, и реальным миром, где некоторые боссы верят, что «управление никогда не ошибается, даже когда оно есть», и сокрушат любого, кто осмелюсь противоречить этой догме. Единственный счастливый сувенир, который у меня есть с того времени, - это день, когда я подал в отставку, почти три года назад, и с того дня я стал счастливее. Во всяком случае, если это правда, ваша причина неудач хромает. Сожалею.
paercebal
7
@paercebal: En générale, c'est correctement écrit, sauf que quelques petit erreurs: «squatch»: ça doit être «squash»; «Этот один день»: en ce context-là, на диарейте «тот день»; «Складские процедуры»: «складские процедуры»; «Chocked» s'écrit «задохнулся». Aussi, dans les commentaires, vous utilisez ° упомянутый », ce qui doit être« упомянутый »Mais vraiment, tout, не оправдывающий pas un telle plainte. В противоположность этому, все в порядке и превосходно. Felicitations!
интуитивно
131

Еще в 80-х / 90-х годах я работал в компании по авиационным симуляторам, которая использовала FORTRAN. Наш компилятор FORTRAN имел ограничение в 8 символов для имен переменных. Стандарты кодирования компании зарезервировали первые три из них для информации в стиле венгерской нотации. Поэтому мы должны были попытаться создать значимые имена переменных всего за 5 символов!

Дэвид Арно
источник
17
Роскошь: у нас было всего 6 персонажей; пакет имел имена, начинающиеся с g; все внутренние функции запущены gk; были драйверы для рабочих станций с кодами, такими как 0p (так что gk0p был началом), оставляя нам два символа для остальной части названия Фортрана. gk0paa, gk0pab, ...
Джонатан Леффлер
103
«Когда я был в твоем возрасте, у нас было только 2 персонажа! И это было без учета регистра!»
pookleblinky
53
Раньше нам приходилось вставать в 2 часа ночи, за 3 часа до того, как ложиться спать, затем писать собственные компиляторы и платить компании за привилегию идти на работу. Нам разрешили только букву A для наших имен переменных. Тогда наш босс удалял наш код и танцевал в наших списках, напевая Аллилуйя.
Дэвид Арно
12
«50 возможных идентификаторов должно быть достаточно для всех»: p
Крис Вест
5
Чёрт, интерпретаторы BASIC, с которыми мы работали давным-давно, имели двухсимвольные имена переменных. Зачем жаловаться на 5?
Дэвид Торнли
107

Я работал в месте, где произошло слияние двух компаний. У «доминантного» был основной сервер, написанный на K & R C (то есть до ANSI). Они вынудили команды Java (из обоих офисов - вероятно, всего 20 разработчиков) использовать этот формат, который радостно проигнорировал 2 столпа «дебатов о скобках» и сразу сошел с ума:

if ( x == y ) 
    {
    System.out.println("this is painful");
    x = 0;
    y++;
    }
Майкл Пасха
источник
18
Я думаю, что поддержание большего визуального различия между C и Java облегчит переходы. (+1 за «и сходит с ума».
Джеффри Л. Уитледж,
4
Похоже на стиль Whitesmiths, который использовался в оригинальном «Программировании Windows» Петцольдом - пойди разберись! ;)
Бобби Джек
7
Я считаю, что это самый умный стиль скобок. К сожалению, большинство людей не используют его. Если фигурные скобки имеют семантическое значение, они должны обрабатываться так, как они есть, а не вставляться в конец строки и игнорироваться.
Райан Ланди
7
@Kyralessa. Я не согласен ... Я не знаю, имеют ли фигурные скобки смысловое значение, но они, безусловно, могут повлиять на сопоставление с образцом и ощущение пространства. ИМО, эта версия теряет это полностью. Например, я хочу, чтобы моя закладка высовывалась за пределы книги, а не была на одном уровне со страницами.
Майкл Пасха
6
На самом деле это мой предпочтительный стиль, но все в мире (особенно в Visual Studio) по умолчанию использует другие режимы, поэтому я сдался. Почему мне это нравится? Скобки являются «частью» содержащегося кода - они заставляют его «выглядеть» как единственное утверждение для if, чего он и ожидает.
Atario
104

Запрещено:

while (true) {

Разрешается:

for (;;) {
bh213
источник
4
Другие утверждают, что for (;;) {это идиома C для первого.
Роберт П
69
Если я правильно понимаю современные, новомодные смайлики, то этот стандарт заставляет бедных, перегруженных заявлениями плакать!
Бен Бланк
15
Это фактическое правило здесь. VC6 выдает предупреждение компилятора о while (true), но не о for (;;). В противном случае они эквивалентны. Таким образом, мы выбираем без предупреждения.
user9876
22
Бьярне С. в своей книге сказал: «ибо (;;) следует читать как всегда». Если он достаточно хорош для создателя C ++, он должен быть достаточно хорош для вас. :-)
Фрэнк Крюгер
58
В самой первой C-программе, над которой я работал, кто-то добавил #define ever (;;), чтобы вы могли сказать «навсегда {...}»
Джеймс Керран
101

мой друг - назовем его CodeMonkey - получил свою первую работу в колледже [ много лет назад], занимаясь разработкой в ​​COBOL. Его первая программа была отклонена как «не соответствующая нашим стандартам», потому что в ней использовались ... [содрогаться!] Вложенные операторы IF

стандарты кодирования запрещали использование вложенных выражений IF

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

Эта ошибка компилятора, конечно, была исправлена ​​в течение по крайней мере десятилетия, но никто не оспаривал стандарты . [baaa!]

CodeMonkey удалось изменить стандарты - в конце концов!

Стивен А. Лоу
источник
7
Стивен, это напоминает мне историю эксперимента с обезьянами: o) freekvermeulen.blogspot.com/2008/08/…
Ник Дандулакис,
5
@ [Ник Д]: да, я тоже - отсюда и кодовое имя «CodeMonkey» ;-)
Стивен А. Лоу
Возможно, причина была неправильной, но все же хорошо избегать вложенных ifs - c2.com/cgi/wiki?ArrowAntiPattern
manojlds
97

Когда-то работал над проектом, где подчеркивания были запрещены. И я имею в виду полностью запрещен. Таким образом, в приложении ac # winforms, всякий раз, когда мы добавляли новый обработчик событий (например, для кнопки), нам приходилось переименовывать имя метода по умолчанию из buttonName_Click () во что-то другое, просто чтобы удовлетворить эго парня, написавшего код стандарты. По сей день я не знаю, что он имел против скромного подчеркивания

ZombieSheep
источник
23
Возможно _ был сломан на его клавиатуре;)
Роман Плашил
139
buttonNameUnderscoreClick ()
выход
9
Имеет неприятный побочный эффект предотвращения использования FILE и LINE для отладки. И #if __cplusplus extern "C" в заголовочных файлах. И целочисленные типы в stdint.h. И размер_т.
Стив Джессоп
8
Хорошо, что это был C # тогда
конфигуратор
4
Я серьезно не одобряю подчеркивания (хотя и не в описанном выше случае ОП. Это дополнительные два нажатия клавиш (shift + _), которые я предпочитаю не
нажимать
92

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

  • 0: данные, которые используются везде
  • 1: данные, которые используются только определенным модулем
  • 2: таблица соответствия
  • 3: календарь, чат и почта
  • 4: регистрация

Это затрудняет поиск таблицы, если вы знаете только первую букву ее имени. Также - поскольку это база данных mssql - мы должны везде окружать имена таблиц квадратными скобками.

-- doesn't work
select * from 0examples;

-- does work
select * from [0examples];
Кристоф Нейринк
источник
65
Мне очень жаль, так ужасно жаль ...
Кирк Штраузер
1
Вау - хорошо. Я думаю, что использование писем было невозможно? Не то чтобы это тоже хорошая идея, но по крайней мере вам не нужно указывать все имена таблиц.
Марк Бриттингем
ошеломляет ... кто это придумал? дба?
dotjoe
90

Мы делали проект на C ++, а руководителем команды был парень из Pascal.

Итак, у нас был стандартный код включения, чтобы переопределить весь этот надоедливый синтаксис C и C ++:

#define BEGIN {
#define END }

но подождите, это еще не все!

#define ENDIF }
#define CASE switch

и т. д. Трудно запомнить после всего этого времени.

Это взяло то, что было бы прекрасно читаемым кодом C ++ и сделало его неразборчивым для всех, кроме руководителя группы.

Мы также должны были использовать обратную венгерскую нотацию, т.е.

MyClass *class_pt  // pt = pointer to type

UINT32 maxHops_u   // u = uint32

хотя, как ни странно, мне это нравилось.

billmcc
источник
22
Создание неуправляемого кода на будущее
rshimoda
2
Венгерская запись сделана правильно, все в порядке. Сделано неправильно ... ick. Правильная система типов побеждает оба.
Телема
5
Знаешь, я думаю, что я с тобой об этом. Венгерские бородавки не так уж и нежелательны, когда их вот так прикрепляют.
TED
хаха возвращает меня в те времена, когда я перешел с Pascal на C ++ (около 16 лет назад). Каждый раз, когда я видел {я должен был мысленно сказать себе: “{означает НАЧАТЬ”. По крайней мере, для меня это было просто в моей голове.
Томасруттер
6
Когда я работал над поддержкой MS VC ++, у нас было несколько клиентов, которые отправляли репро код, написанный так Нам потребовалось некоторое время, чтобы понять, что это на самом деле в C ++ (они не включают #defines).
JBRWilkinson
88

На прежней работе:

  • «Нормальные» таблицы начинаются с T_
  • «Системные» таблицы (обычно поиски) начинаются с TS_ (кроме случаев, когда они этого не делают, потому что в тот день кому-то не нравилось)
  • Таблицы перекрестных ссылок начинаются с TSX_
  • Все имена полей начинаются с F_

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

оборота Джером Ирвин
источник
а у вас не было специального префикса для полей первичного ключа ???
Чими
2
@Czimi: я забыл упомянуть об этом. Каждая таблица имеет поле с именем FI_ID, используемое в качестве первичного ключа.
Джером Ирвин
31
Черт возьми ... T_guy, который изобрел этот кошмар, должен быть убит F_gun и отправлен в TSX_hell.
Сергей Скобликов
3
У нас были таблицы и поля для всех полей и таблиц. Совершенно бесполезно ...
конфигуратор
5
@configurator: у вас было «tbl» для всех полей и «fld» для всех таблиц? :-)))
Тимви
84

Мой приятель столкнулся с этим правилом, работая на правительственной работе. Использование ++ (до или после) было полностью запрещено. Причина: разные компиляторы могут интерпретировать это по-разному.

JaredPar
источник
5
Ну, в этот момент вы могли бы также сдаться, верно?
Кирк Штраузер
90
Кого-то укусила непонимание разницы между postfix и prefix, заявленной ошибкой компилятора, а затем причиненной ею другим людям, мне кажется
Бернард
5
На самом деле, они были правы, в некоторых обстоятельствах. Запрет кажется немного чрезмерным, хотя. Взять, к примеру, строку: a [i] = i ++; я могу получить увеличение до того, как оно будет использовано для индексации или после. Язык не определяет это.
TED
9
Он прав - порядок операций не гарантируется, когда вы используете ту же переменную в другом месте оператора. Просто запретите потенциально неоднозначный код, но не все его применения!
Лорен Печтел
2
Может быть так же бан, =как он может быть использован, чтобы вызвать неопределенное поведение.
конфигуратор
81

Половина команды предпочла отступ в четыре места; другая половина отдавала предпочтение отступу в два пробела.

Как вы можете догадаться, стандарт кодирования предписал три, чтобы «обидеть всех одинаково» (прямая цитата).

Тим Лешер
источник
42
Вот почему табуляция так хороша. Каждый может изменить размер в своем редакторе;)
xardias 21.10.08
41
Да, отступ на вкладке - это здорово ... пока вы на самом деле не откроете чужой файл и не обнаружите, что вещи смещены, потому что пробелы перепутались там, где их не должно быть, или не перепутались там, где они должны быть. Затем вы автоматически переформатируете, и различия в управлении версиями станут ужасными. Тьфу.
Алан Хенсель
41
вот почему вы должны использовать только вкладки для отступа, и только пробелы для выравнивания, и никогда не встречайте двойника. и если вы собираетесь внести изменения в пробел в файле, то это должно быть единственное изменение, которое вы вносите для этой конкретной регистрации.
Joh6nn
16
... и это никогда не работает. : P
Роберт П
10
Чтобы "оскорбить всех одинаково" ... Я люблю это. Я запомню это в следующий раз, когда меня как-то вовлекут в войну за стандартизацию отступов.
Майкл Берр
74

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

leppie
источник
10
Да, магию трудно поддерживать, по-видимому;) LOL, хотя.
Рик
19
Это, вероятно, правильное правило по неправильным причинам :)
Бобби Джек,
71
за «магическую» производительность чтения убивает неосуществимый неясный кошмарный код. Он прав.
gbjbaanb
4
Я полагаю, вам тогда вообще не разрешалось кодировать в .Net. В конце концов, многое из того, как работает фреймворк, - это отражение.
NotMe
5
Долой этих волшебников !! Всегда рядом со своей магией , крадя нашу работу, соблазняя наших женщин и развращая наших детей!
ZJR
71

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

Это может показаться не слишком странным, за исключением одного небольшого недостатка. Все программное обеспечение предназначалось для серверного программного пакета, работающего на Linux, и все клиентские коробки, которые покупал наш клиент, были Linux. Если не считать попыток выяснить, как настроить Wine (в те дни очень ненадежный) и запустить его на всех этих компьютерах, и посмотреть, сможем ли мы запустить IE и научить их администраторов отлаживать проблемы Wine, это просто невозможно удовлетворить просьбу владельца. Проблема заключалась в том, что он занимался веб-дизайном и просто не знал, как сделать веб-сайты совместимыми с FireFox.

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

Овидий
источник
1
Я бы сказал, это довольно странно.
Брэд Гилберт
14
Три ура за капитализм!
звездно-голубой
46
Да, ради выживания сильнейшего ... этот парень не заслуживал того, чтобы заниматься собственным программным бизнесом.
Марк Бриттингем
10
Последнее предложение было великолепным. Как можно воспринимать кого-то серьезно, когда он принимает такие решения?
Мистер Шикаданс
54

Использование имен с общим номером

В моей текущей работе у нас есть два правила, которые действительно имеют значение:

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

Таким образом, мы в конечном итоге с customer.reserve_field_14указанием адреса электронной почты клиента.

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

Правило 2: один из наших продуктов написан на VB6, а VB6 имеет ограничение на общее количество имен различных идентификаторов, и, поскольку код очень велик, мы постоянно сталкиваемся с этим ограничением. В качестве «решения» все имена локальных переменных нумеруются:

  • Lvarlong1
  • Lvarlong2
  • Lvarstr1
  • ...

Хотя это эффективно обходит ограничение идентификатора, эти два правила в совокупности приводят к красивому коду:

...

If Lvarbool1 Then
  Lvarbool2 = True
End If

If Lvarbool2 Or Lvarstr1 <> Lvarstr5 Then
  db.Execute("DELETE FROM customer WHERE " _ 
      & "reserve_field_12 = '" & Lvarstr1 & "'")
End If

...

Вы можете представить, как трудно исправить старый или чей-то код ...

Последнее обновление: теперь мы также используем «резервные процедуры» для частных пользователей:

Private Sub LSub1(Lvarlong1 As Long, Lvarstr1 As String)
  If Lvarlong1 >= 0 Then 
    Lvarbool1 = LFunc1(Lvarstr1)
  Else
    Lvarbool1 = LFunc6()
  End If
  If Lvarbool1 Then
    LSub4 Lvarstr1
  End If
End Sub

РЕДАКТИРОВАТЬ: Кажется, что этот шаблон кода становится все более и более популярным. Смотрите этот пост The Daily WTF, чтобы узнать больше: астигматизм :)

Даниэль Риковски
источник
10
Без шуток. Могу поспорить, что потребовалось навсегда, чтобы пройти и удалить все эти инъекции SQL. ;-)
Кирк Штраузер
Это чистое зло. Я уверен, что ваш босс / TL - повелитель, просто ждущий его возможности.
Мануэль Феррерия
5
О боже, кто, черт возьми, придумал бы правила, как это ??? самое главное: как, черт возьми, ваша команда умеет кодировать ??
hasen
2
Я думаю, он имел в виду, что вы бы выбрали все поля по умолчанию, чтобы вы также получили все «резервные» поля, без необходимости указывать их все.
Мистер Шикаданс
2
Возможно, вы можете использовать предварительную обработку кода, где вы будете писать свой код, используя значимые имена переменных, а затем заменять его на «правильные», прежде чем компилировать что-то вроде «% s / email / reserve_field_12 / g»;)
João Portela
53

В свое время на C ++ нам не разрешали использовать ==,> =, <=, && и т. Д. Для этого были макросы ...

if (bob EQ 7 AND alice LEQ 10)
{
   // blah
}

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

if (NULL EQ ptr); //ok
if (ptr EQ NULL); //not ok

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

Адам Страуган
источник
1
rofl .. написание фортрана на языке C.
Роберт Полсон
я все еще делаю переменную null == в c #. я знаю, мне не нужно об этом беспокоиться, но я не могу с собой поделать. если я вижу это с другой стороны, я нервничаю. Старые привычки умирают с трудом.
Трой Ховард
Последний из них о психопате почти сразу убьет некоторых людей.
Мистер Шикаданс
31
+1 за порочного психопата.
rcollyer
Размещая код на форумах, я иногда буду использовать такие вещи, как LT и SHL, чтобы операторы не превращались в HTML.
Суперкат
45

Венгерская нотация в целом.

vfilby
источник
11
Ну, мне нравится H / N для контроля на странице. Гораздо проще найти все элементы управления textbox в раскрывающемся списке IntelliSense, когда все, что мне нужно искать, это txtFooBar.
cciotti
20
Обозначения HUngarian не являются злыми, их просто нужно правильно использовать joelonsoftware.com/articles/Wrong.html
Czimi
1
Я уступлю в отношении контроля. Тогда венгерская запись может быть полезной. В целом, я думаю, что венгерские обозначения устарели и, как правило, используются неправильно. Оно отклонилось от своего первоначального намерения.
vfilby
9
Ужасно неправильно, да. Неверно, нет.
Лорен Печтел
2
Многие люди начинают имя интерфейса с I, IEnumerable, IList ... В .Net Framework все интерфейсы начинаются с I.
tuinstoel
43

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

Самая глупая была на работе в НАСА, в которой я работал в начале 90-х. Это была огромная работа с более чем 100 разработчиками. Опытные разработчики, написавшие стандарты кодирования, решили, что каждый исходный файл должен начинаться с четырехбуквенной аббревиатуры, а первая буква должна обозначать группу, ответственную за файл. Вероятно, это была отличная идея для старых проектов FORTRAN 77, к которым они привыкли.

Тем не менее, это был проект Ada с хорошей иерархической библиотечной структурой, поэтому он не имел никакого смысла. Каждый каталог был полон файлов, начинающихся с той же буквы, за которыми следовали еще 3 бессмысленных письма, подчеркивание, а затем часть имени файла, которая имела значение. Все пакеты Ады должны были начинаться с этой же бородавки из пяти символов. Предложения Ada «use» также не допускались (возможно, это хорошо при нормальных обстоятельствах), поэтому это означало, что любая ссылка на любой идентификатор, не являющийся локальным для этого исходного файла, также должна включать эту бесполезную бородавку. Вероятно, должно было произойти восстание по этому поводу, но весь проект был укомплектован младшими программистами и только что принят в колледж (я сам был последним).

Типичный оператор присваивания (уже многословный в Ada) будет выглядеть примерно так:

NABC_The_Package_Name.X := NABC_The_Package_Name.X + 
  CXYZ_Some_Other_Package_Name.Delta_X;

К счастью, они были по крайней мере достаточно просвещены, чтобы позволить нам более 80 колонн! Тем не менее, объект бородавки был настолько ненавистен, что превратился в шаблонный код в верхней части всех исходных файлов, чтобы Ада «переименовала», чтобы избавиться от бородавки. Там будет одно переименование для каждого импортированного ("увядшего") пакета. Как это:

package Package_Name renames NABC_Package_Name;
package Some_Other_Package_Name renames CXYZ_Some_Other_Package_Name;
--// Repeated in this vein for an average of 10 lines or so

То, что более творческий среди нас занимался, пыталось использовать бородавку, чтобы сделать осмысленно (или глупо) название пакета. (Я знаю, о чем ты думаешь, но выговоры не были позволены и позор тебе! Это отвратительно). Например, я был в группе кода C ommon, и мне нужно было создать пакет для взаимодействия с группой W orkstation. После мозгового штурма с парнем с рабочей станции мы решили назвать наши пакеты так, чтобы кто-то, кому нужны оба, должен был написать:

with CANT_Interface_Package;
with WONT_Interface_Package;
TED
источник
1
При этом НАСА до сих пор не может понять, рассчитывать ли километры или мили ...
NotMe
16
Черт, и я действительно думал, что ты собираешься изо всех сил использовать соглашение об именах пакетов CUN * _ и W * NK_. Извините, у меня медленные, взрывные текстовые туретты. Но твои были намного, намного смешнее!
Defmeta
41

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

Позже я понял, что причина, по которой он даже пришел ко мне по этому поводу, заключается в том, что сервер SVN будет отправлять ему (и еще 10 руководителям) почту для каждого коммита, который кто-то делает. И, засоряя систему контроля версий, я догадался, что он имеет свой почтовый ящик.

Авиху Турцион
источник
Выделите письмо, нажмите «Удалить», готово
TheLQ
Я определенно не фанат так называемых «коротких проверок». Зафиксируйте, когда ваше изменение будет завершено, все просто. Я также хотел бы пообещать в конце рабочего дня, так как это заставляет меня думать, что мой код должен быть компилируемым и, по крайней мере, исполняемым с остальным проектом для других кодеров на следующее утро.
Джесси С. Slicer
2
Получите лучшее из обоих миров - посвятите себя местному отделению, если вы не хотите что-то потерять. Перебазируйте и сдавляйте эти коммиты, когда будете готовы применить их в мастер. (простите за терминологию git - я уверен, что это возможно в ртутных и некоторых других системах)
Майкл Андерсон
Я согласен со всем вышеперечисленным. Это коренная проблема приближения к контролю версий. У него нет технологического решения. Я подумал о переходе на git-svn, который позволил бы мне работать с локальным репозиторием, а затем перенести вещи в SVN-репозиторий, но это просто отправило бы письма для всех коммитов моего дня в одной огромной партии и решило бы ничего для моих боссов.
Авиу Турцион 18.10.10
34

Выполнение всех запросов к базе данных с помощью хранимых процедур в Sql Server 2000. От сложных многостоловых запросов до простых, таких как:

select id, name from people

Аргументы в пользу процедур были:

  • Производительность
  • Безопасность
  • Ремонтопригодность

Я знаю, что тема процедуры довольно спорная, поэтому не стесняйтесь оценивать мой ответ отрицательно;)

оборота азкотоки
источник
2
Поддержка может быть улучшена, если имена таблиц и столбцов не уникальны, а имена SP. Это может облегчить поиск ссылок на код. Если есть какие-либо иные преимущества в улучшении ремонтопригодности, я о них не знаю. Безопасность является основной причиной использования SP.
Джеффри Л Уитледж
2
Я согласен, что для общих целей это не 100% wtf, но посмотрите эту ссылку: codinghorror.com/blog/archives/000292.html
azkotoki
2
«Безопасность - главная причина использования SP». Нет. Ничто в SP не является более безопасным. Они безопасны только тогда, когда они называются парезетризованными запросами, что также можно сделать с помощью динамического SQL.
Флори
4
Неее: sprocs полезны. Временами это может быть неприятно, но в итоге вы пишете лучший, более многократно используемый интерфейс базы данных. Ваши dba также могут легче анализировать проблемы с производительностью и могут обновлять производственную систему без изменения кода приложения. Я не защищаю логику бизнеса в sprocs все же.
Роберт Полсон
4
хоронить запросы в скомпилированном коде - такая боль, я на 100% отстаиваю 100% политику sprocs только для абстракции
annakata
33

На 1000 строк кода должно быть 165 модульных тестов (не обязательно автоматизированных). Это работает в одном тесте примерно для каждых 8 строк.

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

harriyott
источник
Как юнит-тест не автоматизирован.
Пупено
Как они придумали волшебное число 8?
Рохит
1
Что будет, если у вас 164? 166?
Даниэль Даранас
8
Больше похоже на 6 строк.
рекурсивный
1
Я полагаю, это зависит от того, насколько точны ваши тесты. Я бы посчитал, function(x).should == 2что это один тест, тогда как другие объединят 10 из них и назовут его одним тестом
Орион Эдвардс
30

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

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

натуральный
источник
3
Да, конечно, потому что комментарии просто беспорядочные, в конце концов ... и подумайте, сколько циклов экономит препроцессор во время компиляции! (Приложение даже смешнее, чем правило. Хорошее.)
ojrac
7
Конечно! Разработчики должны писать код, а не тратить время на написание комментариев :)
Даниэль Риковски,
2
Да! А комментарии замедляют сборку!
Грег Д
2
Тем не менее я считаю хорошим правилом сортировку членов по типу (поля, свойства, методы) и по имени
абатищев
3
Я сортирую методы, элементы и т. Д. В алфавитном порядке в соответствующих группах, как в заголовке, так и в источнике ... но только потому, что я одержим.
Джон Перди
29

Примерно в 1987 году я устроился на работу в компанию, которая меня наняла, потому что я был одним из небольшого числа людей, которые знали, как использовать Revelation. Откровение, если вы никогда не слышали об этом, было, по сути, реализацией операционной системы Pick на базе ПК, которая, если вы никогда о ней не слышали, получила свое имя от своего изобретателя, легендарного имени Дика Пика. О Pick OS можно сказать многое, но в основном это хорошо. Ряд производителей Supermini (по крайней мере, Prime и MIPS) использовали Pick или свои собственные пользовательские реализации.

Эта компания была главным магазином, и для своих внутренних систем они использовали информацию. (Нет, на самом деле это было его имя: это была реализация Пика Праймом.) У них был контракт с государством на создание системы на базе ПК, и они вложили около года в свой проект Revelation, прежде чем парень сделал всю работу, который также был их директором MIS, решил, что не может больше выполнять обе работы, и нанял меня.

Во всяком случае, он установил ряд стандартов кодирования для их программного обеспечения на основе Prime, многие из которых основывались на двух основных условиях: 1) использование немых терминалов с 80 столбцами и 2) тот факт, что с тех пор как Prime не сделал ' у меня нет визуального редактора, он написал свой собственный. Из-за волшебной переносимости кода Pick он перевел свой редактор в Revelation и с его помощью создал весь проект на ПК.

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

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

О да. Когда вы комментировали каждую строку кода, это было с комментариями в конце строки . Короче говоря, первые 64 символа каждой строки были для кода, затем была точка с запятой, а затем у вас было 15 символов, чтобы описать то, что сделали ваши 64 символа. Короче говоря, мы использовали соглашение на ассемблере для форматирования нашего кода Pick / Basic. Это привело к вещам, которые выглядели так:

EVENT.LIST[DATE.INDEX][-1] = _         ;ADD THE MOST RECENT EVENT
   EVENTS[LEN(EVENTS)]                 ;TO THE END OF EVENT LIST

(На самом деле, спустя 20 лет я окончательно забыл синтаксис продолжения строки в R / Basic, поэтому он мог выглядеть иначе. Но вы поняли идею.)

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

************************************************************************
**  IN CASE YOU NEVER HEARD OF ONE, OR COULDN'T GUESS FROM ITS NAME,  **
**  THIS IS A FLOWER BOX.                                             **
************************************************************************

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

Заставить его смягчиться и позволить мне использовать встроенный редактор Revelation, было настоящей битвой. Сначала он был настойчив, просто потому что это были правила. Когда я возразил, что а) я уже знал редактор Revelation, б) он был значительно более функциональным, чем его редактор, в) другие разработчики Revelation имели бы такую ​​же точку зрения, он ответил, что если бы я не тренировался над его редактором, я бы не стал когда-нибудь сможет работать с базой кодов Prime, что, как мы оба знали, не произойдет, пока ад останется незамерзшим. Наконец он сдался.

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

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

Роберт Россни
источник
14
+1 за форматирование комментария при печати
BradC 21.10.09
1
Цветочная коробка НИКОГДА не должна использоваться чрезмерно. Я ненавижу, когда читаю код, хорошо, хороший комментарий, а затем вижу цветочную коробку с криком "ЭТО ДЕЛАЕТ ЭТО И ЭТО И ЭТО"
TheLQ
26

На моей первой работе все программы на Си, независимо от того, простые они или сложные, имели только четыре функции. У вас была основная функция, которая вызывала остальные три функции по очереди. Я не могу вспомнить их имена, но они были чем-то вроде begin (), middle () и end (). begin () открывал файлы и соединения с базой данных, end () закрывал их, а middle () делал все остальное . Само собой разумеется, что middle () была очень длинной функцией.

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

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

abeger
источник
2
Я предполагаю, что на бумаге в конференц-зале это звучало хорошо, но мне жаль программиста, который должен был следовать за ним
TheLQ
Должно быть, был разработан учителем английского языка.
йод
Должно быть разработано программистом COBOL.
Бруно
Должно быть, много использовали goto.
new123456
26

Написанный извне стандарт C-кодирования с правилом «не полагайтесь на встроенный приоритет оператора, всегда используйте скобки»

Справедливости ради, очевидным намерением было запретить:

a = 3 + 6 * 2;

в пользу:

a = 3 + (6 * 2);

Дело в том, что это было обеспечено инструментом, который следовал правилам синтаксиса C, которые '=', '==', '.' и доступ к массиву являются операторами. Так что код вроде:

a[i].x += b[i].y + d - 7;

должен был быть написан как:

((a[i]).x) += (((b[i]).y + d) - 7);
сору
источник
2
возможно (((a) [(i)]). x) + = (((((b) [(i)]). y) + (d)) - (7)); ?
Behrooz