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

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

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

Википедия:

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

Никогда не доверяйте вводу пользователя или внешнего приложения. Оба они полностью находятся вне контроля программиста, и поэтому у вас нет абсолютно никакого контроля над тем, что будет вводиться. Если вы не контролируете входные данные, вы должны утверждать их достоверность.

Никогда не предполагайте, что пользователь введет правильный ввод. На самом деле гораздо безопаснее предположить прямо противоположное. Предположим, что пользователь введет полный мусор, и убедитесь, что этот мусор отклонен приложением с соответствующим сообщением об ошибке. Это уже сразу делает приложение более надежным, защищая его от ввода пользователями мусора для ввода. Если пользователь должен ввести дату, убедитесь, что это все, что он может ввести. Если пользователь должен ввести число, убедитесь, что это все, что он может ввести. Я уверен, что вы поняли идею. То же правило применяется к входным данным, поступающим из внешних систем. Если ваше приложение интегрируется с другой системой, убедитесь, что любые входные данные строго подтверждены заранее.

Использовать

Скрыть код копирования

Assert()

операторы, чтобы гарантировать, что входные данные соответствуют ожидаемым типам и значениям, и продолжать работу только в том случае, если они соответствуют. В противном случае выдайте осмысленную ошибку. Будьте настолько строги, насколько это необходимо. Должны быть разрешены только значения, которые точно соответствуют формату, ожидаемому от приложения. Все остальное следует отвергнуть. Вместо утверждения того, что недействительно, вместо этого утверждайте то, что действительно, и обрабатывайте соответственно. Вероятно, существует гораздо более длинный список способов, которыми что-то может быть неправильным, чем список способов, которыми это может быть правильным. Так что, вероятно, лучше утверждать для этих случаев.

Прежде чем потреблять ресурс, убедитесь, что ресурс действителен. Например, при доступе к данным из подключения к базе данных убедитесь, что подключение к базе данных допустимо и открыто.

Скрыть код копирования

SqlConnection connection = new SqlConnection("myDatabaseConnectionString");
connection.Open(); //what if this line of code fails!!
SqlCommand cmd = new SqlCommand("myStoredProcedure", connection)

При чтении значений из базы данных не предполагайте, что есть какие-либо данные, и не предполагайте, что данные действительны. Например, могут отсутствовать данные или возвращаемые значения могут быть нулевыми.

Скрыть код копирования

SqlDataReader reader = cmd.ExecuteReader();
string firstName= reader["firstName"]; //what if there was no data or the value for firstname is null!!

Не предполагайте, что переменная содержит действительное значение или даже правильно инициализирована.

Скрыть код копирования

MyMoneyClass money; //declared but not initialised
decimal funds = money.GetFunds(); //this will cause an error as it has not been initialised!!

Защитное программирование — это набор правил, поскольку это парадигма программирования. Ничего не предполагайте, все утверждайте, ожидайте неожиданного.

Если эта статья была вам полезна, нажмите кнопку💚ниже. Спасибо!