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


77

Вам коли-небудь доводилося працювати над стандартами кодування, які:

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

Якщо так, то яке найменше улюблене правило і чому?


Деякі приклади тут


4
Я раніше задавав подібне запитання (але не зовсім те саме) щодо SO раніше: stackoverflow.com/questions/218123/…
Брайан Р. Бонді

@Brian, дякую, я бачив ваше запитання, але забув про нього.
finnw

4
Справжня проблема зі стандартами кодування - це витрачені час та зусилля, сперечаючись, чи вони правильні чи ні. Ніщо не перемагає добру кучеряву війну за створення міжусобних міжусобиць ...
MZB

Відповіді:


97

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

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

2) Вони часто просто повторюють інформацію, яка вже міститься в інструменті управління джерелами, лише менш точною. Наприклад: Остання зміна, перелік дати / причини зміни.


12
Я вважаю (принаймні зараз, раніше в школі, що здавалося дивним), що коментування взагалі є поганою практикою
Shady M. Najib

14
Мало того, але я виявив, що накладні витрати, пов’язані зі створенням нового файлу класів, коли вам доведеться навантажувати панель котлів на самому верху, насправді відвертають розробників від створення нових класів і заохочують величезні неграйні класи та, отже, поганий дизайн.
Газ

13
Не згоден! Ми не додаємо марну інформацію про надлишкову руду та реальне текстове пояснення того, що робить функція (у файлі .h), і це так корисно! Звичайно, ми прагнемо підтримувати його синхронізовано з кодом.
Майстер

5
@Shady M Najib погано завжди або погано, коли йому дозволяють безконтрольно / без утримання? Як правило, хороший код зробить своє призначення достатньо очевидним, щоб уникнути потреби в коментарях, але це не завжди так, і я вважаю, що в цих сценаріях коментування є вирішальним. Я не можу придумати одну погану причину, щоб включити коментарі XMLDoc.
Натан Тейлор

7
Блок, що пояснює, що це робить, добре. Блок просто повторно повторює типи та назви аргументів та повертає значення - це погано. Коли мені довелося працювати зі стандартним наказом останнього, я написав сценарій emacs, щоб автоматично генерувати більшість.
AShelly

130

Якби професор одного разу вимагав, щоб у нас був принаймні один коментар до кожного рядка коду.

//Set x to 3
var x = 3;

//if x is greater than 2
if(x>2){

    //Print x
    Print(x);
}

Це було досить смішно.


10
Це не просто так, що професор знає, що ви точно знаєте, що відбувається?
Джон Макінтайр

80
Я думаю, що зрозуміло, що відбувається, і це не освіта.
Dan Ray

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

4
Так, за винятком того, що ви завжди можете писати коментарі, які просто повторюють код і не виявляють ніякого розуміння. Чи правильно він робить вас "// Закінчення дужки" перед фінальною дужкою?
альтернатива

6
Що робити, якщо ви випадково отримали корисний коментар у своєму коді? Чи потрібно ставити // commentна лінію до цього?
конфігуратор

103

Наш стандарт кодування (C #) вимагає широкого використання #REGION (для тих, хто не знає, він позначає блоки вихідного коду, які будуть згортатись до однієї лінії у Visual Studio). Як наслідок, ви завжди відкривали те, що, здавалося, добре структурований клас, лише знаходили палі та купи сміття, прокинуті під глибоко вкладеними килимами конструкцій #REGION. У вас навіть є регіони навколо окремих рядків, наприклад, потрібно скласти складку області LOG, щоб знайти одну єдину заяву Logger. Звичайно, безліч методів, доданих після створення деяких регіонів, також були розміщені в "неправильному" регіоні. Жах. Жах.

Регіони - одна з найгірших функцій, що коли-небудь додаються до Visual Studio; це заохочує структурувати поверхню, а не фактичну структуру ОО.

У наш час я вбиваю #REGION на виду.


11
Я намагався проголосувати за це десяток разів ...
TGnat

22
Якщо ви думаєте, що вам потрібен #REGION, я думаю, що вам потрібно зробити рефактор.
Джей Базузі

23
Я зазвичай організовую код по регіонах у конструктори, властивості, події, методи та члени. Це дозволяє керувати джерелом та керувати ним джерелом (особливо в деяких статичних класах корисності, які можуть зростати досить великими). Я б більше не користувався ними.
Еван Плейс

26
У нас простий стандарт кодування: ніколи не гніздяться регіони. Просто використовуйте їх для групування пов'язаних методів (ініціалізація, серіалізація, властивості тощо)
Джейсон Вільямс,

6
Єдина хороша мета #regions - приховати код, який не потрібно редагувати . Це може бути згенерований код або код із важкодоступним алгоритмом, до якого ви хочете, щоб люди не торкалися, або, можливо, некрасиві блоки налагодження коду. Але не код, над яким люди працюватимуть. Для тих, хто застряг у магазині #region, у мене є макрос, який згортається до визначень, але розширює регіони. Дивіться тут: stackoverflow.com/questions/523220/awesome-visual-studio-macros / ...
Kyralessa

80

В одній роботі ми змушені були використовувати якусь дивну форму угорської нотації в базі даних.

Я не можу згадати деталі, але з пам’яті кожне ім’я поля повинно містити:

  • Без голосних
  • Усі великі літери
  • Посилання на таблицю
  • Індикатор типу даних
  • Довжина даних
  • Нульовий показник

Наприклад, стовпець, що містить ім’я людини, може називатися: PRSNFRSTNMVC30X(таблиця особи, стовпець імені, 30 символів Varchar, не нуль)


14
Вибачте, але що відбувається, коли ви перефактуруєте базу даних або коли вирішите, що довжина VARCHAR повинна бути різною. Раптом вам доведеться пройти весь свій код і змінити ... о боже. Це виглядає жахливо.
Том Морріс

71
Без голосних ??! Ти жартуєш, правда?
Даніель Кассіді

39
Чи люди, які застосовували цей стандарт, мали на лобах і часто обговорювали честь і битву?
Райан Робертс

10
Ха-ха, ну вони були DBA, так що ...;)
Дамовіса

14
Ви повинні були надіслати назви своїх стовпців через URL-адресу для скорочення. PersonFirstNameVarchar30NotNull = bit.ly/cULlQc
Біллі Кувер

48

Наполягаючи, що за всіма дужками слід коментувати, чим закінчується дужка:

наприклад:

for (int i = 0; i < 10; i++)
{
    if (foo > bar)
    {
        printf("Foo greater than bar");
    } // End If (foo > bar)

    while (baz)
    {
       farb();
    } // End while (baz)
} // End For

21
Більш сумнівно: якщо вам потрібен коментар, щоб сказати, що було запуском блоку, то блок занадто довгий, або його вміст занадто складний => рефактор.
Річард

5
Я хочу проголосувати за те, що довгі, глибоко вкладені блоки важко розібратися, і ці коментарі можуть допомогти. Я хочу проголосувати, тому що ці коментарі незабаром стануть помилковими (і дуже заплутаними), а тому, що довгі, глибоко вкладені блоки - це знак, який потрібно переробляти, а не додавати більше коментарів.
Джей Базузі

7
це було чудовою ідеєю для світу без потужного IDE.
IAdapter

9
@Дже в будь-якому пристойному IDE ви можете виділити одну дужку, і вона виділить іншу відповідну дужку. Я особисто ненавиджу, коли люди роблять це.
Еван Плейс

3
Хоча ваш приклад трохи з божевільної сторони (оскільки вони недостатньо довгі, щоб це мало значення і сповільнили б вас при зміні логіки), це не завжди погано. Такі коментарі дійсно корисні для закриття просторів імен / ендіф-оголошень, що охоплюють весь файл.
jsternberg

38
#define AND  &&
#define OR   ||
#define EQ   ==

'Нафф сказав.


9
Чи не буде #include <iso646.h> набагато кращим вибором?
AndrejaKo

3
@AndrejaKo: це раніше <iso646.h>; це була спроба зробити C схожим на FORTRAN.
Niall C.

2
Це був насправді стандарт кодування? тобто чи існувала політика компанії щодо запису операторів безпосередньо?
finnw

21
Чи це теж було #define BEGIN {і #DEFINE END }?
JBRWilkinson

3
Це нагадує мені статтю Daily WTF, яку я бачив, що якийсь програміст на C ++ мав тону визначень, щоб він був схожий на Visual Basic (або, можливо, просто Basic, якийсь діалект). #define void Sub, #define} Кінець, такі речі.
Уейн Моліна

37
  • Імена локальних змінних - це малі регістри без підкреслень

Реальні приклади: paymentmethodtotalshtml, contracttypechangecontexts, customsegmentspectexts,potentialmsceventref

The New York Times важить :

«Пробіли у словах не слід сприймати як належне. Давньогрецька мова, перша абетка з голосними голосами, може розшифруватися без пробілів слів, якби ви озвучили це, і обійшлося без них. […] Латина теж перестала відокремлювати слова до другого століття. Втрата викликає спантеличення, адже око мусить працювати набагато важче, щоб прочитати нерозділений текст. Але, як пояснив палеограф Пол Саенгер, стародавній світ не бажав "зробити читання легшим і швидшим".

3
+1. Незначні роздратування складаються. Крім того, з ними важко сперечатися, оскільки редактор стандартів кодування або прем'єр-міністр можуть сказати: "Це не велике навантаження, тому його не варто міняти".
finnw

1
Саме так. (Хоча в цьому випадку читання незмінних найменувань змінних схоже на це, справді, adduptoquitea greatburden.)
Джон Сіракуза

57
Забавляйте себе, вигадуючи імена, ніж розбираєте двома способами. Сторінки, penisup тощо
Джей Базузі

4
@Jay * sexchange
конфігуратор

2
@configurator: Коли команда налагоджувача Visual Studio працювала над функцією, яка дозволила вам побачити виняток, що перебуває в польоті, у вікні годинника, вони збиралися додати псевдо-змінну під назвою "$ ex". Ми давно не помічали. Тоді ми перейменовані на "$ виключення", але я все ще читав це як "s".
Джей Базузі

36

Мене попросили лідера програмного забезпечення компанії , щоб зробити « простий, ре н dundant код ». Наприклад, було заборонено додавати новий параметр до існуючої функції. Натомість вам довелося дублювати функцію, залишаючи оригінал недоторканим, щоб уникнути регресій. Ніякого офіційного тестування курсу (марна трата часу).

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

Найщасливішим днем ​​у моєму житті був той момент, коли його звільнили (вважайте, що в Італії когось дуже, дуже важко стріляти).


він ніколи не чув слова "рефакторинг"
нанда

3
Він ніколи не чув також багато інших слів ...
Wizard79

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

36

Вся взаємодія з базою даних повинна здійснюватися через збережені процедури . Це може мати сенс, якщо ми живемо в 1997 році, а не в 2010 році.

Я щойно зрозумів, що це фактично охоплює всі критерії початкового питання:

  • Значно знизили свою продуктивність? ПЕРЕВІРИТЕ. Будь ласка - просто використовуйте ORM .
  • Спочатку вони були включені з поважних причин, але їх зберігали довго після того, як первісне занепокоєння стало неактуальним? ПЕРЕВІРИТЕ. Менеджер був розробником для сервера баз даних 1000 років тому і застосував цей стандарт кодування.
  • Були в списку так довго, що неможливо було їх усіх запам'ятати? ПЕРЕВІРИТЕ. Це включало "якомога більше логіки має зберігатися в базі даних".
  • Змусили вас думати, що автор просто намагався залишити свій слід, а не заохочувати добру практику кодування? ПЕРЕВІРИТЕ. Тримається повернення до менеджера як колишнього розробника сервера баз даних.
  • Ви не мали уявлення, чому їх включили? ПЕРЕВІРИТЕ.

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

3
зачекайте .. з усією серйозністю, я думав, що SP-СЕ БЕЗ кращою, ефективнішою, ніж прямі дзвінки SQL від, скажімо, C #?
Sk93

3
Здається, ви точно знаєте, чому їх включили. : P
Мейсон Уілер

