Яке найдивніше стандартне правило кодування, яке ви змушені були дотримуватися? [зачинено]


173

Коли я задав це питання, я майже завжди отримував певне, так, ви повинні мати стандарти кодування.

Яке найдивніше стандартне правило кодування, якого ви коли-небудь змушували дотримуватися?

І, як не дивно, я маю на увазі найсмішніше, або найгірше, або просто дивне.

У кожній відповіді, будь ласка, вкажіть, якою мовою, якого розміру була ваша команда та які негативні наслідки це спричинило для вас та вашої команди.


19
Після прочитання цього списку раптом я відчуваю, що в мене була дуже щаслива кар'єра, щоб уникнути будь-якого з цих вимушених стандартних лайнів!
мат б

Наступного разу, коли я співбесіду для роботи, я перегляну це питання, щоб послужити "Червоним прапором. Бігайте!" показник. Справді кодування стандартних анти-шаблонів.
Стю Томпсон

5
І мені соромно визнати, що дуже рано в кар’єрі я наклав одну з відповідей команді. Мені так шкода, хлопці.
JasonFruit

Відповіді:


434

Я ненавиджу це, коли використання декількох повернень заборонено.


26
У чому полягає передбачуваний пункт цього правила? Особисто я не зможу перевірити код на код, який можна було б простіше прочитати, ввівши ще одне повернення.
Марк Бейкер

22
З іншого боку, усунення параметра на початку, наприклад "if (param == null) return null", може очистити ваш код зовсім небагато, заборонити це замість заохочення - дещо злочинно.
Білл К

39
Вирішення питання: якщо (! Ініціалізувати ()) {RetVal = ERR_BADINIT; goto ReturnPoint; } (ще багато коду) ReturnPoint: повернення RetVal; } Проблема вирішена! ;)
Марк Берньє

9
До недавнього часу багаторазове повернення було заборонено. Тоді було виявлено факт, що це залишилось від C, зробивши застарілим C ++ RAII та функціями розміром менше 15 рядків. З тих пір, як Braveheart: "СВОБОДА !!!!" ... :-p ...
paercebal

122
Ваш вибір: кілька повернень або більше вкладених, якщо заяви. Я візьму кілька повернень.
Ленс Фішер

333

зворотний відступ. Наприклад:

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

і:

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

152
Боже мій ... Чи можу я зустріти соціопата, який придумав це? Він міг навчити мене річ-дві про мізантропію.
Джон Руді

23
Це не може бути правдою.
Дейн

191
Щоразу, коли ви перевертаєте відступ, Бог вбиває розробника технічного обслуговування.
Кріс Вест

14
OMG, ти жартуєш?
Андреа Амбу

21
економить дорогоцінні байти ... безцінно, використовуйте його багато
Spikolynn

326

Можливо, не самий чужий, який ви отримаєте, але я дуже ненавиджу, коли мені доводиться передріч імен таблиць бази даних з 'tbl'


5
Це не просто угорська позначення для БД?
АРКБАН

19
Хіба це не як префіксація змінних за допомогою var?
Брайан Р. Бонді

26
У подібному ключі я ненавиджу, коли стовпці ідентифікаторів у базах даних мають префікс із назвою таблиці, як, наприклад, у таблиці продуктів буде стовпчик продукти. Надмірність, яка іноді робить сценарій без ОРМ більше головним болем, ніж потрібно
Ендрю Інграм

30
Я дійсно вважаю за краще, щоб стовпець ідентифікатора був префіксованим назвою таблиці. Полегшує написання запитів. А для зовнішніх ключів ви можете мати поле зовнішнього ключа таким же, як і ключове поле.
Крейг

38
На подібній ноті я ненавиджу це, коли назви таблиць мають бути єдиними. Мій інстинкт - назвати таблицю, яка містить, скажімо, клієнтів, "Клієнти", а не "Замовник". Звучить незначно, доки ви не зрозумієте всю проблему, яку б ви врятували, якби тільки ви могли назвати свою таблицю "Операції" замість "[Угода]".
Атаріо

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.

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


71
Дивіться цю публікацію Joel on Software про те, як правильне використання угорської нотації може допомогти зменшити помилки: joelonsoftware.com/articles/Wrong.html
flicken

9
Звичайно, використовуючи C ++ замість C, ви можете написати код, щоб компілятор дав вам помилку при порівнянні яблук з грушами.
Андреас Магнуссон

5
Так, Джоел зрозумів це правильно. Я хотів би, щоб компілятори могли зробити так, щоб застосувати версію версії Joel.
Лорен Печтел

9
Хіба це не повинно бути "int cntApples = 0; int cntPeas = 0;"? Тобто Префікс - це змінна "вид".
Blorgbeard вийшов

42
Принаймні перший з них правильний ... все, що в ньому є "Apple", має бути встановлено з "i". ;)
Йоганнес Чарра

240

Жоден потрійний оператор заборонений, де я зараз працюю:

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

... тому що не всі "отримують це". Якщо ви сказали мені: "Не використовуйте це, тому що нам довелося їх переписати, коли структури надто ускладнюються" (вкладені потрійні оператори, хтось?), То я б зрозумів. Але коли ти мені кажеш, що деякі розробники їх не розуміють ... гм ... Звичайно.


235
Кожен, ваш начальник означає себе.
Брайан Р. Бонді

13
Я раніше потрапляв у цей табір ... Але виріс із цього, і навчився любити умовного оператора (коли це доречно).
Джон Руді

22
У будь-якому випадку, правило повинно бути "завжди використовуйте потрійного оператора", оператора чистої краси :)
Боббі Джек

16
Мені це подобається, але причина, яку я найчастіше не використовую, така ж, як і ваш досвід "люди не розуміють цього". Мій аргумент полягає в тому, що вони не повинні працювати, якщо вони не можуть зрозуміти поняття ...
Aidos,

7
Як інакше ви б умовно ініціалізували постійну змінну, не записуючи абсолютно нової функції (що не дасть великої користі для читабельності). Використання const для локальних "змінних" робить набагато кориснішим для розуміння та дотримання коду, ніж заборона термінального оператора.
Андреас Магнуссон

239

НІКОЛИ не видаляйте код під час внесення змін. Нам сказали прокоментувати всі зміни. Майте на увазі, що ми використовуємо управління джерелами. Ця політика тривала недовго, оскільки розробники хвилювалися з цього приводу і як це зробить код нечитабельним.


3
Я дуже ненавиджу, що ... є кілька людей, які роблять це тут (це не стандарт або що-небудь все-таки)
озноб42

7
Такі правила, тому я відчуваю необхідність друкувати вихідний код, який я успадковую від інших кольором. Сторінка, що перебуває в грошах, це не дуже приємно для моєї компанії - але це єдиний спосіб, коли я можу її прочитати, якщо мені доведеться її надрукувати. (Ми успадкували багато, що дотримувались цього правила ...)
Джон Руді

3
Звучить як правило, розроблене до управління джерелом. Або через програмістів, що перевіряються лише раз на тиждень.
Крейг

6
Я люблю читати ці відповіді, тому що це робить мою роботу на 100 разів кращою.
rjh

2
Відчуваю, що ви ... ми на SVN протягом 4+ років, але старший розробник це ненавидить і перевіряє приблизно один раз на два місяці, витрачаючи наступні три дні на скарги на зламаний код: /
Віктор Свуб

204

Я коли - то працював під тиранією Могутньої Б. Кінг .

VB King був чистий майстром MS Excel і VBA, а також баз даних ( звідси його прізвища: Він грав з Excel в той час як розробники працювали з укладачами, і кинути йому виклик на базах даних може мати згубні наслідки для вашої кар'єри ... ).

Звичайно, його величезні навички дали йому унікальне бачення проблем розвитку та рішень для управління проектами: Хоча не точно кодування стандартів у найсуворішому сенсі, VB King регулярно мав нові ідеї про "стандарти кодування" та "найкращі практики", які він намагався (і часто вдалося) нав’язати нам. Наприклад:

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

  • Усі функції повинні повертати код помилки: У VB6 винятків немає, так навіщо вони взагалі потрібні? ( тобто в C ++ )

  • Оскільки "Усі функції повертають код помилки" не є практичним для функцій, що повертають значущі типи, усі функції повинні мати код помилки як перший параметр [в / вихід].

  • Весь наш код перевірятиме коди помилок ( це призвело до найгіршого випадку VBScript, якщо я колись бачив у своїй кар’єрі ... Звичайно, оскільки "інші" пропозиції ніколи не оброблялися, помилка насправді не була знайдена до занадто пізнього часу ).

  • Оскільки ми працюємо з C ++ / COM, починаючи з цього дня, ми будемо кодувати всі наші утилітні функції DOM у Visual Basic.

  • Помилки ASP 115 - це зло. З цієї причини ми будемо використовувати On Error Resume Next у нашому коді VBScript / ASP, щоб уникнути їх.

  • XSL-T - об'єктно-орієнтована мова. Використовуйте спадщину для вирішення своїх проблем ( німий сюрприз ледь не зламав мені щелепу цього дня ).

  • Винятки не використовуються, і тому їх слід усунути. З цієї причини ми знімемо прапорець із проханням викликати деструктор у разі вимкнення винятку ( знадобилось кілька днів, коли експерт знайшов причину всіх цих витоків пам'яті, і він ледь не завив, коли дізнався, що вони охоче ігнорували (і приховано) його технічну записку про повторну перевірку опції, надіслану жменями за кілька тижнів до цього ).

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

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

Всі, крім C / C ++ масивів , функцій утиліти VB DOM та XSL-T як мови OOP, були реалізовані, незважаючи на наші протести. Звичайно, з часом деякі були виявлені, гм , зламані та взагалі кинуті.

Звичайно, король В.Б. авторитет ніколи за це не страждав: серед вищого керівництва він залишався "найкращим технічним експертом" ...

Це призвело до забавних побічних ефектів, як ви бачите, перейшовши за посиланням. Який найкращий коментар у вихідному коді, з яким ви коли-небудь стикалися?


28
Re: 1-індексація. Іноді просто потрібно встати і сказати щось сильне на кшталт "це дурно і неправильно". Намалюйте лінію на піску. Забудьте про розміщення его та просто скажіть це. Я майже можу гарантувати, що кожен інший гідний програміст негайно почне кивати і приєднуватися до нього.
Кірк Штраузер

31
@jrista: Якщо ви НЕ коментуєте написання мого тексту, будь ласка, ігноруйте таке ... ... ... ... ... ... ... ... Якщо ви коментуєте мій текст, будь ласка розглянути (1) запропонувати виправлення, (2) виправити написання самостійно, або (3) Вважати, що не кожен розробник у світі (далеко від нього) є носієм англійської мови, тому, мабуть, допускати неправильне написання - це мінімум, який ви можете зробити, або доведіть, що ви можете зробити краще, надіславши мені правильний переклад В
ФРАНЦІ

4
Якби цей хлопець був моїм начальником, я б пішов прямо до кожного вищого керівництва з добре складеним і задокументованим переліком скарг і звільнив його. -1 за те, що ти не мав кульок, щоб відстояти себе.
muusbolla

34
@muusbolla: Хто сказав вам, що ми не скаржилися? Він продовжувався, поки делегація з двох осіб (включаючи мене) пішла прямо до генерального директора, щоб пояснити проблему. Але мені шкода, що вам потрібно сказати, що існує різниця між ідеалістичним світом, де панує справедливість, і реальним світом, де деякі начальники вважають, що "управління ніколи не помиляється, навіть коли воно є", і розгромить кого-небудь, що наважиться суперечити цій догмі. Єдиний щасливий сувенір, який я маю з того часу, - це день, коли я подав у відставку, майже три роки тому, і я щасливіша людина з того дня. У будь-якому випадку, якщо це правда, то ваша причина - кульгава. Вибачте.
paercebal

7
@paercebal: En générale, c'est correctement écrit, sauf que quelques petits erreurs: «squatch»: ça doit être «сквош»; «Цей один день»: en ce context-là, dirait «того дня»; «Запасаються процедури»: «фондові процедури»; «Забитий» s'écrit «задушений». Aussi, dans les commentaires, vous utilisez ° згадується », ce qui doit être« згадується »Mais vraiment, tout ça ne justifie pas une telle plainte. Au contraire, vous y montrez une excellente maîtrise de l'anglais; фелісіації!
інтуїтивно

131

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


17
Розкіш: у нас було всього 6 символів; пакунок мав назви, починаючи з g; внутрішні функції все почали gk; з'явилися драйвери робочої станції з кодами, такими як 0p (тому gk0p був початком), залишивши нам два символи для решти імені Fortran. gk0paa, gk0pab, ...
Джонатан Леффлер

103
"Коли я був у твоєму віці, у нас було лише 2 персонажі! І це було нечутливим до регістру!"
pookleblinky

53
Ми звикли вставати о 2-й ранку, за 3 години до сну, потім писали власні компілятори і платили компанії за привілей на роботу. Нам дозволили лише букву А для наших змінних імен. Тоді наш начальник видалить наш код і танцює під нашими списками, співаючи алілую.
Девід Арно

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" від Petzold - фігура! ;)
Боббі Джек

7
Я вважаю це найрозумнішим стилем брекетів. На жаль, більшість людей цим не користуються. Якщо дужки мають смислове значення, до них слід ставитися так, а не застрявати в кінці рядка та ігнорувати.
Райан Лунді

7
@Kyralessa. Я не згоден ... Я не знаю, чи мають брекети семантичне значення, але вони, безумовно, можуть впливати на відповідність шаблону та відчуття простору. IMO, ця версія втрачає це повністю. наприклад, я хочу, щоб моя закладка вискакувала за межі книги, а не заливалася сторінками.
Майкл Пасха

6
Це насправді мій вподобаний стиль, але все у світі (особливо Visual Studio) за замовчуванням на інші режими, тому я відмовився. Чому мені це подобається? Дужки є "частиною" коду, що міститься, - вони змушують його "схожий" на одне висловлювання до if, на що він очікує.
Атаріо

104

Заборонено:

while (true) {

Дозволено:

for (;;) {

4
Інші стверджували, що for (;;) {це ідіома С для перших.
Роберт П

69
Якщо я правильно розумію сучасні новомодні посмішки, цей стандарт змушує бідних, перевантажених заявою плакати!
Бен Бланк

15
Тут діє фактичне правило. VC6 видає попередження компілятора про while (true), але не about for (;;). Інакше вони рівноцінні. Тож ми вибираємо без попередження.
user9876

22
У своїй книзі Б'ярне С. сказав: «бо (;;) слід читати як назавжди». Якщо це достатньо добре для творця C ++, він повинен бути досить хорошим для вас. :-)
Френк Крюгер

58
У першій програмі C, над якою я працював, хтось додав #define ever (;;), щоб ви могли сказати "назавжди {...}"
Джеймс Курран

101

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

стандарти кодування забороняють використовувати вкладені оператори IF

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

Звичайно, ця помилка компілятора була виправлена ​​принаймні десятиліття, але ніхто не оскаржував стандарти . [бааа!]

CodeMonkey досяг успіху в зміні стандартів - врешті-решт!


7
Стівен, це нагадує мені історію експерименту з мавпами: o) freekvermeulen.blogspot.com/2008/08/…
Nick Dandoulakis

5
@ [Нік Д]: так, і я - звідси кодове ім'я "CodeMonkey" ;-)
Стівен А. Лоу


Причина може бути помилковою, але все ж добре уникати вкладених ifs - c2.com/cgi/wiki?ArrowAntiPattern
manojlds

97

Колись працював над проектом, де підкреслення було заборонено. І я маю на увазі повністю заборонений. Тож у додатку ac # winforms кожного разу, коли ми додавали новий обробник подій (наприклад, для кнопки), нам доведеться перейменовувати назву методу за замовчуванням з buttonName_Click () на щось інше, просто для задоволення егої хлопця, який написав кодування стандарти. До сьогодні я не знаю, що він мав проти скромного підкреслення


23
Можливо, _ був зламаний на його клавіатурі;)
Роман Плашил

139
buttonNameUnderscoreClick ()
vitule

9
Має прикрий побічний ефект від запобігання використанню FILE та LINE для налагодження. І #if __cplusplus extern "C" у заголовкових файлах. І цілісні типи в stdint.h. І size_t.
Стів Джессоп

8
Добре, що це був C # тоді
конфігуратор

4
Я серйозно перешкоджаю підкресленню (хоча це не в переліченому вище випадку ОП. Це додаткові два натискання клавіш (shift + _), які я вважаю за краще не
наділяти

92

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

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

Це ускладнює пошук таблиці, якщо ви знаєте лише першу букву її імені. Крім того - оскільки це база даних mssql - ми повинні скрізь оточувати назви таблиць квадратними дужками.

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

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

65
Вибачте, так страшенно шкода ...
Кірк Штраузер

1
Вау - хороший. Я думаю, що про використання Letters було не до речі? Не те, що і це гарна ідея, але принаймні вам не потрібно цитувати всі назви таблиць.
Марк Бріттінгем

розум боліючи ... хто придумав це? дба?
dotjoe

90

Ми робили проект C ++, а керівником команди був хлопець Паскаля.

Таким чином, у нас був стандарт кодування, включаючи файл, щоб переосмислити весь той прискіпливий синтаксис C і C ++:

#define BEGIN {
#define END }

але зачекайте, що є більше!

#define ENDIF }
#define CASE switch

і т. д. Важко запам'ятати після цього часу.

Це взяло те, що було б ідеально читабельним кодом C ++ і зробило його нерозбірливим для всіх, окрім команди керівника.

Ми також повинні були використовувати зворотні угорські позначення, тобто

MyClass *class_pt  // pt = pointer to type

UINT32 maxHops_u   // u = uint32

хоча як не дивно, я подорожував таким.


22
Побудова незбагненного коду на майбутнє
rshimoda

2
Угорська нотація зроблена правильно - це нормально. Зробив неправильно ... ick. Правильна система типу обіграє і те, і інше.
Телема

5
Знаєте, я думаю, що я з вами з цього приводу. Угорські бородавки майже не такі заперечні, коли їх вирішують так само.
ТЕД

Ха-ха повертає мене до тих часів, коли я перейшов з Паскаля на С ++ (близько 16 років тому). Кожного разу, коли я бачив {мені доводилося подумки говорити собі "{означає ПОЧАТИ". Принаймні для мене це було просто в голові.
thomasrutter

6
Коли я працював у службі підтримки MS VC ++, у нас було декілька клієнтів, які подають код запиту, написаний так. Ми зайняли деякий час, щоб ми зрозуміли, що це насправді в C ++ (вони не включали #defines).
JBRWilkinson

88

На колишній роботі:

  • "Нормальні" таблиці починаються з T_
  • "Системні" таблиці (як правило, запити) починаються з TS_ (за винятком випадків, коли їх немає, тому що хтось цього дня не відчував)
  • Перехресні таблиці посилань починаються з TSX_
  • Усі назви полів починаються з F_

Так, правильно. Усі поля у кожній таблиці. Так що ми можемо сказати, що це поле.


а у вас не було спеціального префіксу для полів первинного ключа ???
Czimi

2
@Czimi: Я забув це згадати. Кожна таблиця має поле під назвою FI_ID, яке використовується в якості основного ключа.
Джеромі Ірвін

31
Святий ш ... Тигуй, який винайшов цей кошмар, повинен бути вбитий F_gun і відправлений до TSX_hell.
Сергій Скобліков

3
Для всіх полів і таблиць ми мали tbl та fld. Цілком марно ...
конфігуратор

5
@configurator: У вас був "tbl" для всіх полів і "fld" для всіх таблиць? :-)))
Тімві

84

Мій приятель зіткнувся з цим правилом, працюючи на державній роботі. Використання ++ (до або після публікації) було повністю заборонено. Причина: різні компілятори можуть інтерпретувати це по-різному.


5
Ну, в цей момент ви могли б так само відмовитися, правда?
Кірк Штраузер

90
Якогось покусав, не розуміючи різниці між постфіксом і префіксом, заявив про помилку компілятора, а потім наніс це іншим людям, я думаю.
Бернард

5
Насправді вони мали рацію за деяких обставин. Банінг здається трохи над вершиною, хоча. Візьмемо для прикладу рядок: a [i] = i ++; я можу збільшуватися до того, як він буде використаний для індексації a або після. Мова цього не визначає.
ТЕД

9
Він правий - порядок операцій не гарантується, коли ви використовуєте ту саму змінну в іншому місці виписки. Просто забороніть потенційно неоднозначний код, але не всі його використання!
Лорен Печтел

2
Можливо, також заборона, =оскільки це може бути використано для сприйняття невизначеної поведінки.
конфігуратор

81

Половина команди виступає за відступ у чотири пробіли; інша половина виступає за двоступеневий відступ.

Як ви здогадуєтесь, стандарт кодування зобов’язаний три, щоб "образити всіх однаково" (пряма цитата).


42
Ось чому ідентифікація вкладок така велика. Кожен може змінити розмір у своєму редакторі;)
xardias

41
Так, відступ на вкладці чудовий ... поки ви фактично не відкриєте чужий файл, і не знайдете речі, нерівні, тому що пробіли змішалися там, де вони не мали, або не змішалися там, де вони мали б. Тоді ви автоматично переформатуєтесь, а керування версіями стане некрасивим. Тьфу.
Алан Гензель

41
тому ви повинні використовувати лише вкладки для відступу, і лише пробіли для вирівнювання, і ніколи не буде зустрічатися. і якщо ви збираєтеся внести зміни в пробіл у файлі, то це має бути єдиною зміною, яку ви внесете для конкретної реєстрації.
joh6nn

16
... і це ніколи не працює. : P
Роберт П

10
«Ображати всіх однаково» ... я люблю це. Мені доведеться запам'ятати це наступного разу, коли мене якось запросять у війну за стандартизацію відступу.
Майкл Берр

74

Не в змозі використовувати Reflection, оскільки менеджер стверджував, що це занадто багато "магії".


10
Так, магію важко підтримувати, приємно;) LOL, хоча.
Рік

19
Це, мабуть, правильне правило, з неправильних причин :)
Боббі Джек

