Похожие презентации:
Элементы стиля программирования
1.
Элементы стиляпрограммирования.
1
2.
Комментирование кода2
3.
Комментарии должны быть законченными смысловымипредложениями
Комментарии должны соответствовать программному коду
Комментарии должны документировать физический процесс
Примеры комментариев
/----------------------------------//производим масштабирование
. . . . . . .
/----------------------------------// вычисляем среднее значение за период
. . . . . . .
3
4.
Комментарии должны иметь тот же отступ, что и окружающийтекст программы
void the_function( void )
{
//размер массива
int size = 10;
int a,b
//массив сортируемых чисел
int arr[size];
while ( a < b )
{
//проверка на наличие чего либо
while ( something_else() )
{
for ( i = 10; i >= 0; i-- )
{
//обработка массива
arr[i] = some_fun(i);
}
}
}
}
4
5.
Комментарии должны иметь тот же отступ, что и окружающийтекст программы
void the_function( void )
{
//размер массива
int size = 10;
int a,b
//массив сортируемых чисел
int arr[size];
while ( a < b )
{
//проверка на наличие чего либо
while ( something_else() )
{
for ( i = 10; i >= 0; i-- )
{
//обработка массива
arr[i] = some_fun(i);
}
}
}
}
5
6.
Комментарии могут идти параллельно тексту программыvoid the_function( void )
{
int size = 10;
int a,b,i;
int arr[size];
// размер массива
// вспомогательные переменные
// массив сортируемых чисел
while ( a < b )
{
while ( something_else() )
// проверка на наличие
{
// чего либо
for ( i = 10; i >= 0; i-- )
{
arr[i] = some_fun(i); // обработка массива
}
}
}
}
6
7.
Комментарий не должен подтверждать очевидноеПримеры плохих комментариев
/----------------------------------++x;
// увеличить x на единицу
/----------------------------------// обнуление массива
for ( i = 0 ; i < n ; i ++ )
{
arr[i] = 0;
}
7
8.
Комментарии функций и процедур/*Получает индекс элемента массива с заданным значением
*
* value - значение элемента массива
* Возвращает индекс элемента с заданным значением, либо -1,
если элемент не найден*/
int the_function(int value)
{
for ( i = size; i >= 0; i-- )
{
if (arr[i] == value)
return i;
}
return -1;
}
Комментарий не должен затруднять чтение программы
8
9.
Именование переменных9
10.
Имена должны быть обычными словами английского языка,описывающими то, что делает функция, аргумент или переменная
Говорящие имена переменных
result
– результат выполнения функции
size
– размер массива
temperature – значение температуры
Попытка использования другого языка
int Kolichestvo;
int Koren;
int Derevo;
10
11.
Пользуйтесь длинными, содержательными именами дляглобальных объектов и короткими — для локальных
Объявление глобального имени
int CountActiveDocs =0; // количество активных документов
Неоправданно длинные локальные имена
for(ElementIndex = 0 ; ElementIndex < numberOfElements ; ElementIndex++ )
{
elementArray[ElementIndex] = Elementlndex;
}
Правильные локальные имена
for (i = 0; i < nelems; i++)
{
elem[i] = i;
}
11
12.
Различные стили именования переменныхСтиль именования Паскаль
BackColor
LastModified
DateTime
GetType
SetFontValue
Стиль именования Кэмел
backColor
lastModified
dateTime
getType
setFontValue
Стиль именования Змеиный регистр
Back_Color
Set_Font_Value
12
13.
Пользуйтесь только общепринятыми сокращениями иаббревиатурами
Аббревиатуры при именовании переменных
col
cur
i j
max
min
— индекс столбца;
— текущий;
— обобщенные счетчики циклов;
— максимум (обычно в качестве префикса или суффикса);
— минимум (обычно в качестве префикса или суффикса);
Давайте функциям активные имена
getTime();
showValue();
Пример плохого имени функции возвращающей логическое значение
if (checkoctal(с)) . . .
Пример правильного имени функции возвращающей
логическое значение
if (isOctal(с)) . . .
13
14.
Не используйте в качестве имен тарабарщинуНапример венгерскую нотацию
LPCSTR
lpszstr;
То же самое
const char *str;
Не используйте в программе «магических» чисел.
Присваивайте константам символические имена.
Пример плохого кода
Пример хорошего кода
for (i = 34 ; i < 67 ; i ++ )
{
arr_[i] = 12;
}
const int INIT_VAL = 12;
const int SIZE_ARRAY = 67;
. . .
for (i = 0 ; i < SIZE_ARRAY ; i ++ )
{
arr_[i] = INIT_VAL;
}
14
15.
Форматирование кода15
16.
Используйте аккуратные столбцы везде, где можноСравните данный кусок кода …
int x; // Опишите, что делает x.
unsigned long int (*pfi)(); // Опишите, что делает pfi.
const char *the_variable; // Опишите, что делает
the_variable.
int z; // Опишите, что делает z.
x = 10; // Здесь идет комментарий.
the_variable = x; // Здесь второй комментарий.
z = x; // A здесь третий.
16
17.
Используйте аккуратные столбцы везде, где можноС текущим куском кода …
int
x;
// Опишите, что делает x.
unsigned long int ( *pfi )();
// Опишите, что делает pfi.
int
z;
// Опишите, что делает z.
const char
*the_variable; // Опишите, что делает
// the_variable.
x
= 10;
the_variable = x;
z
= x;
// Здесь идет комментарий.
// Здесь второй комментарий.
// A здесь третий.
17
18.
Располагайте в строке только один операторОтдельная функция должна помещаться на экране
Можно использовать штриховую линию для
зрительного разделения функций
//-----------------------------------------------------int funONE(int, float)
{
//something
}
//-----------------------------------------------------int funTWO(char*, bool)
{
//something
}
18
19.
Располагайте большие комментарии, строки, вызовыподпрограмм и функций на нескольких строчках
///Пример: (плохой код)
cout<<"Меня стоит расположить в несколько строчек, потому что
Пример: (хороший код)
cout<<"Меня стоит расположить в несколько строчек, "
"потому что иначе тебе придется прокручивать каретку, "
"чтоб просмотреть меня целиком"<<endl;
19
20.
Стили расстановок скобокСтиль Алмена
if( condition )
{
code();
}
else
{
more_code();
}
Стиль Кернигена
И Ричи
Стиль
if( condition ){
code();
}
else {
more_code();
}
if( condition )
{
code();
}
else
{
more_code();
}
Стиль GNU
Whitesmith
if( condition )
{
code();
}
else
{
more_code();
}
Используйте единообразный стиль на всем протяжении программы
20
21.
Пробелы и абзацы — одни из наиболее эффективных комментариев//-----------------------------------------------------int funONE(int, float)
{
//первый логический
//блок в функции
//второй логический
//блок в функции
//третий логический
//блок в функции
}
//------------------------------------------------------
21
22.
Разделять пробелами все операторы в выраженияхвместо
if(i<0)
{
…
}
следует писать
if ( i < 0 )
{
…
}
вместо
for(i=0;i<100;i++)
{
…
}
следует писать
for ( i = 0 ; i < 100 ; i++ )
{
…
}
22
23.
Пробел или табуляция?Используйте отступы в два или четыре пробела(лучше четыре)
Сравните данный вариант
void f( void )
{
if( x )
yyy();
more_code();
even_more_code();
}
С текущим вариантом
void f( void )
{
if( x )
yyy();
more_code();
even_more_code();
}
23
24.
Оператор условия if-elseОбщая форма оператора if следующая
if ( выражение ) оператор;
else оператор;
Лестница if-else-if
if ( выражение ) оператор;
else if ( выражение )оператор;
else if ( выражение )оператор;
else if ( выражение )оператор;
else if ( выражение )оператор;
else if ( выражение )оператор;
24
25.
Условные операторы выделяются абзацными отступамиПлохой вариант
if( by_land ) one() else two();
Хороший вариант
if( by_land )
one();
else
two();
Исключение
if( by_land )
{
one();
}
else if( by_sea )
{
two();
}
else if( by_air )
{
three();
}
25
26.
Оператор выбора switchОбщая форма оператора switch следующая
switch(выражение)
{
case константа_1:
оператор;
break;
case константа_2:
оператор;
break;
case константа_3:
оператор;
break;
…………………………………………………………………………………
default:
оператор;
break;
}
26
27.
Примерswitch(menu)
{
case fileOpen:
fileOpen();
break;
case fileSave:
fileSave();
break;
case ExitProgram:
;
default:
ExitProgram();
break;
}
27
28.
ФункцииФункция должна делать только одно дело
Функция должна вызываться
более одного раза, но…
Код, используемый более одного раза,
должен быть помещен в функцию
28
29.
Выражения и операторы29
30.
Записывайте выражения в естественной формеНеправильно
if (!(block_id < actblks) || !(block_id >= unblocks))
Правильно
if ((block_id >= actblks) || (block_id < unblocks))
Используйте скобки во избежание двусмысленности
Менее читаемое выражение
1еар_уеаг =у%4==0&&у% 100 != 0 || у % 400 == 0;
Более читаемое выражение
1еар_уеаг = ((у % 4 == 0) && (у % 100 1=0)) || (у % 400 == 0);
30
31.
Выражайтесь как можно понятнееУчитывайте возможные побочные эффекты
Менее очевидное выражение
Менее очевидное выражение
str[i++] = str[i++] = ' ';
array[i++] = i;
Более очевидноее выражение
Более очевидноее выражение
str[i++] = ' ';
str[i++] = ' ;
array[i] = i;
i++;
31
32.
Общие пожелания32
33.
Разбивайтеразмера
сложные
проблемы
на
задачи
меньшего
Изменяя код прежде всего, не навреди
Пустые потери времени
Читайте чужой код
33
34.
Избегайте дублирования усилийНеправильно
if( strcmp(a, b) < 0 )
{
}
else if( strcmp(a, b) > 0 )
{
}
else if( strcmp(a, b) == 0 )
{
}
Правильно
int cmp = strcmp(a, b);
if( cmp < 0 )
{
}
else if( cmp > 0 )
{
}
else // остается случай cmp == 0
{
}
34
35.
Рассчитывайте на невозможноеf( int i )
// переменная i должна иметь значение 1 или 2.
{
switch( i )
{
case 1: сделать_нечто();
break;
case 2: сделать_нечто_другое();
break;
default:
fprintf(stderr, "Внутренняя ошибка в f(): неверное
значение i (%d)", i );
exit( -1 );
}
}
35
36.
Помещайте код, динамически распределяющий иосвобождающий память, в одном и том же месте
void user( void )
{
p = malloc( size );
producer( p );
consumer( p );
free( p );
}
// пользователь
// изготовитель
// потребитель
Разбивайте сложные выражения на части
Неочевидное выражение
*х += (*xp=(2*k < (n-m) ? с[к+1] : d[k--]));
Очевидное выражение
if (2*k < n-m)
*xр = c[k+1];
else
*хр = d[k--];
*х += *хр;
36