4
Коли я виріс, я нарешті зрозумів, чому все повинно пройти через БД :) Всерйоз, це спрощує так багато речей, не намагайтеся заново вигадувати колесо.
Черга Jé

3
Я чув чудове міркування: "Ми не можемо використовувати АБО / М, тому що для всієї взаємодії необхідно використовувати SP". Така трата людської сили.
конфігуратор

33

Не дозволяється використовувати STL або інші стандартні бібліотеки C ++, оскільки CTO вважає, що "ми" можемо зробити це краще і швидше. Навіть основні конструкції, такі як списки та клас рядків.


5
Єдиний раз, коли я чув, коли хтось не використовував STL, тому що він не був досить швидким, і, маючи рацію, був для ігор. EA зробили власну реалізацію STL для своїх ігор. Я дуже сумніваюся, що це вже важливо (сучасні ігри обмежені в GPU), і я сумніваюся, що вони його використовують. Але навіть все-таки це була реалізація STL, а не зовсім нової бібліотеки. Ви все ще використовували STL під час використання EASTL.
Метт Оленік

1
@Matt: щоб додати, скарга на EA була зосереджена на використанні та ініціалізації пам'яті. Їх власна реалізація витрачала менше пам’яті, звільняла її раніше і уникала ініціалізації об'єктів, які будуть ініціалізовані пізніше.
Матьє М.

Я б сказав йому, щоб він кодував це сам
праворуч

31

Угорська нотація

Зразок, витягнутий з " експлікації Чарльза Симоні угорського ідентифікатора нотації іменування конвенції " на MSDN.

