Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Рассматривая ваш исходный код, умный компилятор С++ помимо ошибок ищет всякие подозрительные конструкции. Вот пример:
#include "student.h"
#include "class.h"
Student* addNewStudent ( Class class , char *pName ,
SSNumber ss )
{
Student pS ;
if( pName != 0 )
{
pS = new Student( pName , ss ) ;
class.addStudent( pS ) ;
}
return pS ;
}
Умный компилятор понимает, что если pName равно 0 , то переменная pS никогда не будет проинициализирована; он выводит сообщение об этом и обращает ваше внимание, что было бы неплохо взглянуть на эту проблему ещё раз.
►Добейтесь чистой компиляции...332
Не начинайте отладку кода, пока не избавитесь от всех предупреждений ( или хотя бы не поймёте их причину ). Выключение режима вывода всех сообщений об ошибках, чтобы они не надоедали, не приведёт ни к чему хорошему. Если вы не поняли сообщение сразу, посидите и разберитесь с ним. Проблемы появляются именно там, где вы чего-то не понимаете.
►Используйте последовательный стиль программирования...332
Программирование с использованием чистого последовательного стиля не только улучшает читаемость программы, но и уменьшает количество ошибок программирования. Помните: чем меньше сил будет уходить на расшифровку кода, тем больше их останется на обдумывание логики создаваемой программы. Хороший стиль программирования позволяет легко справляться с такими задачами:
■■■
■ различать имена классов, имена объектов и имена функций;
■ получать определённую информацию об объекте по его имени;
■ отличать команды препроцессора от команд С++;
■ различать блоки программы С++ по уровню отступов.
■■■
Кроме того, вы должны приучиться создавать стандартный заголовок модулей. В таких заголовках следует приводить информацию о функциях или классах, содержащихся в данном модуле, об имени автора ( имеется в виду ваше имя ), о дате создания и версии используемого компилятора, а также об истории исправлений и модификаций.
Очень важно, чтобы программисты, работающие над одним проектом, имели одинаковый стиль программирования. Попытка разобраться в программе, состоящей из фрагментов с разными стилями программирования, — довольно тоскливое занятие.
►Ограничивайте видимость...332
Ограничение видимости внутреннего содержимого класса для внешнего мира — один из краеугольных камней объектно-ориентированного программирования. Класс сам отвечает за своё содержимое, а приложение лишь использует класс для решения поставленных задач.
В частности, ограниченная видимость означает, что данные-члены не должны быть доступны извне класса, т.е. они должны быть защищёнными или закрытыми. Кроме того, должны быть защищены функции-члены, о которых внешние приложения не должны знать.
Открытые функции-члены должны как можно меньше доверять внешнему коду — любой аргумент, переданный открытой функции-члену, должен рассматриваться как потенциальный источник ошибки, пока не будет достоверно доказано обратное. Функция, приведённая ниже, представляет собой мину, которая только и ждёт своего часа.
_________________
332 стр. Часть 6. Великолепная десятка
class Array
{
public :
Array( int s )
{
size = 0 ;
pData = new int[ s ] ;
if ( pData )
{
size = s ;
}
}
~Array( )
{
delete pData ;
size = 0 ;
pData = 0 ;
}
/* Вернуть или установить данные в массиве */
int data( int index )
{
return pData[ index ] ;
}
int data ( int index , int newValue )
{
int oldValue = pData[ index ] ;
pData[ index ] = newValue ;
return oldValue ;
}
protected :
int size ;
int *pData ;
} ;
Функция data( int ) позволяет внешнему приложению читать данные из Array . Эта функция слишком доверчива: она не проверяет, находится ли переменная index в допустимом диапазоне. А что, если она выйдет за предусмотренные границы? Функция data( int , int ) с этой точки зрения ещё хуже, поскольку производит запись в неизвестное место в памяти.
В следующем примере показано, как осуществить такую проверку. Для краткости приведём только пример функции data( int ) .
int data( unsigned int index )
{
if ( index >= size )
{
throw Exception( "Индекс массива вне "
"допустимого диапазона" ) ;
}
return pData[ index ] ;
}
Теперь, если переменная index будет выходить за пределы допустимого диапазона, это будет выявлено на этапе проверки ( беззнаковость переменной index избавляет от необходимости проверки на отрицательность значения индекса ).
_________________
333 стр. Глава 29. Десять способов избежать ошибок
►Комментируйте свою программу...334
Я считаю, что можно избежать излишних ошибок, если комментировать программу в процессе её написания, вместо того чтобы ждать, когда программа заработает, и только потом возвращаться и добавлять комментарии к тексту.
Понятно, что никому не хочется тратить время на написание объёмистых заголовков и пояснений к функциям, но всегда можно найти пару минут, чтобы добавить краткий комментарий к программе. Когда вы вернётесь к коду, написанному недели две назад, короткие и содержательные комментарии значительно облегчат "вживание" в программу.
Кроме того, последовательно используемые отступы и соглашения об именах сделают код гораздо доступнее для чтения и понимания. Конечно, очень приятно, когда код легко читать по завершении написания программы, но просто необходимо, чтобы код хорошо воспринимался и при написании — именно тогда, когда вам действительно нужна помощь.
►Хотя бы один раз выполните программу пошагово...334
Существенно облегчит понимание работы программы пошаговое выполнение программы с помощью хорошего отладчика ( обычно для этого вполне подходят отладчики, включенные в среды разработки компиляторов ).
Когда некоторая функция готова и может быть добавлена к программе, её следует тщательно проверить хотя бы один раз, проходя все возможные варианты ветвления потока управления. Гораздо легче отлавливать ошибки в отдельной функции, чем в комплексе с другими функциями программы.
►Избегайте перегрузки операторов...334
Настоятельно советую избегать перегрузки операторов, за исключением оператора присвоения operator = ( ) , пока вы как следует не освоитесь в С++. Хотя хороший набор перегруженных операторов и может значительно повысить полезность класса и читаемость кода, перегрузка почти никогда не бывает крайне необходимой и может значительно усложнить жизнь начинающего программиста. Тот же эффект вы можете получить при помощи определения и использования соответствующих открытых функций-членов.
Читать дальшеИнтервал:
Закладка: