Що має бути у стандарті кодування? [зачинено]


34

Що повинно бути в хорошому (читати: корисному) стандарті кодування?

  • Те, що повинен мати код.
  • Речі, кодом не повинно бути.
  • Чи повинен стандарт кодування включати визначення речей, які застосовує мова, компілятор або формат коду?
  • Що з такими показниками, як цикломатична складність, рядки на файл тощо?

Відповіді:


40

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


3
Абсолютно. Кожен елемент стандарту повинен мати чітке обґрунтування.
AShelly

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

9
@David: Це абсолютно законна причина наявності стандарту кодування. Якщо це причина, то його слід просто вказати як таке, тобто "Причина: для покращення узгодженості бази коду".
dimimcha

Насправді, найважливіше, що стосується стандарту кодування - це те, що він є . Те , що там, є насправді другорядним.
Йорг W Міттаг

20

Вкладки проти просторів! Я отримую божевільні оновлення, коли хтось із моїх колег випадково робить багато вкладок, щоб пробіли перемістилися у сховище


1
Я погоджуюся від усієї душі!
matiash

2
IMHO, це єдине , що заслуговує на те, щоб бути в кодуванні стандарту.
П Швед


2
IMHO, це прекрасний приклад того, що стандарт кодування не повинен охоплювати.
Bjarke Freund-Hansen

@bjarkef, ви віддаєте перевагу змішаному коду вкладок та пробілів?
Черга Jé

19

Названня конвенцій

EDIT: Під цим я маю на увазі називання Правил, а не називання Правил.

Наприклад, Посібник буде All boolean values should begin with Is/Can/Has/etc when possible. Правило було бAll boolean values must start with Is


3
LPSZ * lppsz_CPP_MrKim_ClassOfStudents [] [];
Mateen Ulhaq

3
-1: Саме така деталь низького рівня змушує розробників ігнорувати стандарти. Ви також можете мандати, щоб усі носили краватки.
TMN

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

1
@Rachel: Так, у нас був стандарт "всі булеві властивості повинні починатися зі" Is "". Намотують такі властивості, як IsCanUpdateі IsHasChildren. Звичайно, це неправильно, але це було постановлено в стандарті. І це моя думка: щойно ви починаєте конкретизувати ці речі, ви повинні переконатися, що ви охоплюєте всі основи, інакше люди натрапляють на те, що стандарт не покриває, або погано прикривають, і тоді вони або пишуть щось, що не так, або вони починають ігнорувати стандарт. Так чи інакше, команда програє.
TMN

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

10

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

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

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


Домовились. Інша частина, яку я додам, полягає в тому, що якщо ви залишаєте його живим як попередження, його слід вирішити, змінивши його або придушивши попередження. В іншому випадку попередження швидко стають марними (їх занадто багато у великому проекті), і ви можете їх також відключити. У VS я вважаю за краще бачити Попередження, які порушують складання і змушують вас мати справу з ними.
МВС

Це не те, що ви повинні помістити у свій makefile, а не в стандарт?
Bjarke Freund-Hansen

@bjarkef: Зрештою, параметри будуть входити в Makefile, так. Але сенс її введення в стандарт - це стандартизація того, що потрібно вирішувати. Наприклад, чи повинні розробники завжди створювати ідентифікатори серіалізації? Команда вирішить, чи потрібно це мати мандат чи ігнорувати.
Macneil

@bjarkef: Безумовно, але добре мати їх у стандартній довідці, коли ви починаєте новий проект і повинні написати новий makefile (або ваш новий проект використовує щось інше, ніж Make для свого інструменту збирання).
TMN

9

Мені подобаються деякі стандарти (я знаю, що їх дуже багато, але саме такі я віддаю перевагу):

  • 80% покриття одиничними тестами
  • Колективне право власності на код (написати код, який слід прочитати товаришам команди, а не компілятором)
  • Пишіть коментарі. Напишіть, що б ви сказали новоприбулому.
  • Не ускладнювати

Вимоги, що стосуються покриття тестових одиниць - одна з найкращих речей, яка може входити в стандарти кодування.
Адам Кросленд