1 #включіть "sy.h"
2 extern int * rgwDic;
3 extern int bsyMac;
4 структура SY * PsySz (char sz [])
6 {
7 char * pch;
8 int cch;
9 структура SY * psy, * PsyCreate ();
10 int * pbsy;
11 int cwSz;
12 без підпису wHash = 0;
13 pch = sz;
14 while (* pch! = 0
15 wHash = (wHash11 + * pch ++;
16 cch = pch-sz;
17 pbsy = & rgbsyHash [(wHash & 077777)% cwHash];
18 для (; * pbsy! = 0; pbsy = & psy-> bsyNext)
19 {
20 char * szSy;
21 szSy = (psy = (struct SY *) & rgwDic [* pbsy]) -> sz;
22 pch = sz;
23 час (* pch == * szSy ++)
24 {
25, якщо (* pch ++ == 0)
26 повернення (пси);
27}
28}
29 cwSz = 0;
30, якщо (cch> = 2)
31 cwSz = (cch-2 / sizeof (int) +1;
32 * pbsy = (int *) (psy = PsyCreate (cwSY + cwSz)) - rgwDic;
33 Нульова ((int *) пси, cwSY);
34 bltbyte (sz, psy-> sz, cch + 1);
35 повернення (пси);
36}

5
Ow Ow Ow Ow Ow!
Доктор Джонс

22
Найбільша проблема цього зразка - безглузді імена змінних. Викресліть угорські префікси, а деякі з них мають довжину 1 або навіть 0 символів.
finnw

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

5
О, будь ласка. Я ніколи ніколи НЕ плутати місцевий з членом, і я не використовую цю дурну угорськи для членів / місцевих жителів / полів / незалежно. Я думаю, що вони можуть бути корисними для розмежування різного роду рядків, таких як "безпечний" та "небезпечний", як, наприклад, приклад Джоела в Making Wrong Code Look Wrong
конфігуратор

3
@configurator: Приклад Джоеля - жахливий, йому краще мати різні типи, тоді компілятор буде застосовувати використання.
Матьє М.

28

Я колись працював над проектом, в якому керівництво проекту вимагало, щоб кожна змінна - КОЖНА змінна - мала префікс "v". Отже, vCount, vFirstName, vIsWarranty тощо.

Чому? "Тому що ми працюємо в VBScript і все одно є варіантом".

WTF.


93
Я колись працював мовою, яка вимагала, щоб кожна змінна - КОЖНА змінна - мала префікс "$".
nohat

6
@nohat: І ти зрозумів, що це дивно, чи не так?
Джош К

Я колись працював мовою, де всі мої змінні починалися з пунктуації, як '$' або '%' або '@'. Я все ще роблю, час від часу.
Девід Торнлі

3
Це дійсно стає проблемою лише тоді, коли вам потрібно поставити fфункції раніше, тоді ваш код справді є fUcked (vUp).
Джо D

1
Схоже на різні версії Perl ...

26

Майже забув це:

Цитата керівника:

Не виправляйте та не документуйте жодних помилок, виявлених у власному коді. Клієнт заплатить нам для їх виявлення та виправлення протягом наступних кількох років.

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


2
Це жахлива політика. Я сподіваюся, що цей менеджер був консервованим.
Бернард

@ Bernard-У більшості організацій, що створюють довгостроковий потік доходів, є підставою для швидкого просування. Сподіваємось, хтось ще побачив у цьому божевілля і випадково перебіг його / її на парковці.
Джим Раш

24

Розширені коментарі XML щодо всіх неприватних методів, констант, перерахунків та властивостей.

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

/// <summary>
/// Validations the handler.
/// </summary>
/// <param name="propertyName">The property name.</param>
public void ValidationHandler(string propertyName) 
{
   // whatever
}

[Редагувати] Причина, що я згадую це як смішний стандарт, полягає не в тому, що я вважаю, що коментарі методів є дурними, а тому, що якість цих коментарів жодним чином не виконувалася, і це призвело до того, що у файлах коду було створено багато і безлад. . Існують кращі способи створення значущих кодових документів, ніж сліпі "повинні мати коментар" для побудови.


13
' Validations the handler' - о-о
Ерік

8
+1 Фу, я ненавиджу це. Я думаю, якщо ви використовуєте програмне забезпечення для створення коментарів, то вони вам не потрібні.
bleevo

9
Я не вважаю це поганим правилом. Під час читання методу, який я маю дотримуватися вперше, він дуже допомагає, якщо у мене є специфікації для всіх аргументів. Існують звичайні тонкощі (наприклад, що відбувається, якщо аргумент є нульовим, що робити, якщо це порожня колекція, ім'я неіснуючого файлу тощо). Ще одним хорошим правилом (IMHO) є назви методів, які повинні бути дієсловами, але у вашому прикладі це іменник.
finnw

3
@finnw Я думаю, що це хороша практика, але поганий стандарт. Якщо розробники перебувають на борту і пишуть змістовні коментарі методів, коли вони мають гарантію (деталі винятків тощо), це чудово. Якщо ні, то закінчується великий безлад. І в першому випадку вам взагалі не потрібне виконання на рівні компіляції.
Адам Лір

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

23

Насправді не стандарт кодування, але у нас був файл у керуванні джерелом під назвою "changelog.txt"

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

Коли запустився новий КТО, і хтось сказав йому це, він негайно прийняв виконавче рішення і сказав: "Ми більше не будемо цього робити" і видалив файл. Це тривало роками.


6
І про це ніхто не знав svn log?
Htbaa

1
Ті, хто розпочав політику, давно пішли, а ті, хто слідував, продовжували її тривати. Я почав протягом того ж тижня, що і новий CTO (мій друг), і ми обидва подивилися на це і сказали WTF?
Джим А

20

Деякі місця, з якими я працював, наполягали на тому, щоб коментувати невикористаний або застарілий код, а не видаляти його. Замість того, щоб довіряти VCS історії та ін., Він болісно підтримувався у файлах через коментований код.

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


3
Нещодавно я видаляв багато старого коментованого коду.
CoderDennis

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

Я цілком погоджуюся. Коментувати код, поки ви працюєте з ним нормально, але все, що переходить у версію релізу / головну гілку, має бути недійсним коментованого коду. Хтось сказав мені, що їм "подобалося знати, як це можна зробити інакше". Мені просто здається, що це дратує з вказаних причин: Це застарілий спосіб вирішення іншого способу зробити це? WTF
Anne Schuessler

З VS2013 "Peeks" це все у вікно. Але ми поміщаємо коментар, який говорить "Змінене рівняння - ініціали" або щось подібне, тому хтось цікавиться, як виглядатиме старий код у TFS / VCS, якщо це потрібно. Отже, це один рядок, а не 10 коментованих рядків. Але VS2013 приголомшливий, він показує історію TFS саме там.
Suamere

17

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


16

Примушування вбудованих коментарів для контролю версій стосувалося найбільш безглуздого стандарту кодування, який я ігнорував.

//Changed on 2/2/2004 By Ryan Roberts for work item #2323332
Dim Some Horrendous VB
//End Changed

OBA Dracle, який наполягав на правильному використанні пробілів, «підтримуючи» базу даних з дуже суперечливою таблицею, яка мала понад 200 полів і 40 тригерів.


Це досить
грізно

5
Ммм. Дім Сум ...
конфігуратор

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

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

У нашій команді є хлопець, який все ще робить це скрізь (він також включає величезні речі "Журналу змін" у наших сценаріях SQL, які також перебувають під контролем версій). Як мені було пояснено, аргумент полягає в тому, що після декількох змін / доручень ви не пам'ятаєте дату, коли щось було змінено, тому журнал змін добре відразу помітити, хто що змінив і чому, коли ви відкриваєте файл.
Уейн Моліна

14

Я робив огляд коду на проект, керований першим таймером C ++, який вирішив, що всі функції класу повинні бути встановлені з назвою класу та видимістю:

class MyClass
{
   public:
      void MyClass_Public_setValue(int value);
}

1
Ви запитували їх, чому ? Я просто хотів би дізнатися їх мотивацію ..
JBRWilkinson

1
Нічого собі, чому той хлопець навіть використовує заняття ?
Mateen Ulhaq

9

Потрібно відступити весь код на чотири пробіли;)


2
Як це було погано?
Джей Базузі

1
Тому що тоді в кожному рядку є 4 непотрібні пробіли на початку?
nohat

О, я зрозумів це зараз.
альтернатива

21
Так, StackOverflow має дуже поганий стандарт кодування. :-)
П Швед

Великі відступи змушують вас тримати низький рівень вкладення коду. Я бачив відступи 8, і це справно працювало.
Toon Krijthe

9

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


Це жахливий, жахливий стандарт кодування, якого потрібно дотримуватися. І дурна причина для цього теж!
габлін

4
Якщо вам потрібно прокручувати горизонтально (наприклад, більше половини сторінки), можливо, також щось не так. Жодне відступ не є гарним, оскільки робить код абсолютно нечитабельним. Я намагаюся дотримуватися обмеження в 78 колів, але якщо потрібно, щоб перевищити цю суму, я не проти, але я намагаюся цього уникати.
Htbaa

8

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

Підрядник, який працював у великому банку, наполягав на тому, що дотримання стандартів було найкращим. Заявка була написана в dBase / Clipper, для чого він був єдиним розробником, і, звичайно, він придумав стандарт.

  • Все в верхньому регістрі. Я маю на увазі все, включаючи рідкісні коментарі, які він зробив.
  • Відступів немає.
  • Змінне іменування було чимось уздовж APRGNAME. A = область змінної, наприклад, P для загальнодоступних, PRG = перші три символи вихідного файлу, який створив змінну, NAME = ім'я змінної в інших 6 символах, дозволених dBase / Clipper.
  • Перші 4 та останні 4 рядки вихідного коду були довжиною 80 *. Чому? Тож він міг почути точковий матричний принтер, починаючи та закінчуючи друк файлу. Пам'ять - вся програма була надрукована через мейнфрейм щотижня, 20000 сторінок.
  • Я впевнений, було ще багато, що мені вдалося скинути з мозку.

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

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


7
Не знущайтеся над старшими динозаврами, будь ласка. Вони зробили нас можливими.
П Швед

4
Схоже на безпеку роботи.
МВС

7
Маючи звуковий маркер, щоб ви знали, коли кожен файл друкується геніально. \07Зараз я додам до початку кожного файлу.
конфігуратор

2
Використання такої схеми іменування (не верхній регістр) мало певний сенс, оскільки правила змінної "масштабування" dBase не існували. Все було ефективно глобальним. iВикористовується для індексування масиву в одній процедурі може перешкодити з iв процедурі виклику. Вам потрібно скористатися PRIVATE ALL LIKE m*і PRIVATE iзапобігти цьому "затінення"
Геррі

8

Ще один вибух з мого минулого.

Цитата від власника компанії:

Код, написаний на інтерпретаційних мовах, не буде, оскільки я втратив 25 мільйонів на проекті {expletive}, написаному на Java.

Проект Java був системою торгівлі акціями, розробленою для обробки кількох десятків акцій, які зараз використовуються для обробки тисяч. Замість того, щоб вирішувати недоліки дизайну або неякісне обладнання, вся компанія була змушена перетворити всі додатки, які не стосуються C / C ++, на C / C ++, і вся нова розробка повинна була бути в C / C ++. Мови інтерпретації означали все, що не було складено, і власник вважав лише компільовані Assembler, C і C ++.

Для компанії на 800 осіб, у якій більша частина коду була на Яві та Perl, це означало, що ціла компанія витрачала більшу частину свого часу протягом наступних двох років, переписуючи ідеально чудовий код на C / C ++.

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

В обох випадках я пішов незабаром після того, як диктат зійшов.


Чи працює сьогодні будь-яка компанія?
finnw

Той, що «переїхав» з Java, другий уже давно минув. Вони ніколи не пережили перехід від TRS-80 до ПК.
Девід Б

6

Як і багато програмістів (але недостатньо), я ненавиджу прикрасу коду. Мене це розлючує, коли я маю використовувати префікс знака долара ($) для імен змінних або підкреслює приватні змінні, навіть не маючи геттерів / сеттерів. Якщо вам потрібно прикрасити код, щоб зрозуміти його, тоді вам потрібно вийти з пекла!


Ну, як говорить "Воля": "Я передчуваю підкреслення, щоб мої приватні змінні були згруповані в моєму інтеліссенсі. Однак я це роблю лише для змінних, що відносяться до типу. Змінні, оголошені в методі або вужчому обсязі, я залишаю підкреслення вимкнено. Легко тримати їх окремо і тримати менше використовуваних змінних разом. " і я повинен погодитися з ним.
7wp

1
Я не думаю, що об'єднання ваших змінних у ваш улюблений фірмовий IDE не є достатньою підставою для деградації всього вашого коду.
Адам Харте

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

1
+1 Використання хорошого IDE (такого, який може використовувати пошук по регулярному вибору ) має для мене більше сенсу. Скретч IDE, навчись користуватися текстовим редактором та терміналом, і ти будеш набагато кращим програмістом. Як бічну зауваження, я не особливо люблю perl sigils, але принаймні вони користуються на відміну від PHP.
альтернатива

6
Зітхніть ... ще один із тих, хто "IDE - це для кицьків".
Nailer

6

Я деякий час працював з веб-системою, де всі параметри, що були передані, мали бути названі P1, P2, P3 і т.д.

Також - хоча це не є строго стандартним кодуванням - в одній і тій же системі кожен окремий файл повинен був називатися xyz0001.ext, xyz0002.ext, xyz0003.ext тощо - де xyz був самим кодом програми.


6

Це було ДОЛГИ час тому - 1976 рік, якщо бути точним. Мій бос ніколи не чув про Едсгера Дайкстра чи читав випуск CACM, але він звідкись почув слух, що "GOTO - це погано", тому нам не дозволяли використовувати GOTO в наших програмах COBOL. Це було до того, як COBOL додав "кінець якщо", тому на той час у нього було лише дві з половиною з трьох класичних структур управління (послідовність, якщо / потім / інше, виконувати (тобто виконувати поки)). Він з недоліком дозволив GOTO в наших Основних програмах, а також вручних інструкцій у наших мовних програмах Assembler.

Вибачте, що це свого роду історія "ви повинні були там бути". Наскільки мені відомо, кожна мова, винайдена з 1976 року, має адекватні структури управління, так що вам ніколи не потрібно використовувати GOTO. Але справа в тому, що начальник ніколи не знав, ЧОМУ ГОТО вважається шкідливим, або яка мова була інфантильним розладом, а яка - смертельним захворюванням.


6

Я працював над проектом, був вимогою головного архітектора написати явний код. Одним з найгірших прикладів, які я знайшов у коді (і він із задоволенням схвалив), був такий.

private string DoSomething( bool verbose )
{
    if ( verbose ) { return someString; }
    else if ( !verbose ) { return otherString; }
    else { return string.Empty; }
}

Навіть ReSharper сказав вам, що це неправильно!


9
Вам буде важко натиснути, щоб повернути щось із функції, оголошеної недійсною.
Mircea Chirea

7
@MAttB Поміркуйте, за яких умов elseбуде прийнята фінальна ( ) гілка.
Річард

6
else {return string.Empty; } буде виконуватися, коли вищезазначені 2 рядки були відредаговані розробником служби технічного обслуговування через 5 років. Однак повернення string.Empty приховає той факт, який використовується як неможлива умова. Натомість він повинен кидати InvalidOperationException ("Цей код не призначений для підтримки логіки трьох значень");
MatthewMartin

1
Це жахливо. Що не так return verbose ? someString : someOtherString;?
Callum Rogers

1
@callum Ternary оператор може бути заборонений :) був там раніше ...
hplbsh

6

На моїй останній роботі «стандарти» були б дуже сильним терміном для того, що мені дав хлопець, який мене найняв. Програмуючи веб-сайти в ColdFusion і SQL, мені були задані вимоги кодування, такі як:

  • Не використовуйте включає. Мені подобається одна велика сторінка
  • Завжди відокремлюйте слова у назвах змінних та стовпців із підкресленнями (крім активної, імені тощо)
  • Ніколи не використовуйте скорочення - завжди виписуйте прізвище (він часто писав ім’я та ін.)
  • Не використовуйте заплутані імена (наприклад, кількість_зарядка та рахунок_зарахування, які вимірювали різні, але пов’язані з цим речі)
  • Не використовуйте DIV , а використовуйте мінімальний CSS - замість цього використовуйте вкладені таблиці (я знайшов кілька шести шарів глибоко).
  • Не кешуйте жодних запитів. Колись.
  • Збираєтесь використовувати змінну на більш ніж одній сторінці? Область застосування
  • Кожна сторінка є власним блоком спробу / лову. Нам не потрібен / хочемо обробник глобальних помилок.

Я почав змінювати їх, як тільки він кинув.


"Не використовуйте заплутані імена" мені здається досить справедливим ...
8128

1
Це абсолютно справедлива настанова. Моя думка полягала в тому, що він зовсім не дотримувався цього. Я здогадуюсь, його ідея "не плутати" і моя була різною.
Бен-Дум

4

У моєму житті як кодер C ++ були застосовані два справді противні "правила":

  1. "Ми не можемо використовувати STL, оскільки VC ++ 4.1 не підтримує його (і ми не можемо перейти на VC ++ 6.0 на даний момент)."
  2. «Не НЕ використовувати QuickSort, тому що це може бути O (N ^ 2) у важких випадках, використовувати цю реалізацію алгоритму пірамідальної сортування I (ім'я керівника проекту видалено) написала в якості студента.»

6
Що було не так з HeapSort керівника проекту?
7wp

4
Насправді, якщо зовнішній користувальницький вхід прийнятий кодом, QuickSort може помилятися, оскільки він відкривається для O(n^2)DOS-атак (подача в гіршому випадку). Крім того, чому не вдалося переключитися - саме це було поважним приводом не використовувати STL.
Maciej Piechotka

4

Я змушений мати документацію XML для всіх класів та членів класу. У тому числі приватні. Мене спонукає використовувати коментарі ghostdoc за замовчуванням.

public class User 
{
    /// <summary>
    /// the _userID
    /// </summary>
    private int _userID;
}


Так. Я також повинен коментувати приватних членів. Що має ще менше сенсу.
Карл Бергкіст

Заохочує використовувати ghostdoc ?! Гах
конфігуратор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.