Чи варто заохочувати стилі кодування на користь автономії розробника чи відмовляти їм на користь послідовності?


15

Розробник записує if/elseблоки з однорядковими кодовими заявами на зразок:

if (condition)
   // Do this one-line code
else
   // Do this one-line code

Інший використовує фігурні брекети для всіх:

if (condition) 
{
   // Do this one-line code
}
else
{
   // Do this one-line code
}

Розробник спочатку створює об'єкт, а потім використовує його:

HelperClass helper = new HelperClass();
helper.DoSomething();

Інший розробник інстанціює та використовує об'єкт в одному рядку:

new HelperClass().DoSomething();

Розробнику простіше з масивами та forциклами:

string[] ordinals = new string[] {'First', 'Second', 'Third'};
for (i = 0; i < ordinals.Length; i++)
{
    // Do something
}

Ще пише:

List<string> ordinals = new List<string>() {'First', 'Second', 'Third'};
foreach (string ordinal in ordinals)
{
    // Do something
}

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


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

Послідовний стиль полегшує читання коду, тому використовуйте послідовний стиль. У ваших прикладах найпростіше читати це 2, 1, 2. Хоча останній випадок відрізняється. У критичних робочих програмах цикл for for швидше під час ітерації над списками. Продуктивність однакова ітерація над масивами. І в усіх випадках використовуйте varзамість повноцінного імені типу.
Стівен

Відповіді:


19

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

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

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

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

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

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

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

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

Примітка. Ідея "стандартів кодування" не характерна лише для програмування. "Стандарти кодування" застосовуються у багатьох сферах, іноді в межах організації, частіше у всій галузі чи професії. Деякі приклади:

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


1
Якщо ви додасте використання інструментів для підв’язки до своєї публікації, я видаляю моє та додаю +1 вашому :)
Demian Brecht

@DemianBrecht, хороша пропозиція, дякую. Додано інструменти для ворсу для покращення моєї відповіді, але я думаю, ви також повинні залишити свої.
Калеб

Ну добре тоді. +1 у будь-якому випадку :)
Дем'ян Брехт

А також вам!
Калеб

+1 для "... негайного переїзду ...", як на мій досвід, така поведінка узгоджується з соціопатом та / або нарцисистськими тенденціями, несумісними з командами з розробки програмного забезпечення.
mattnz

16

Стиль не має значення.

Там я це сказав.

Через 30 років і сотні клієнтських сайтів та код (приблизно) 500 (і більше) членів команди за ці роки я виявив, що стиль просто не має значення.

Почніть спочатку працювати.

Отримайте його для використання оптимального обсягу ресурсів (тобто правильної структури даних, правильного алгоритму).

Суєта над "стилем" після того, як все інше вирішено. Суєта "стилю" лише з інструментами, ніколи вручну.


2
Амінь! Стандарти кодування повинні бути виправдані з точки зору реальних переваг та послідовності - це не реальна користь, а розкіш.
JohnFx

12
Але стиль рідко стосується стилю. Йдеться про уникнення поширених помилок.
Мартін Йорк