71
для "магії" читати виставу, вбиваючи незбагненний незрозумілий код кошмару. Він правий.
gbjbaanb

4
Напевно, вам взагалі не дозволили ввести код .Net. Зрештою, багато того, як виконується рамка, відбувається через рефлексію.
NotMe

5
Геть тих чарівників !! Завжди з їхньою магією крадуть роботу, спокушають наших жінок і розбещують наших дітей!
ZJR

71

Самий дивний, який у мене був, і той, який зайняв у мене досить багато часу, щоб повалити, був той, коли власник нашої компанії вимагав, щоб наш новий товар був лише IE. Якщо це могло працювати на FireFox, це було нормально, але це повинен бути лише IE.

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

Це, мабуть, не шокує вас про те, що наша компанія збанкрутувала.


1
Я б сказав, це досить дивно.
Бред Гілберт

14
Три ура за капіталізм!
starblue

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

EDIT: Схоже, що цей шаблон коду стає все більш популярним. Дивіться це щоденне повідомлення WTF, щоб дізнатися більше: Астигматизм :)


10
Без жартів. Б'юсь об заклад, що потрібно було назавжди пройти та видалити всі ці ін'єкції SQL. ;-)
Кірк Штраузер

Це чисте зло. Я впевнений, що ваш начальник / TL є оверлодом, який просто чекає своєї можливості.
Мануель Феррерія

