Наскільки захисними ми повинні бути?


11

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

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

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

Тож ми змінили:

if (inputString == null)

до

if (string.IsNullOrEmpty(inputString)) // ***

Це виправляло початкові питання. Але потім, коли ми знову запустили Пекса, вирішили, що:

inputString = "\0";

викликав проблеми. І потім

inputString = "\u0001";

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

Цього достатньо?


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

@ Розчаровано: Так, безумовно, є профіль, який ми можемо робити та робити. До речі, Pex - чудовий інструмент. Результати, які він показав, просто підштовхнули питання.
Петро К.

У мене немає відповіді за вас, але я хотів сказати подяку за те посилання на цю річ Пекса; Це виглядає досить акуратно, якщо це, на мій погляд, є, і автоматично (?) створить одиничні тести для існуючого коду. Код, над яким я працюю, величезний і не має тестів і дуже щільно зв'язаного коду, тому неможливо нічого переробляти.
Уейн Моліна

@WayneM: Так, це досить добре, хоча мені потрібно було пройти кілька прикладів, щоб зрозуміти, що це робило. Щодо застарілого коду, це чудово. Ще краще для нового коду!
Пітер К.

Відповіді:


9

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

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

По-друге, скільки людей повторно використовувати цю функцію чи фрагмент коду? Тільки ти? Ваш відділ? Ваша компанія? Ваші клієнти? Чим ширше використання коду, тим захисніше.

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

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


6

Користувачі злі, і все, що вони вносять, слід перевіряти з максимальною суворістю.

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

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


2

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

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

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

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

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

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

3) Які результати невдачі в даний момент у коді. Чи призведе це до того, що вся справа невдача? Чи буде виявлена ​​будь-яка помилка в іншому місці і чи буде принаймні ця помилка виявлена

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

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


1

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

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

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

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