Blogerator.org

Ексклузивни ИТ новини, рецензии и интервюта

Въведение в спецификата на Assert и неговите разновидности

Assert е специална конструкция, която ви позволява да тествате предположения за стойностите на произволни данни навсякъде в програмата. Тази конструкция може автоматично да сигнализира при откриване на невалидни данни, което обикновено води до необичайно прекратяване на програмата, показващо местоположението на невалидните данни.

Странен, на пръв поглед дизайн - той може да провали програмата в най-неподходящия момент. Какъв е смисълът в него? Нека заедно да помислим какво ще се случи, ако по време на изпълнението на програмата, в даден момент от време, някои програмни данни станат неверни и ние не „попълним“ програмата веднага, а продължим работата си, сякаш нищо не се е случило.

разновидности

Програмата може да работи дълго време след това без видими грешки. И може по всяко време в бъдеще да се "провали" по причина, известна само на нея. Или изведнъж ви изпомпва пълен твърд диск със съдържание гей порно сайтове.

Твърденията са достъпни на много езици за програмиране, включително java, c #, c и python.

Какви видове твърдения са?

Твърденията ви позволяват да улавяте грешки в програмите по време на компилиране или по време на изпълнение. Проверките по време на компилация не са толкова важни - в повечето случаи те могат да бъдат заменени с подобни проверки по време на изпълнението на програмата. С други думи, твърденията за компилация не са нищо повече от синтактична захар.

Следователно в следващото под твърдения ще имаме предвид само проверки по време на изпълнението на програмата.

Твърденията могат да бъдат разделени на следните класове.

#one. Проверка на входящи аргументи в началото на функция

Ако бъде открита невалидна стойност на който и да е аргумент, това означава, че някъде близо до мястото, където се извиква тази функция, може да има бъгове.

Важно е да се разбере, че входящите аргументи на функцията могат да бъдат неявни.

въведение

Например, когато се извиква метод на клас, указателят към обект от този клас (известен още като този и самостоятелно) се предава имплицитно на функцията. Функцията може също да има достъп до данни, декларирани в глобалния обхват, или до данни от обхвата на лексикално затваряне. Също така е желателно да се проверят тези аргументи, като се използват твърдения при въвеждане на функция.

# 2. Проверка на данните, върху които е работила функцията, преди да излезе от тази функция

Ако на този етап бъдат открити неверни данни, тогава кодът на тази функция може да съдържа грешки.

Резултатът от функцията може да бъде неявен. Например, функция може да модифицира данните, на които се препраща (пряко или косвено) от аргументите на функцията. Функцията може също да модифицира данни от глобалния обхват или от обхвата на лексикалното затваряне.

неговите

Препоръчително е да проверите верността на тези данни, преди да излезете от функцията.

# 3. Проверка на данните, с които функцията работи вътре във функционалния код

Ако в средата на функцията бъдат открити неверни данни, грешките може да са някъде в областта на тази проверка.

Кога и къде да се използват твърдения?

Отговорът е прост - използвайте твърдения, когато и където и да изглеждат полезни. В края на краищата те значително опростяват локализацията на грешки в кода. Дори проверката на резултатите от изпълнението на очевиден код може да бъде полезна за последващо рефакторинг, след което кодът може да стане не толкова очевиден и грешка лесно да се вмъкне в него.

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

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

Ако програмата е написана в най-добрите традиции на ООП или използва корпоративна методология, тогава твърденията изобщо не трябва да се деактивират - производителността е малко вероятно да се промени:)

Когато можете да правите без твърдения?

Когато за първи път научих за съществуването на твърдения, програмите ми започнаха да съдържат 100500 твърдения, много от които са се дублирали много пъти. С течение на времето броят на твърденията в моя код започна да намалява. Следните правила направиха възможно значително намаляване на броя на твърдения в моите програми, без значително влошаване на ефективността на улавяне на грешки:

• Можете да избегнете дублиращи проверки на входящи аргументи, като ги поставяте само във функции, които директно работят с дадения аргумент. Тези. ако функцията foo () не работи с аргумент, а само я предава на функцията bar (), тогава можете да пропуснете проверката на този аргумент във функцията foo (), тъй като дублира се чрез проверка на аргумента във функцията bar () .

• Можете да пропуснете твърдения за невалидни стойности, което гарантирано ще доведе до срив на програмата в непосредствена близост до тези твърдения, т.е. ако сривът на програмата може бързо да определи местоположението на грешката. Тези твърдения включват проверка на показалеца за NULL, преди да го дереферентира и проверка за нулевата стойност на делителя преди разделяне. Повтарям още веднъж - такива проверки могат да бъдат пропуснати само когато средата за изпълнение гарантира, че програмата се срива в тези случаи.

неговите

Възможно е да има и други начини за намаляване на броя на твърденията, без да се нарушава ефективността на улавянето на грешки.

Когато не можете да използвате твърдения?

Защото твърдения могат да бъдат премахнати по време на компилация или по време на изпълнение на програмата, те не трябва да променят поведението на програмата. Ако в резултат на премахването на твърдение, поведението на програмата може да се промени, това е ясен знак за неправилно използване на assert.

По този начин, функции, които променят състоянието на програмата или външната среда на програмата, не могат да бъдат извикани в твърдение.

Например следният код неправилно използва твърдения:

Очевидно данните могат да бъдат незащитени, когато твърденията са деактивирани.

За да коригирате тази грешка, трябва да запишете резултата от изпълнението на функцията във временна променлива и след това да използвате тази променлива в утвърждаването:

Ако write () връща 0, това не означава, че има грешка в нашата програма. Ако твърдения са деактивирани в програмата, грешката при запис може да остане незабелязана, което може да доведе до тъжни резултати по-късно. Следователно, assert () не е подходящ тук.

Нормалната обработка на грешки е по-добра тук.

Програмирам в javascript. В него няма твърдения. Какво трябва да направя?

Някои езици за програмиране нямат изрична поддръжка за твърдения. При желание те могат лесно да бъдат внедрени там, следвайки следния "модел на проектиране":

Добре поставените твърдения опростяват автоматизираното тестване на кода, защото програмата за тестване може да пропусне проверки, които дублират твърдения в програмния код. Такива проверки обикновено съставляват значителна част от всички проверки в програмата за тестване.