У який момент стислість вже не є чеснотою?


102

Нещодавнє виправлення помилок вимагало від мене перегляду коду, написаного іншими членами команди, де я знайшов це (це C #):

return (decimal)CostIn > 0 && CostOut > 0 ? (((decimal)CostOut - (decimal)CostIn) / (decimal)CostOut) * 100 : 0;

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

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

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

Причиною кастингу є Entity Framework. DB повинен зберігати їх як нульові типи. Десяткові? не еквівалентно десятковому знаку в C # і його потрібно надати.


153
Коли стислість козиряє читабельність.
Роберт Харві

27
Дивлячись на ваш конкретний приклад: амплуа - це (1) місце, де розробник знає більше, ніж компілятор, і йому потрібно повідомити компілятор про факт, який неможливо вивести, або (2) де деякі дані зберігаються у "неправильному" "тип для тих операцій, які нам потрібно виконати. Обидва є сильними показниками того, що щось може бути відновлено. Найкраще тут - знайти спосіб написання коду без вставки.
Ерік Ліпперт

29
Зокрема, здається дивним, що CostIn потрібно подавати до десяткової, щоб порівняти його до нуля, але не CostOut; чому так? Що таке на землі - це тип CostIn, який його можна порівняти лише з нулем, відкинувши його до десяткової? І чому CostOut не є такого ж типу, як CostIn?
Ерік Ліпперт

12
Більше того, логіка тут може насправді помилятися. Припустимо, CostOutце дорівнює Double.Epsilon, а тому більше нуля. Але (decimal)CostOutв цьому випадку дорівнює нулю, і ми маємо ділення на нульову помилку. Першим кроком має стати правильний код , що, на мою думку, це не так. Правильно виправте, зробіть тестові кейси, а потім зробіть його елегантним . Елегантний і короткий код мають багато спільного, але іноді стислість - це не душа елегантності.
Ерік Ліпперт

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

Відповіді:


163

Щоб відповісти на ваше запитання про існуючі дослідження

Але чи було написано чи досліджено щось, щоб визнати точку, коли прагнення до короткості коду перестає бути корисним і стає бар'єром для розуміння?

Так, у цій галузі вже були роботи.

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

Цикломатичні лінії складності ÷ джерела коду ( SLOC )

У вашому прикладі коду цей коефіцієнт дуже високий, тому що все було стисло в один рядок.

SATC знайшов найефективнішу оцінку - поєднання розміру та [цикломатичної] складності. Модулі як з високою складністю, так і з великим розміром, як правило, мають найнижчу надійність. Модулі з невеликим розміром і високою складністю також є ризиком надійності, оскільки вони, як правило, дуже короткий код, який важко змінити або змінити.

Посилання

Ось декілька посилань, якщо вас цікавить:

McCabe, T. and A. Watson (1994), Складність програмного забезпечення (CrossTalk: The Journal of Defense Software Engineering).

Watson, AH, & McCabe, TJ (1996). Структуроване тестування: методика тестування з використанням метрики цикломатичної складності (Спеціальна публікація NIST 500-235). Отримано 14 травня 2011 року з веб-сайту McCabe Software: http://www.mccabe.com/pdf/mccabe-nist235r.pdf

Розенберг, Л., Хаммер, Т., Шоу, Дж. (1998). Програмні показники та надійність (Матеріали Міжнародного симпозіуму IEEE з інженерії надійності програмного забезпечення). Отримано 14 травня 2011 року з веб-сайту Державного університету Пенну: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.4041&rep=rep1&type=pdf

Моя думка та рішення

Особисто я ніколи не цінував стислості, лише читабельності. Іноді стислість допомагає читати, іноді - ні. Що важливіше, це те, що ви пишете дійсно очевидний код (ROC) замість коду лише для запису (WOC).

Просто для розваги, ось як я це написав би і попросив членів моєї команди написати:

if ((costIn <= 0) || (costOut <= 0)) return 0;
decimal changeAmount = costOut - costIn;
decimal changePercent = changeAmount / costOut * 100;
return changePercent;

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


4
Мені дуже подобається застереження про охорону для менш ніж нульового випадку. Можливо, варто зауважити: як вартість може бути меншою за нуль, який особливий випадок?
user949300

22
+1. Я, мабуть, додам щось на кшталтif ((costIn < 0) || (costOut < 0)) throw new Exception("costs must not be negative");
Doc Brown

13
@DocBrown: Це гарна пропозиція, але я б розглядав, чи може винятковий шлях коду виконуватись тестом. Якщо так, то напишіть тестовий випадок, який здійснює цей шлях коду. Якщо ні, то змініть всю справу на Assert.
Ерік Ліпперт

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

30
"Особисто я ніколи не цінував стислості, лише читабельності. Іноді стислість допомагає читати, іноді - ні". Відмінний момент. +1 просто для цього. Мені також подобається ваше рішення з кодом.
Wildcard

49

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

У цьому конкретному випадку касти decimalповторюються знову і знову; напевно, було б краще загалом переписати це як щось на зразок:

var decIn = (decimal)CostIn;
var decOut = (decimal)CostOut;
return decIn > 0 && CostOut > 0 ? (decOut - decIn ) / decOut * 100 : 0;
//                  ^ as in the question

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


1
Я, мабуть, пішов би далі і відновився ((decOut - decIn ) / decOut) * 100до іншої змінної.
FrustratedWithFormsDesigner

9
Асемблер був набагато зрозумілішим: лише одна операція на рядок. До!

2
@FrustratedWithFormsDesigner Я б навіть пішов на крок далі і загорнув умовний чек у дужки.
Chris Cirefice

1
@FrustratedWithFormsDesigner: Витягнення цього до того, як умовне буде обійти контрольну поділку на нуль ( CostOut > 0), тож вам доведеться розгорнути умовне на if-визначення. Не те, що в цьому є щось не так, але це додає більше багатослівності, ніж просто введення місцевого.
wchargin

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

7

Хоча я не можу навести якісь конкретні дослідження з цього приводу, я б припустив, що всі ці викиди у вашому коді порушують принцип "Не повторюйтесь". Схоже, ваш код намагається зробити - це перетворити costInі costOutввести Decimal, а потім виконати деякі перевірки обґрунтованості результатів таких перетворень та виконувати додаткові операції над перетвореними значеннями, якщо перевірки проходять. Насправді ваш код виконує одну з перевірок правильності на неперетворене значення, підвищуючи ймовірність того, що costOut може містити значення, яке перевищує нуль, але менше половини розміру, ніж найменший ненульовий показник, який Decimalможе представляти. Код був би набагато зрозумілішим, якби він визначав тип змінних Decimalдля утримування перетворених значень, а потім діяв на них.

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


(Десяткові) залишки, ймовірно, задовольняють деяким вимогам бізнес-правил. При роботі з бухгалтерами іноді доводиться стрибати через дурні обручі. Я думав, що у фінансового директора відбудеться серцевий напад, коли він знайшов рядок "Використовувати поправку на коригування податку - 0,01 долара", що було неминуче, враховуючи необхідну функціональність. (Додано: Ціна після сплати податку. Я повинен визначити ціну до оподаткування. Шанси відповіді не будуть дорівнює ставці податку.)
Лорен Печтел

@LorenPechtel: З огляду на те, що точність, до якої заграє актерський склад, Decimalзалежить від величини значення, про яке йдеться, мені важко уявити ділові правила, які б закликали до того, як насправді повинні вести себе касти.
supercat

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

1
@LorenPechtel: Для уточнення моєї останньої точки: тип з фіксованою точкою може гарантувати, що x + yy або переллється, або вийде y. DecimalТипу немає. Значення 1.0d / 3.0 матиме більше цифр праворуч від десяткової, ніж може бути збережене при використанні більших чисел. Тож додавання та віднімання одного і того ж більшого числа призведе до втрати точності. Типи з фіксованою точкою можуть втратити точність з дробовим множенням або діленням, але не з додаванням, відніманням, множенням або діленням з залишком (наприклад, 1.00 / 7 - 0,14, залишок 0,2; 1,00 діви 0,15 - 6, залишок 0,10).
supercat

1
@Hulk: Так, звичайно. Я обговорював, чи використовувати x + yy, отримуючи x, x + yx, даючи y, або x + yxy, і в кінцевому підсумку було перше два. Важливо те, що типи з фіксованою точкою можуть гарантувати, що багато послідовностей операцій ніколи не спричинять виявлених помилок округлення будь-якої величини. Якщо код додає речі різними способами для перевірки відповідності підсумків (наприклад, порівняння суми підсумків рядків із сумою підсумків стовпців), то результати виходять точно рівними, набагато краще, ніж їх виходити "закритими".
supercat

5

Я дивлюся на цей код і запитую "як може бути вартість 0 (або менше)?". Про який особливий випадок це вказує? Код повинен бути

bool BothCostsAreValidProducts = (CostIn > 0) && (CostOut > 0);
if (!BothCostsAreValidProducts)
  return NO_PROFIT;
else {
   // that calculation here...
}

Я здогадуюсь, як тут називаються: зміни BothCostsAreValidProductsі, NO_PROFITяк годиться.


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

Ваш на правильному шляху.
danny117

Це нерозумно. if (CostIn <= 0 || CostOut <= 0)абсолютно добре.
Майлз Руут

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

5

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

  1. Виконайте вимоги бізнесу з найменшим обсягом роботи

  2. Уникайте помилок

  3. Дозвольте нам внести зміни в майбутньому, які продовжують виконувати 1 та 2

Це цілі. Будь-який принцип чи метод проектування (будь то KISS, YAGNI, TDD, SOLID, докази, типові системи, динамічне метапрограмування тощо) є лише доброчесними, наскільки вони допомагають нам досягти цих цілей.

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

У лінійці є три питання: гвардія (спеціальний кожух 0), типове лиття та розрахунок. Кожне занепокоєння досить просте, якщо прийняти його ізольовано, але, оскільки всі вони змішані в одному виразі, це стає важко дотримуватися.

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

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

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

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


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

3

Стислість - це зовсім не чеснота. Читання - це чеснота.

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

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


2

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

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

decimal dIn = (decimal)CostIn;
decimal dOut = (decimal)CostOut;
return dIn > 0 && CostOut > 0 ? ((dOut - dIn) / dOut) * 100 : 0;

(Редагувати: це той самий код, що й інша відповідь, тому ви йдете.)

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


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

Цікаво, чи саме це викликає негативні голоси. За винятком того, що я написав, я сильно узгоджуюсь з Мейсоном Уілером, який наразі на 10 голосів. Він залишив і тернар в. Я не знаю, чому стільки людей мають проблеми ? :- я думаю, що приклад вище є досить компактним, особливо. порівняно з іншим.
Пол Брінклі

1
Дійсно не впевнений. Я не відповідав тобі. Мені не подобаються тернари, тому що незрозуміло, що з обох боків :. if-elseчитається як англійська: не можу пропустити, що це означає.
Алмо

FWIW Я підозрюю, що ви отримуєте голоси, оскільки це дуже схожа відповідь на Мейсона Уілера, але його отримали перше.
Боб Твей

1
Смерть потрійному оператору !! (також, смерть для вкладок, а також пробілів та будь-яка модель дужки та відступів, за винятком Allman (насправді, Дональд (тм) написав твіт, що це будуть перші три закони, які він приймає 20-го))
Mawg

2

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

return ((decimal)CostIn > 0 && CostOut > 0) ?
       100 * ( (decimal)CostOut - (decimal)CostIn ) / (decimal)CostOut:
       0;

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


4
Причиною кастингу є Entity Framework. DB повинен зберігати їх як нульові типи. Подвійний? не еквівалентно Double в C # і його потрібно передати.
Боб Твей

2
@MattThrower Ви маєте на увазі decimal, правда? double! = decimal, велика різниця.
pinkfloydx33

1
@ pinkfloydx33 так!
Набирайте

Я повинен пояснити своїм студентам, що типи даних SQL дивно відрізняються від типів, які використовуються в мовах програмування. Я так і не зміг пояснити їм, чому все-таки. "Не знаю!" "Маленький ендіан!"

3
Я зовсім не вважаю це читабельним.
Алмо

1

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

Я б написав це так:

return (decimal)CostIn > 0 && CostOut > 0 
            ? (((decimal)CostOut - (decimal)CostIn) / (decimal)CostOut) * 100 
            : 0;

Залежно від типу типу CostInта типу з CostOutплаваючою комою чи інтегрального типу, деякі з них можуть також бути непотрібними. На відміну від floatі double, цілісні значення неявно сприяють decimal.


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

@PJTraill Я, мабуть, пропустив це, він справді майже однаковий. Однак я дуже вважаю за краще, щоб оператори були на нових лініях, і тому я дозволяю своїй версії стояти.
Фелікс Домбек

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

0

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

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

var totalSales = CostOut;
var totalCost = CostIn;
var profit = (decimal)(CostOut - CostIn);
var grossMargin = 0m; //profit expressed as percentage of totalSales

if(profit > 0)
{
    grossMargin = profit/totalSales*100
}

3
Ви втратили ділення на нуль, повертаєте нуль.
danny117

1
і тому важко переробити чужий код, який максимізується для стислості, і чому добре мати додаткові коментарі, щоб пояснити, чому / як все працює
Рудольф Олах

0

Я припускаю, що CostIn * CostOut є цілими числами
Ось так я б написав
M (Гроші) десяткові

return CostIn > 0 && CostOut > 0 ? 100M * (CostOut - CostIn) / CostOut : 0M;

1
сподіваючись, що вони не обидві негативні думки: p
Вальфрат

2
Чи ділений на нуль ще є?
danny117

@ danny117 Коли лаконічність дає неправильну відповідь, то вона пішла далеко.
папараццо

Не хочеться оновлювати питання та активувати його. 100M і 0M примушують до десяткової. Я думаю (CostOut - CostIn) буде виконуватися як ціла математика, і тоді різниця буде приведена до десяткової.
папараццо

0

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

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


1
Тут вживаються практики та принципи інженерії програмного забезпечення. Нефункціональні вимоги
ханзоло

0

Стислість - це вже не чеснота, коли

  • Є Відділення без попередньої перевірки нуля.
  • Немає перевірки на нуль.
  • Прибирання немає.
  • Спробуй CATCH проти викидає ланцюг харчування, де можна впоратися з помилками.
  • Висловлюються припущення про порядок виконання асинхронних завдань
  • Завдання з використанням затримки замість перепланування в майбутньому
  • Зайве використання ІО
  • Не використовується оптимістичне оновлення

Коли відповідь недостатньо довгий.

1
Гаразд, це повинен був бути коментарем, а не відповіддю. Але він новий хлопець, так принаймні поясніть; не просто скажіть і не біжіть! Ласкаво просимо на борт, Денні. Я скасував перемогу, але наступного разу зробіть коментар :-)
Mawg

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

Дякую за привітання @Mawg Я хочу вказати, що перевірка на наявність "null" - це те, у чому я стикаюся з найбільш спричиненими проблемами у короткому коді.
danny117

Я щойно редагував через Android, і він не вимагав опису редагування. Я додав оптимістичне оновлення (виявити змінене та попередити)
danny117

0

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

Очевидно, що помилка в коді показує, що існує ще одна проблема з Q / A, яка була недоглядом, тому той факт, що виникла помилка, не викликає проблем.

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

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

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

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