5
omg, хто б, чорт, придумав такі правила ??? найголовніше: як чорт вашої команди вдається кодувати ??
hasen

2
Я думаю, що він мав на увазі, що ти вибраш усі поля за замовчуванням, тому ти також отримаєш усі "резервні" поля, не потребуючи їх усіх.
Містер Шикаданс

2
maibe, ви можете використати попередню обробку коду, де ви будете писати свій код за допомогою значущих імен змінних, а потім замінювати його на "правильні", перш ніж збирати щось на зразок '% s / email /serve_field_12 / g';)
Жоао Портела,

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.
supercat

45

Угорська нотація взагалі.


11
Ну, мені подобається H / N для контролю на сторінці. Набагато простіше знайти всі елементи текстового поля у спадному меню IntelliSense, коли все, що мені потрібно шукати, - це txtFooBar.
cciotti

20
Угорська нотація не є злою, її потрібно правильно використовувати joelonsoftware.com/articles/Wrong.html
Czimi

1
Я поступлюсь щодо контролю. Тоді угорські позначення можуть бути корисними. Взагалі, я вважаю, що угорська нотація застаріла і в основному не використовується. Він відплив від свого первісного наміру.
vfilby

9
Жахливо зловживають, так. Неправильно, ні.
Лорен Печтел

2
Багато людей починають ім'я інтерфейсу з I, IEnumerable, IList ... У рамках .Net al інтерфейси починаються з I.
tuinstoel

43

У мене було багато дурних правил, але не так багато, що я вважав прямо-таки дивними.

Дурніше було на роботі в NASA, над якою я працював ще на початку 90-х. Це була величезна робота, на якій було понад 100 розробників. Досвідчені розробники, які написали стандарти кодування, вирішили, що кожен вихідний файл повинен починатися з чотирьох літерних абревіатур, і перший лист повинен був відповідати групі, яка відповідала за файл. Це, мабуть, було чудовою ідеєю для старих проектів FORTRAN 77, до яких вони звикли.

Однак це був проект Ada , з приємною ієрархальною структурою бібліотеки, тому це взагалі не мало сенсу. У кожному каталозі було повно файлів, що починалися з тієї самої літери, а потім ще 3 дурниці, підкреслення, а потім частина найменування файлу, яка мала значення. Усі пакети Ada повинні були починатися з тієї самої п’яти символьної бородавки. Пункти Ada "використовувати" також не були дозволені (можливо, це добре за звичайних обставин), тому це означало, що будь-яка посилання на будь-який ідентифікатор, який не був локальним для цього вихідного файлу, також повинен був включати цю марну бородавку. Ймовірно, мав би бути заколот через це, але весь проект був укомплектований молодшими програмістами та новим найманим коледжем (я сам останній).

