Я налагоджую точку перерви і усвідомлюю виклик затвердження? Я думав, що це тільки для одиничних тестів. Що це робить більше, ніж точка розриву? Оскільки я можу зламати точку, чому я повинен використовувати Assert?
Я налагоджую точку перерви і усвідомлюю виклик затвердження? Я думав, що це тільки для одиничних тестів. Що це робить більше, ніж точка розриву? Оскільки я можу зламати точку, чому я повинен використовувати Assert?
Відповіді:
У компіляції налагодження Assert
приймає булева умова як параметр і показує діалог помилок, якщо умова помилкова. Програма триває без будь-яких перерв, якщо умова справжня.
Якщо ви компілюєте у Release, всі Debug.Assert
автоматично вимикаються.
Debug.Assert
у режимі випуску?
Від коду завершено
8 Оборонне програмування
8.2 Твердження
Твердження - це код, який використовується під час розробки - зазвичай це рутина або макрос - який дозволяє програмі перевірити себе під час роботи. Коли твердження вірно, це означає, що все працює так, як очікувалося. Коли це неправда, це означає, що він виявив несподівану помилку в коді. Наприклад, якщо система передбачає, що файл інформації про клієнтів ніколи не матиме більше 50 000 записів, програма може містити твердження, що кількість записів менша або дорівнює 50 000. Поки кількість записів менше або дорівнює 50 000, твердження буде мовчати. Однак, якщо у нього зустрічається понад 50 000 записів, він голосно "стверджує", що в програмі є помилка.
Твердження особливо корисні у великих, складних програмах та програмах з високою надійністю. Вони дозволяють програмістам швидше вимивати невідповідні припущення інтерфейсу, помилки, які виникають при зміні коду тощо.
Затвердження зазвичай бере два аргументи: булевий вираз, який описує припущення, яке повинно бути правдивим, і повідомлення, яке відображається, якщо його немає.
(…)
Зазвичай ви не хочете, щоб користувачі бачили повідомлення про твердження у виробничому коді; твердження в першу чергу для використання під час розробки та обслуговування. Твердження зазвичай складаються в код на час розробки та складаються з коду для виробництва. Під час розвитку твердження вимивають суперечливі припущення, несподівані умови, погані значення, передані підпрограми тощо. Під час виробництва вони складаються з коду, щоб твердження не погіршували продуктивність системи.
Ви повинні використовувати його для випадків, коли вам не потрібно переривати кожну маленьку лінійку коду для перевірки змінних, але ви хочете отримати якийсь зворотній зв'язок, якщо є певні ситуації, наприклад:
Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");
System.Diagnostics
Assert також дає ще одну можливість посміхнутися навичками Microsoft щодо розробки інтерфейсу користувача. Я маю на увазі: діалогове вікно з трьома кнопками «Скасувати», «Повторити», «Ігнорувати» та поясненням, як їх інтерпретувати в заголовку!
Assert дозволяє стверджувати, що умова (пост або попередньо) застосовується у вашому коді. Це спосіб задокументувати свої наміри та повідомити про налагоджувальну машину діалоговим вікном, якщо ваш намір не виконується.
На відміну від точки перерви, Assert додається до вашого коду і може бути використаний для додавання додаткових відомостей про ваш намір.
Перш за все Assert()
метод доступний Trace
і для Debug
занять.
Debug.Assert()
виконується лише в режимі налагодження.
Trace.Assert()
виконується в режимі налагодження та випуску.
Ось приклад:
int i = 1 + 3;
// Debug.Assert method in Debug mode fails, since i == 4
Debug.Assert(i == 3);
Debug.WriteLine(i == 3, "i is equal to 3");
// Trace.Assert method in Release mode is not failing.
Trace.Assert(i == 4);
Trace.WriteLine(i == 4, "i is equla to 4");
Console.WriteLine("Press a key to continue...");
Console.ReadLine();
Запустіть цей код у режимі налагодження, а потім у режимі випуску.
Ви помітите, що в режимі налагодження ваш код Debug.Assert
заяви не працює, ви отримаєте поле з повідомленням, що показує поточний слід стека програми. У режимі випуску цього не відбувається, оскільки Trace.Assert()
умова справжня (i == 4)
.
WriteLine()
метод просто дає вам можливість записувати інформацію до виводу Visual Studio.
Твердження сильно притаманні проектуванню за контрактом (DbC), який, як я розумію, був введений / схвалений Майєром, Бертаном. 1997. Об'єктно-орієнтоване управління програмним забезпеченням.
Важливою особливістю є те, що вони не повинні створювати побічні ефекти, наприклад, ви можете обробити виняток або здійснити інший хід дій із оператором if (захисне програмування).
Твердження використовуються для перевірки умов договору до / після договору, відносин клієнт / постачальник - клієнт повинен забезпечити дотримання попередніх умов постачальника, наприклад. надсилає 5 фунтів стерлінгів, а постачальник повинен забезпечити, щоб дотримані умови були виконані, наприклад. доставляє 12 троянд. (Просто просте пояснення клієнта / постачальника - можна прийняти менше і доставити більше, але про твердження). C # також вводить Trace.Assert (), який можна використовувати для випуску коду.
Щоб відповісти на питання, вони все ще корисні, але можуть додати складності + читабельності коду та часу + важко підтримувати. Чи варто їм все-таки користуватися? Так, чи всі ми будемо ними користуватися? Можливо, ні, чи ні в тій мірі, як описує Меєр.
(Навіть курс OU Java, що я вивчив цю техніку, показав лише прості приклади, а решта кодів там не застосовувала правила затвердження DbC щодо більшості коду, але, як передбачалося, використовувалася для забезпечення правильності програми!)
Як я вважаю це Debug.Assert - це спосіб встановити договір про те, як слід називати метод, орієнтуючись на специфіку значень параметра (а не просто на тип). Наприклад, якщо ви не повинні відправляти нуль у другому параметрі, ви додаєте Assert навколо цього параметра, щоб сказати споживачеві не робити цього.
Це заважає комусь користуватися вашим кодом бездоганно. Але це також дозволяє цьому головному способу пройти виробництво і не дати неприємне повідомлення замовнику (припустимо, що ви будуєте збірку Release).