6
Але це допомагає уникати '=' замість '==' (не використовуйте призначення в умові). Це допомагає уникнути, if (t) { x;y;}а не if (t) x;y;(завжди використовувати "{}" після if). Віддайте перевагу правильному коду const (дуже важко додати правильність const у код після його написання. Використовуйте std :: cout / std :: cin not fprintf / scanf, коли вони швидше можуть спричинити помилки. Використовуйте вектор, а не масиви. (щоб запобігти переповненню)
Мартін Йорк

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

1
А як щодо примусового використання засобів автоматичного форматування? Eclipse та XCode дуже легко зберігають формат коду - але один з інженерів, з якими я працюю, вкрай засмучується, якщо хтось автоформатує "свій" (тобто код компанії) код, щоб він відповідав решті бази даних. Форматування - лише невелика частина стилю, але також є важливою, особливо для таких питань, як якщо / ще вкладені та загальний потік коду (не кажучи вже про читабельність).
пухнастий

4

Існують стилі кодування і є кодуючі запахи. Я не один раз знайшов:

    if(debugCondition)
//         printf("DEBUG: state:%s at debugCondition\n",dbg_state());

    for(i=0; i<MAX;i++)
    {
       //some essential business logic
    }

Мій попередній роботодавець жорстко забороняв використовувати багаторядкові if()без дужок. Вважається несправністю типу "зроби це знову і тебе звільняють". Дозволені конструкції були

     if(condition) break; 
     if(condition) continue; 
     if(condition) return; 
     if(condition) for()...; 

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

Є речі, які ти завжди повинен завжди робити. Як switch():

     case 1:
         something();
     break;
     case 2:
         something();
     return;
     case 3:
         something();
     continue;
     case 4:
     case 5:
         something();
     break;
     case 6:
         something();
     //fallthrough;
     case 7:
     ...

Тим часом, набираючи:

     case 1:
         something();
     case 2:
         something();
     break;

не закриваючи caseз //fallthroughвважається помилкою.

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


3

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

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

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

Чи можете ви накреслити відносно просту схему вашої загальної системи системи? Дизайн, що описує елементи / сутності, залучені до нового розробника команди. Якщо ви не можете, або це сильно задіяно, дизайн не вистачає.


3

ІМХО, це залежить ...

Ваші перші два приклади - це не лише питання особистого смаку.

if (condition)
   // Do this one-line code
else
   // Do this one-line code

(без дужок) = більше схильних до помилок, якщо пізніше буде додано більше коду:

if (condition)
   // Do this one-line code
else
   // Do this one-line code
   // ...and this line as well... oops! this will actually execute either way

І це менш зручно для налагодження:

new HelperClass().DoSomething(GetSomeData()); // etc.

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

Що стосується вашого третього прикладу (для vs foreach), я вважаю це як питання смаку.


2

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


2

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


2

Використовуйте стандартний інструмент для обшивки (мабуть, FxCop для C #). Хоча це не кінець всього, все, послідовність є важливим у великих проектах , які мають цілий ряд людей , які працюють на них.

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

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


1

Застосовувати єдиний стиль кодування завжди важко. В ідеалі таке мирське завдання слід залишити на інструменті для обробки. Я аплодую мовній спільноті Go за це.


1

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


1

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

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


1

Я думаю, що це зводиться до розміру проекту та того, скільки людей працює над ним. Кваліфікований програміст може переглядати обидва стилі різних форматів і знати, що відбувається в обох, але потрібно дотримуватися сталість, щоб око це легко зрозуміло. Якщо ви збираєтеся робити один рядок ifstatments з фігурними дужками, то цей проект не повинен використовувати їх. Хто коли-небудь веде цей проект, повинен мати такий вибір. Мені подобається, що речі виглядають чітко, а також дуже компактно, оскільки я можу їх отримати. Якщо ви збираєтеся зробити єдиний рядок, якщо statmeents, вони краще виглядатимуть так

if() {}
else() {}

Або навіть:

if() {} else () {}

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

Object.method();
Object.method2();

Тоді ви вдруге зателефонували методу конструктора об'єкта двічі, коли його можна було б уникнути, інстанціюючи об'єкт повністю.

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


1

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

Після роботи з кодом інших членів команди, іноді протягом декількох місяців, вона по суті починає працювати в рядку git blame. Після того, як я був у моїй компанії 10+ років, я, напевно, можу сказати вам з 80% + точністю, хто написав будь-який клас у будь-якому місці в нашому 500k рядках коду, просто подивившись на нього.

У той час, коли є невеликий шматочок "часу в рампі", коли ви починаєте дивитися на код, який використовує стиль, з яким ви не погоджуєтесь, те, що ви насправді робите в цей час, говорить "о, це схоже на код Джона Доу (тому що він використовує стиль X, але не стиль Y тощо) ". І це приносить із собою цілу купу контексту. До першого наближення ви знаєте, чого очікувати від коду Джона - які ще частини кодової бази він добре розуміє, а які - ні, чи є гуру SQL чи початківцем графічного інтерфейсу тощо.

Запуск коду кожного за допомогою форматера по суті викреслює цю інформацію, ховаючи її за a git blame , яку ви, можливо, не заважаєте запускати.


0

Це дійсно багато залежить від типу організації.

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

Універсальні стандарти, як правило, найкращі для того, щоб зробити всіх гравцями B +. Ваші супергерої зберуться за це. Але якщо ви хочете, щоб один гравець з A півтора десятків B та півдесят гравців C мали середній показник до B +, то ви хочете відповідати стандартам. У цьому випадку ви хочете, щоб усі робили те саме, щоби той, хто грав A, міг пройти код всіх якомога швидше.

Багато хто з вас так: "Але зачекайте, чому б не покінчити з гравцями B і C?"

Реальність така: Супергероїв не так багато. Хоча можна знайти їх і виховувати в Google, введення нової системи виставлення рахунків для Ma Bell може бути більш економічно вигідною для останньої команди. (І якщо у вас дійсно є супергерої, 4 або 5 з них будуть вдвічі дорожчі, ніж десяток юніорів)

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