Типовий заява про призначення (вже дієслівна в 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. Після сеансу мозкового штурму з хлопцем Workstation ми вирішили назвати наші пакунки, щоб хтось, хто потребує обох, мав написати:

with CANT_Interface_Package;
with WONT_Interface_Package;

1
При всьому тому і NASA досі не могла розібратися, чи слід обчислити в кілометрах чи милях ...
NotMe

16
Чорт, і я дійсно думав, що ти збираєшся все вийти і використовувати CUN * _ і W * NK_ конвенцію про іменування. Вибачте, у мене є повільні, вибухонебезпечні, текстові тексти. Але ваші були набагато, набагато веселіші!
дефмета

41

Коли я почав працювати в одному місці і почав вводити свій код в управління джерелами, мій начальник раптом підійшов до мене і попросив мене припинити так сильно вчиняти. Він сказав мені, що це не рекомендує робити більше 1 комісії на день для розробника, оскільки це засмічує джерело управління. Я просто поглянув на нього ...

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


Виділіть електронну пошту, натисніть "Видалити, готово"
TheLQ

Я, безумовно, не шанувальник так званих "примхливих реєстрацій". Здійсніть зобов’язання, коли зміна буде завершена, просто так. Я також хотів би взяти на себе зобов’язання наприкінці робочого дня, оскільки це накладає на думку, що мій код повинен бути складеним і бути принаймні виконаним з рештою проекту для інших кодерів наступного ранку.
Jesse C. Slicer

2
Отримайте найкраще з обох світів - прихильніться до свого місцевого відділення, коли ви не хочете щось втратити. Розмістіть і розкажіть ці коміти, коли ви готові вкласти їх у майстер. (пробачте термінологію git - я впевнений, що це можливо і в рядовій, і в багатьох інших системах)
Майкл Андерсон,

Я згоден з усім вищесказаним. Це вкорінена проблема підходу до управління версіями. Він не має технологічного рішення. Я розглядав можливість переходу до git-svn, який би дозволив мені працювати з локальним сховищем і потім пересилати речі до сховища SVN, але це тільки що надішле повідомлення для всіх днів мого дня однією величезною партією, і вирішив би нічого для моїх начальників.
Avihu Turzion

34

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

select id, name from people

Аргументами на користь процедур були:

  • Продуктивність
  • Безпека
  • Технічне обслуговування

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


2
Ремонтопридатність можна покращити, якщо назви таблиці та стовпців не є унікальними, але імена SP є. Це може полегшити пошук посилань на код. Якщо є інші, кращі переваги ремонту, я їх не знаю. Безпека - головна причина використання ІП.
Джеффрі Л Уітлідж

2
Я погоджуюся, що для загальних цілей це не 100% wtf, але дивіться це посилання: codinghorror.com/blog/archives/000292.html
azkotoki

2
"Безпека є основною причиною використання SP-файлів". Ні. Ніщо про SP-адреси в SQL Server не є більш безпечним. Вони захищені лише тоді, коли викликаються як параметеризовані запити, які можна виконати так само добре, як і при динамічному SQL.
Флорі

4
Нее: відростки корисні. Хоча це може бути болем часом, ви в кінцевому підсумку пишете кращий, більш багаторазовий інтерфейс бази даних. У ваших dba також може бути простіший аналіз проблем з продуктивністю, і вони можуть оновити виробничу систему без зміни коду програми. Я не прихильник бізнес-логіки в проростках.
Роберт Полсон,

4
закопувати запити у скомпільованому коді - це така біль, я на 100% відстаю від політики на 100% відростків для самої абстракції
annakata

33

На 1000 рядків коду повинно бути 165 одиничних тестів (не обов'язково автоматизованих). Це працює на одному тесті приблизно на кожні 8 рядків.

Потрібно сказати, що деякі рядки коду досить довгі, і функції повертають ці вказівники, щоб дозволити ланцюжок.


Як одиничне випробування не автоматизоване.
pupeno

Як вони придумали магічне число 8?
Рохіт

1
Що станеться, якщо у вас 164? 166?
Даніель Даранас

8
Більше, як 6 рядків.
рекурсивний

1
Думаю, це залежить від того, наскільки дрібнозернисті ваші тести теж є. Я вважаю function(x).should == 2це єдиним тестом, тоді як інші об'єднають 10 з них разом і називають це єдиним тестом.
Оріон Едвардс

30

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

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


3
Зрозуміло, адже коментарі - це просто захаращення ... і подумайте, скільки циклів економить попередній процесор за час компіляції! (Додаток навіть смішніший, ніж правило. Хороший.)
ojrac

7
Звичайно! Розробники повинні писати код, не витрачаючи часу на написання коментарів :)
Даніель Риковський

2
Так! І коментарі роблять збірку повільнішою!
Грег Д

2
Тим не менш, я вважаю, що правильне сортування членів за типом (поля, властивості, методи) та за назвою
abatishchev

3
Я сортую методи, учасників тощо за алфавітом у відповідних групах, як у заголовку, так і в джерелі ... але тільки тому, що я нав’язливий.
Джон Перді

29

У 1987 році або близько того я влаштувався на роботу в компанію, яка найняла мене, тому що я була однією з невеликих пригорщів людей, які вміли користуватися Об'явленням. Одкровення, якщо ви ніколи про нього не чули, по суті було ПК-реалізацією операційної системи Pick - яка, якщо ви ніколи про неї не чули, отримала свою назву від свого винахідника, казково названого Діка Піка. Багато що можна сказати про ОС Pick, більшість із них хороша. Кілька постачальників суперміні (як мінімум, Prime та MIPS) використовували Pick або власні власні реалізації цього.

Ця компанія була компанією Prime, і для своїх внутрішніх систем вони використовували Інформацію. (Ні, це справді було його ім'ям. Це було втілення прем'єром Піка.) У них був укладений договір з державою про створення системи на базі ПК, і вони вклали близько року у свій проект Одкровення, перш ніж хлопець виконав усі роботи, який також був їх директором MIS, вирішив, що більше не може робити обох робіт, і найняв мене.

У будь-якому випадку, він встановив ряд стандартів кодування для їх програмного забезпечення на базі Prime, багато з яких випливали з двох основних умов: 1) використання німих терміналів у 80 стовпцях та 2) того, що з часу Prime не зробив ' не маю візуального редактора, він написав своє. Через магічну портативність коду 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.                                             **
************************************************************************

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

