25.07.2017 Views

Intro-CSharp-Book-v2015

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Глава 21. Качествен програмен код 911<br />

Assertions могат да се изключват. По замисъл те трябва да са включени само<br />

по време на разработка, докато се открият всички бъгове. Когато бъдат<br />

изключени всички проверки в тях спират да се изпълняват. Идеята на<br />

изключването е, че след края на разработката, тези проверки не са повече<br />

нужни и само забавят софтуера.<br />

Ако дадена проверка е смислено да продължи да съществува след края на<br />

разработката (например проверява входни данни на метод, които идват<br />

от потребителя), то тази проверка е неправилно имплементирана с<br />

assertions и трябва да бъде имплементирана с изключения.<br />

Assertions се използват само на места, на които трябва<br />

дадено условие да бъде изпълнено и единствената причина<br />

да не е, е да има бъг в програмата.<br />

Защитно програмиране с изключения<br />

Изключенията (exceptions) предоставят мощен механизъм за централизирано<br />

управление на грешки и непредвидени ситуации. В главата "Обработка<br />

на изключения" те са описани подробно.<br />

Изключенията позволяват проблемните ситуации да се обработват на много<br />

нива. Те улесняват писането и поддръжката на надежден програмен код.<br />

Разликата между изключенията и assertions е в това, че изключенията в<br />

защитното програмиране се използват най-вече за защитаване на публичния<br />

интерфейс на един компонент. Този механизъм се нарича fail-safe (в<br />

свободен превод "проваляй се грациозно" или "подготвен за грешки").<br />

Ако методът archive, описан малко по-нагоре, беше част от публичния<br />

интерфейс на архивиращ компонент, а не вътрешен метод, то този метод<br />

би трябвало да бъде имплементиран така:<br />

public int Archive(PersonData user, bool persistent)<br />

{<br />

if (user == null)<br />

throw new StorageException("null parameter");<br />

// Do some processing<br />

int resultFromProcessing = ...<br />

Debug.Assert(resultFromProcessing >= 0,<br />

"resultFromProcessing is negative. There is a bug");<br />

}<br />

return resultFromProcessing;<br />

Assert остава, тъй като той е предвиден за променлива създадена вътре в<br />

метода.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!