Щодо покриття тесту: Чому лише 80%? Це знову ж приклад правила 80/20, де, за вашим досвідом, цього остаточного 20% зайняло б на 100% більше зусиль? Також, яке покриття? [наприклад, висвітлення заяви? Функціональне покриття? Покриття рішення? Умова покриття?]
Macneil

@Macneil: так щось подібне. Я виявив, що 80% - це "добре" для більшості класів і це хороша кількість. Я колись намагався досягти 95%, і це було справжньою тратою часу. Звичайно , якщо це легко досягти 100% для деяких класів, йти вперед

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

Я використовую TestDriven.net з вбудованим в нього nCover

7

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

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

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

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

  • Чи гарантує це правило допомогу , що код Правильно ?
  • Чи допомагає це правило забезпечити чіткість коду ?

Якщо жодне з них не відповідає дійсності, пункт є просто довільним і, ймовірно, непотрібним


Я б включив у стандарт, про який пишу:

Для ясності:

  • Організація файлів: Визначення фіксованого порядку для елементів у файлі дозволяє команді легко орієнтуватися по інших файлах. Вам не доведеться шукати #defines або визначення структур.

  • Конвенції про іменування: Послідовна читальність посібників для читання. Але уникайте занадто конкретизувати занадто багато правил, що шкодить для запису.

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

Для коректності:

  • Найкращі практики, характерні для вашого типу проблеми: Правила щодо розподілу пам'яті, одночасності чи переносимості.

  • "Коректність коректування", правильне використання staticта volatileін.

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


6

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

В іншому випадку ви отримуєте кодовані мавпи, які бояться йти за бананами .


4

Що має бути у стандарті кодування? Якнайменше. Менше швидше. І з виправданням, будь ласка.

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

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


3

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


3

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

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

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


Як перевіряється тип і розмір шрифту?
Черга Jé

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

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

2

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

  • Структура проекту Чи є тести частиною коду чи вони знаходяться в окремому проекті / пакеті / каталозі? Чи відповідає код інтерфейсу користувача із резервними матеріалами? Якщо ні, то як це розділяється?

  • Процес розвитку. Пишіть тести перед кодом? Чи виправлення зламаних складок має пріоритет над розвитком? Коли проводяться огляди коду, і що вони повинні охоплювати?

  • Управління вихідним кодом. Що потрапляє до реєстрації, коли? Чи контролюються документи дизайну та плани тестування? Коли ви здійснюєте відділення та коли тегуєте? Чи зберігаєте ви попередні версії, і якщо так, то скільки / на скільки часу?

  • Норми розгортання. Як складається упаковка? Що потрібно перейти до нотаток до випуску? Як створюються / контролюються / запускаються сценарії оновлення?

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


2

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

  • Технічний аспект: спрямований на те, щоб уникнути ризикованого або неправильно сформованого коду (навіть якщо він прийнятий компілятором / перекладачем)
  • Аспект презентації: який стосується того, щоб програма стала зрозумілою для читачів

Технічний аспект я кваліфікую за стандартом кодування , як і Герб Саттер та Андрій Олександреску з ними стандартами кодування C ++ . У презентації я кваліфікуюсь із стилю кодування , який включає умовні позначення, відступ тощо ...

Стандарт кодування

Оскільки він є суто технічним, Стандарт кодування може бути переважно об'єктивним. Як таке, кожне правило повинно підтримуватися причиною. У книзі, про яку я згадував кожен предмет, є:

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

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

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

Саттеру та Олександреску вдалося скласти список із лише сотні предметів, хоча C ++ вважається волохатим;)

Стиль кодування

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

Ви не хочете входити у священну війну щодо того, який тип відступу чи дужки краще тут, є форуми для цього: тож у цій категорії ви робите речі консенсусом> голосування більшості> довільне рішення лідера.

Для прикладу форматування дивіться список варіантів художнього стилю . В ідеалі правила повинні бути чіткими та досконалими, щоб програма могла переписати код (хоча навряд чи ви коли-небудь кодуєте його);)

Для умови іменування я б спробував зробити клас / типи легко відрізнити від змінних / атрибутів.

Також до цієї категорії я класифікую такі "заходи", як:

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

Різне?

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


Але це нічого, якщо їх фактично не застосовують і не застосовують .

