Программирование >>  Аргументация конструирования 

1 ... 99 100 101 [ 102 ] 103 104 105 ... 108


Гл29

Десять способов избежать ошибок

S э/ной главе...

всех предупреждений и об ошибках

Добейтесь чистой компиляции

последовательный стиль программирования Ограничивайте видимость

Комментируйте свою программу

Хотя бы один раз выполните программу пошагово V Избегайте перегрузки операторов Работа с кучей

Используйте исключительные ситуации для обработки ошибок

Избегайте множественного наследования

включение всех nfteqi/nfteMqeHuu иссю(}щений ооишках

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

Выключение сообщений об ошибках и предупреждений подобно отключению красных габаритных огней на вашей машине, потому что они вас раздражают, Игнорирование проблемы не заставит ее исчезнуть. Если ваш компилятор имеет режим абсолютной проверки кода, включите его. И Microsoft и Borland предоставляют режим Включить все сообщения (Enable All Messages), который должен постоянно находиться в рабочем состоянии. В конце концов эта многословность сбережет ваше время.

Рассматривая ваш исходный код, умный компилятор С + + помимо ошибок ищет всякие подозрительные конструкции. Вот пример:

#include student.h ttinclude class.h

Student* addNewStudent (Class class, char *pName,

SSNumber ss)

Student pS; if(pllame != 0)

pS - new Student(pName, ss) ; class.addStudent(pS);

return pS;



Умный компилятор (типа Visual C ++) понимает, что есл агае равно 0, то переменная pS никогда не будет и выводит сообщение об этом и обращает ваше внимание, что было бы неплохо взглянуть на эту проблему еще раз.

:i>o3euifiecb чиаЯойкомпиляции

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

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

испальз(/шне послеб€а/§1ельмш cfkuub nftozfuuuuogoHusi

Программирование с использованием чистого последовательного стиля не только улучшает читаемость программы, но и уменьшает количество ошибок программирования. Помните, что, чем меньше сил будет уходить на расшифровку кода, тем больше их останется на обдумывание логики создаваемой программы. Хороший стиль программирования позволяет легко справляться с такими задачами:

V различать имена классов, имена объектов и имена функций; I получать определеппую информацию об объекте по его имени; I отличать команды препроцессора от команд C + + ; \ различать блоки программы С + + по уровню отступов.

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

Очень важно, чтобы программисты, работающие над одним проектом, имели

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

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

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

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



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

class Array

public:

Array{int s)

s i z e = 0 ;

pData = new int[s]; if (pData)

size = s;

-Array ()

delete pData; size = 0; pData = 0;

Вернуть или установить данные в массиве int data fint index)

return pData[index] ;

int data (int index, int newValue) {

mt oldValue = pData [index] ; pData[index] = newValue;

return oldValue;

protected:

int size; int -pData;

Функция data (int) позволяет внешнему приложению читать данные из Array. Эта функция слишком доверчива: она не проверяет, находится ли переменная index в допустимом диапазоне. А что, если она выйдет за предусмотренные границы? Функция data (int, int) с этой точки зрения хуже, поскольку производит запись в неизвестное место в памяти.

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

приведен только пример функции data (int). int int index)

if (index >= size)

cout Индекс массива вне

допустимого диапазона ( index }\n ; return 0;

return pData[index];

Теперь, если переменная index будет в1ходить за пределы допустимого диапазона, это будет выявлено на этапе проверки (беззнаковость переменной index избавляет от необходимости проверки на отрицательность значения индекса).



1 ... 99 100 101 [ 102 ] 103 104 105 ... 108

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика