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

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

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

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

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

Ответ 1

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

Ответ 2

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

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

и

    if(something)
        {
// do A
        }
    else
        {
// do B
    }

Ответ 3

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

Ответ 4

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

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

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

Я когда-то работал под тиранией Mighty VB King.

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

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

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

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

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

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

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

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

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

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

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

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

Все, кроме C/С++ массивов, Утилиты VB DOM и XSL-T как язык OOP были реализованы, несмотря на наши протесты. Конечно, за это время некоторые были обнаружены, ahem, сломаны и вообще оставлены.

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

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

Ответ 8

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

Ответ 9

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

if ( x == y ) 
    {
    System.out.println("this is painful");
    x = 0;
    y++;
    }

Ответ 10

Запретный:

while (true) {

Разрешено:

for (;;) {

Ответ 11

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

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

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

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

CodeMonkey добился успеха в изменении стандартов - в конце концов!

Ответ 12

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

Ответ 13

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

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

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

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

-- does work
select * from [0examples];

Ответ 14

Мы делали проект на С++, а команда возглавляла парня Паскаля.

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

#define BEGIN {
#define END }

но подождите там больше!

#define ENDIF }
#define CASE switch

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

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

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

MyClass *class_pt  // pt = pointer to type

UINT32 maxHops_u   // u = uint32

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

Ответ 15

На прежнем задании:

  • "Нормальные" таблицы начинаются с T _
  • "Системные" таблицы (обычно поисковые запросы) начинаются с TS_ (за исключением случаев, когда они не потому, что кому-то в этот день не было похоже)
  • Таблицы перекрестных ссылок начинаются с TSX _
  • Все имена полей начинаются с F_

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

Ответ 16

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

Ответ 17

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

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

Ответ 18

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

Ответ 19

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

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

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

Ответ 20

Использование имен имен нумерованных имен

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

Правило 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

EDIT: Кажется, что этот шаблон кода становится все более популярным. Смотрите The Daily WTF, чтобы узнать больше: Astigmatism:)

Ответ 21

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

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

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

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

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

Ответ 22

Венгерская нотация вообще.

Ответ 23

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

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

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

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

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

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

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 code, и мне нужно было сделать пакет для взаимодействия с группой W orkstation. После сеанса мозгового штурма с парнем рабочей станции мы решили назвать наши пакеты, чтобы кто-то, нуждающийся в обоих, должен был написать:

with CANT_Interface_Package;
with WONT_Interface_Package;

Ответ 24

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

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

Ответ 25

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

select id, name from people

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

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

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

Ответ 26

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

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

Ответ 27

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

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

Ответ 28

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

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

Во всяком случае, он установил ряд стандартов кодирования для своего программного обеспечения Prime, многие из которых были получены из двух основных условий: 1) использование 80-столбных немых терминалов и 2) тот факт, что поскольку У Прайма не было визуального редактора, он написал свой собственный. Из-за волшебной переносимости кода Pick он привел свой редактор в 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, было довольно битвой. Сначала он был настойчив, просто потому, что это были правила. Когда я возразил, что а) я уже знал Редактора Откровения; б) он был значительно более функциональным, чем его редактор; в) другие разработчики Откровения имели бы такую ​​же перспективу, он ответил, что, если я не буду готовить его редактор, я бы не стал когда-либо быть в состоянии работать над Prime codebase, что, как мы знали, не произойдет, пока ад не разморозится. Наконец он сдался.

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

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

Ответ 29

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

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

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

Ответ 30

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

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

a = 3 + 6 * 2;

в пользу:

a = 3 + (6 * 2);

Thing was, это было принудительно применено инструментом, который следовал синтаксическим правилам C, которые '=', '==', '.' и доступ к массиву - это операторы. Итак, код вроде:

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

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

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