Змусити його розслабитися і дозволити мені використовувати вбудований редактор Одкровення був доволі боєм. Спочатку він був наполегливим, просто тому, що це були правила. Коли я заперечив, що а) я вже знав редактора Одкровення; б) він був значно більш функціональним, ніж його редактор; в) інші розробники Об'явлення мали б таку саму перспективу, він відповів, що якби я не тренувався на його редакторі, я не став би коли-небудь вдасться працювати над базовою кодовою базою, що, як ми обоє знали, не відбудеться до тих пір, поки пекло ще не застигне. Нарешті він поступився.

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

Одного разу, кілька місяців роботи, коли я досить добре зарекомендував себе більш ніж компетентним (особливо порівняно з чудовим парадом інших кодерів, які пройшли через цей офіс, поки я працював там), він дивився через моє плече, як я працював, і він помітив, що я не використовую коментарі до квіткової коробки. О, я сказав, я написав формат-код вихідного коду, який перетворює мої коментарі у ваш стиль, коли я друкую їх. Це простіше, ніж підтримувати їх у редакторі. Він відкрив рот, на мить подумав, закрив його, пішов, і ми ніколи більше не говорили про стандарти кодування. Після цього обидві наші роботи стали легшими.


14
+1 для форматера коментарів під час друку
BradC

1
Квіткову коробку НІКОЛИ не варто використовувати. Я ненавиджу це, коли я читаю код, добре приємний коментар, тоді бачу квіткову скриньку, яка кричить "ЦЕ РОБИТИ ЦЕ ТА ЦЕ ТА ЦЕ"
TheLQ

26

На моїй першій роботі всі програми на С, незалежно від того, наскільки прості вони чи складні, мали лише чотири функції. У вас була головна, яка по черзі викликала інші три функції. Я не можу пригадати їх імена, але вони були чимось уздовж рядків початку (), середини () та кінця (). start () відкрив файли та підключення до бази даних, end () закрив їх, а середина () зробила все інше . Потрібно сказати, що середній () був дуже довгою функцією.

А щоб зробити речі ще кращими, всі змінні повинні були бути глобальними.

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


2
Я думаю, що на папері в залі засідань це звучало добре, але я шкодую програміста, який повинен був слідувати за ним
TheLQ

Повинен бути розроблений вчителем англійської мови.
yodie

Повинно бути розроблений програмістом COBOL.
бруно

Повинні використати багато goto's.
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)); ?
Бехроз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.