Будь-яке порушення повинно бути порушено під час перегляду коду, і жодне перегляд коду не повинно бути нормальним, якщо порушення виявлено:

  • виправити код відповідно до правила
  • виправте правило, щоб код більше не виділявся

Очевидно, що зміна правила означає отримати «йти вперед» від лідерів.


2

Мені подобається формат у Радянських рекомендаціях щодо дизайну, він включає загальний розділ та раціональні рекомендації. Найкорисніший біт - це деталі, які починаються з Do, Do Not, Avoid та uzeti на думку.

Ось приклад у розділі " Впровадження членів інтерфейсу". Явно в ньому є такі пункти (зауважте, я відмовився від обгрунтування заради стислості)

Уникайте явного впровадження членів інтерфейсу, не маючи на це вагомих причин

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

Не використовуйте явних членів як межу безпеки.

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

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


Там, де я зараз працюю, всі інтерфейси мають бути чітко реалізовані, і це великий біль. Якби вони лише прочитали Правила дизайну рамок перед тим, як написати свій стандарт кодування.
Мартін Браун

1

Здається, ніхто не згадував про безпеку - у стандарті кодування ви повинні мати посилання на вимоги захищеного коду (наприклад, використання модулів перевірки вводу, заборона відомих слабких функцій, таких як strcpy, вимоги обробки помилок тощо)


+1: Цей та багатопотоковий міркування часто невідомі або неправильно зрозумілі навіть досвідченим розробникам.
TMN

1

Приклади. Акуратно розташовані, нетривіальні, близькі до реального приклади, які використовують кожне правило. Коментарі (не обов'язково частина коду), яка частина прикладу слідує за правилом.

Шаблони. Не вид C ++, а щось копіювати та вставляти наживо. Набагато простіше отримати ці коментарі з котла на 24 рядках прямо тоді, коли у вас є посилання на копіювання.


1

Особливість номер один: максимум дві сторінки.

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


1

Стандарти кодування дійсно кілька предметів:

Умови кодування

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

Кращі практики

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

для екс. Ніколи не залишайте порожній Catch після спроби

try { Foo(); } catch { //do nothing }

1) Якщо виняток, викинутий Foo (), може спричинити інші проблеми функцій, які випливають, які припускають, що foo був успішним.

2) Глобальний обробник помилок не сповістить команду підтримки про виняток, коли це відбувається у продажі

  • охоплює практики "Оборонного кодування", як, наприклад, використання Ассертів для тестування ваших припущень.

Середовище кодування

  • інструменти, якими користується вся команда. для екс. VS 2010, Resharper, Kiln тощо.

0

Стандарти кодування, коли вони написані на папері, лише настільки ефективні. Мені подобається, як Go публікує свій стандарт кодування. Він має інструмент gofmtдля форматування тексту програми у формат. Будь-які дебати щодо формату кодування тоді просто спричинить виправлення джерелgofmt .

Що стосується формату,

  • як називати змінні, макроси, константи, літерали, функції тощо
  • як розмістити {,}, (,), [,], коли мова йде про if функціональне тіло, блоки операторів для будь-яких інших цілей,
  • наскільки широкими повинні бути відступи,
  • скільки символів дозволено рядок тексту
  • скільки рівнів відступів дозволено перед відхиленням / відправленням коду для рефакторингу
  • скільки рядків коду дозволено на одну функцію, перш ніж вона буде відправлена ​​назад для рефакторингу
  • максимальна кількість аргументів, яку може взяти функція, перш ніж вона буде відправлена ​​назад для рефакторингу
  • Кілька рядків коментарів перед тим, як функція почне коротко пояснювати, що вона робить, якщо тіло має перевищити одну сторінку екранного коду; залишаючи спосіб досягнення об'єкта кодом в тілі функції

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


там вже роками красуються коди. Google для вашої мови, ви знайдете його.
gbjbaanb

0

Мені подобається посібник зі стилів Google JavaScript .

У його керівних принципах ще є деталі, якщо вони потрібні.


Ви б не хотіли пояснити детальніше про те, що це робить, і чому ви рекомендуєте це відповісти на поставлене запитання? "Відповіді лише на посилання" не дуже вітаються на Stack Exchange
gnat

-1

Самодокументування коду (коментарі, назви змінних, назви функцій тощо)

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