Слайд 1 - GitLab

advertisement
Технология разработки программного обеспечения
Форматирование и стиль
Технология разработки программного обеспечения
Список литературы
•
•
•
•
Макдоннелл. С. Совершенный код. Мастер-класс / Пер. с англ. – М.:
Издательско-торговый дом «Русская редакция»; Спб. : Питер, 2005 – 896
стр.
Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приемы объектноориентированного проектирования. Паттерны проектирования. – Спб:
Питер, 2004. – 366с.
Фаулер М. Рефакторинг – улучшение существующего кода. – Пер. с
англ. – Спб: Символ-плюс, 2005. – 432с.
Файлер М. Архитектура корпоративных программных приложений. : Пер.
с англ. – М. : Издательский дом «Вильямс», 2004. – 544с.
Технология разработки программного обеспечения
Наиболее важное в форматировании
От методик хорошего стиля и форматирования зависит насколько легко вы
сможете понять, пересмотреть и исправить свой код спустя несколько
месяцев после его создания. От них также зависит, насколько легко другие
программисты смогут его прочесть, понять и изменить в ваше отсутствие.
Технология разработки программного обеспечения
Интерпретация программы человеком и компьютером
Любой человек может написать код, понятный компьютеру.
Хорошие программисты пишут код, понятный людям.
Мартин Фаулер (Martin Fowler)
/* Используем способ сортировки методом вставок для сортировки массива «data» в
возрастающем порядке. Этот метод предполагает, что [ firstElement ] не является
первым элементом данных и элемент data[ firstElement-1 ] достижим. */ public void
InsertionSort( int[] data, int firstElement, int lastElement ) { /* Заменяем
элемент, расположенный на нижней границе интервала, элементом, который гаранти
рованно будет первым в сортированном списке. */ int lowerBoundary = data [
firstElement-1 ]; data[ firstElement-1 ] = S0RT_MIN; /* Элементы в позициях от
firstElement до sortBoundary-1 всегда сортированы. При каждом проходе цикла sortBoundary увеличивается, и элемент, соответствующий новому sortBoundary, возможно,
будет неправильно отсортирован, поэтому он вставляется в надлежащую позицию
массива где-то между firstElement и sortBoundary. */ for ( int sortBoundary =
firstElement+1; sortBoundary <= lastElement; sortBoundary++ ) { int insertVal =
data[ sortBoundary ]; int insertPos = sortBoundary; while ( insertVal < data[
insertPos-1 ] ) { data[ insertPos ] = data[ insertPos-1 ]; insertPos =
insertPos-1; } data[ insertPos ] = insertVal; } /* Возвращаем исходное значение
элементу, расположенному на нижней границе интервала */ data[ firstElement-1 ] =
lowerBoundary; }
Технология разработки программного обеспечения
Интерпретация программы человеком и компьютером
Форматирование — это ключ к структуре программы.
Компьютеру важна исключительно информация о скобках или операторах
begin и end, а читатель-человек склонен делать выводы из визуального
представления кода.
// меняем местами правые и левые элементы во всем массиве
for (i = 0; i < MAX_ELEMENTS; i++)
leftElement = left[ i ];
left[ i ] = right[ i ];
right[ i ] = leftElement;
х = 3 + 4 * 2 + 7;
Технология разработки программного обеспечения
Цели хорошего форматирования
•
•
•
•
Точно представлять логическую структуру кода
Единообразно показывать логическую структуру кода
Улучшать читабельность
Выдерживать процедуру исправления
Технология разработки программного обеспечения
Способы форматирования - неотображаемые символы
// Пример кода с плохой читабельностью
public decimal Calculate(int parValue)
{
decimal retVal=0.0m;
if(parValue>0)retVal=parValue+25;
if(parValue<0)retVal=parValue-25;
return retVal;
}
// Пример кода с хорошей читабельностью
public decimal Calculate(int parValue)
{
decimal retVal = 0.0m;
if ( parValue > 0)
retVal = parValue + 25;
if( parValue < 0)
retVal = parValue - 25;
return retVal;
}
Технология разработки программного обеспечения
Способы форматирования - группировка
for (int i = 0; i < TestCount; i++)
{
locTransaction = locConnection.BeginTransaction();
OleDbCommand locCommand = new OleDbCommand();
string locStrSQL = @"
INSERT INTO complex_table (f_code, f_title, f_amount, f_date)
VALUES(?, ?, ?, ?)";
OleDbParameter locCodeParameter = locCommand.Parameters.Add("f_code"
,OleDbType.Char);
locCodeParameter.Value = string.Format("{0}", i);
OleDbParameter locTitleParameter = locCommand.Parameters.Add("f_title“
, OleDbType.VarChar);
locTitleParameter.Value = string.Format("Заголовок №{0}", i);
OleDbParameter locAmountParameter = locCommand.Parameters.Add("f_amount“
, OleDbType.Currency);
locAmountParameter.Value = (decimal)i;
Технология разработки программного обеспечения
Способы форматирования – пустые строки
Оптимально число пустых строк в программе составляет от 8% до 16%.
Если оно больше 16%, то время на отладку заметно увеличивается
int locSum = 0;
for (int i = 0; i < 10; i++)
locSum += i;
Console.WriteLine(“Sum: {0}”, locSum);
// Определение текущей даты
DateTime locTime = DateTime.Now;
Console.WriteLine(“Текущее время {0}”, locTime);
Технология разработки программного обеспечения
Способы форматирования – отступы
Отступы влияют на способность программиста понимать код. В тесте
испытуемые показали результат на 20%-30% лучше, когда программы
использовали схему отступов из 2-4х пробелов (1-2 знака табуляции)
/// <summary>
/// Базовый класс для тестов
/// </summary>
public abstract class BaseTest
{
/// <summary>
/// Событие о том, что тест закончен
/// </summary>
public event EventHandler TestCompleted = null;
…
#region Работа с событиями
/// <summary>
/// Признак того, что тест завершен
/// </summary>
protected void CallCompleted()
{
if (TestCompleted != null)
TestCompleted(this, new EventArgs());
}
Технология разработки программного обеспечения
Способы форматирования – скобки
Необходимо использовать скобки гораздо чаще,
чем это кажется необходимым.
12 + 4 % 3 * 7 / 8
a + b > 17 or c – d == 0 and !x
Технология разработки программного обеспечения
Стили программирования – явные блоки
Блок – группа операторов, расположенная под управляющими выражениями
Блок называется явным, если у управляющей структуры есть свой терминатор
‘ пример на Visual Basic
If <условное выражение> Then
<операторы>
End If
Технология разработки программного обеспечения
Стили программирования – эмуляция явных блоков
Хорошим подходом в языках, не имеющих явных блоков, будет рассмотрение
ключевых слов begin и end (или символов { и }) в виде расширений
управляющих структур, с которыми они используются. Данный подход
подразумевает, что явный блок должен начинаться в первом операторе блока
и заканчиваться после последнего оператора.
if (<условие>) {
<различные действия>
}
Технология разработки программного обеспечения
Стили программирования – использование пар begin-end для
обозначения границ блоков
Данный подход рассматривает begin и end как операторы, следующие за
управляющей структурой, а не как фрагменты, являющиеся ее частью
if (<условие>)
{
<различные действия>
}
Технология разработки программного обеспечения
Стили программирования – форматирование в конце строки
Отступы в конце строки служат для выравнивания блока относительно
ключевого слова, с которого он начинается, выравнивания следующих
параметров метода под первым параметром, размещения вариантов в
операторе case и подобных случаев
if (<условие>) {
<различные действия>
}
Технология разработки программного обеспечения
Форматирование управляющих структур
Форматирование некоторых программных элементов часто является только
эстетическим вопросом. Однако форматирование управляющих структур
влияет на удобство чтения и понимания и поэтому имеет практическое
значение.
Избегайте отсутствия отступов в парах begin-end
// логическая структура кода плохо раскрыта
for ( int i = 0; i < 10; i++ )
{
<действия>
}
// логическая структура кода раскрыта хорошо
for ( int i = 0; i < 10; i++ )
{
<действия>
}
Технология разработки программного обеспечения
Форматирование управляющих структур
Избегайте двойных отступов в парах begin-end
for ( int i = 0; i < 10; i++ )
{
<действия>
}
Исследования показали, что с точки зрения понимания программы,
использующие одинарные и двойные отступы, не отличаются друг от друга
Технология разработки программного обеспечения
Форматирование управляющих структур
Используйте пустые строки между абзацами
progress.min = 0;
progress.max = 100;
progress.step = 1;
form.title = ‘Загрузка данных’;
form.width = 100;
form.height = 50;
progress.min = 0;
progress.max = 100;
progress.step = 1;
form.title = ‘Загрузка данных’;
form.width = 100;
form.height = 50;
Технология разработки программного обеспечения
Форматирование управляющих структур
Форматируйте блоки из одного оператора единообразно
if (<выражение>)
<один оператор>;
if (<выражение>){
<один оператор>;
}
if (<выражение>)
{
<один оператор>;
}
if (<выражение>) <один оператор>;
Технология разработки программного обеспечения
Форматирование управляющих структур
В сложных выражениях размещайте каждое условие
на отдельной строке
if (((‘0‘ >= locChar) && (‘9‘ <= locChar)) || ((‘a‘ >=
locChar) && (‘z‘ <= locChar)) || ((‘A‘ >= locChar) && (‘Z‘
<= locChar)))
...
if ( ( (‘0‘ >= locChar) && (‘9‘ <= locChar) ) ||
( (‘a‘ >= locChar) && (‘z‘ <= locChar) ) ||
( (‘A‘ >= locChar) && (‘Z‘ <= locChar) ) )
...
Технология разработки программного обеспечения
Форматирование управляющих структур
Избегайте операторов goto
Технология разработки программного обеспечения
Форматирование отдельных операторов – использование
пробелов для ясности
for(int i=0;i<100;i++)Console.Write(i);
Данный пример так же читабелен как Примервыводазначенияцикла.
for ( int i = 0; i < 100; i++ )
Console.Write( i );
if((a<b)&&(c<d))
if ( ( a < b ) && ( c < d ) )
globalIndex[mas[i]+idx[j,k]];
globalIndex[ mas[ i ] + idx[ j, k ] ];
Технология разработки программного обеспечения
Форматирование строк с продолжением
Сделайте так, чтобы незавершенность выражений была очевидна. Самый
простой пример – сделать так, чтобы часть выражения на первой строке
была вопиющее некорректной, если рассматривать ее отдельно.
if ( a > b) && ( c == d ) &&
( ( I == j ) || ( k < l ) )
Располагайте сильно связанные элементы вместе
locValue = CalculateAverageValue( locValues ) + FindMaxValue(
locValues );
При переносе строк в вызове метода используйте отступ
стандартного размера
DrawString(‘Введите количество продукции’, locRectangle.x,
locRectangle.y, locRectangle.width, locRectangle.height,
locFont);
Технология разработки программного обеспечения
Форматирование строк с продолжением
Упростите поиск конца строк с продолжением
DrawString(‘Введите количество продукции’,
locRectangle.x,
locRectangle.y,
locRectangle.width,
locRectangle.height,
locFont
);
При переносе строк в управляющем выражении и выражениях присваивания
делайте отступ стандартного размера
Не выравнивайте правые части выражений присваивания
locAverageSum = ( locValue1 + locValue2 ) / 2;
locMultiply
= locValue1 * locValue2;
locSum
= locValue1 + locValue2;
Технология разработки программного обеспечения
Размещение одного оператора на строке
• Размещение каждого оператора на отдельной строке дает точное
представление о сложности программы
• Размещение нескольких операторов на одной строке не помогает
современным компиляторам в оптимизации
• Если операторы расположены на отдельных строках, чтение кода
происходит сверху вниз, а не сверху вниз и слева направо
• При размещении операторов на отдельных строках легко найти
синтаксические ошибки, если компилятор сообщает только номера строк,
где они произошли
• При размещении операторов на отдельных строках легко выполнять
пошаговую отладку кода, используя построчные отладчики
• Когда строка содержит только один оператор, его легко редактировать —
можно удалить или временно закомментировать всю строку
Технология разработки программного обеспечения
Размещение объявлений данных
• Располагайте каждое объявление в отдельной строке
int locItemCount, locUsersSum, locMaxValue; decimal
locAmount, locBookPrice, locAccountRest; ArrayList locItems,
locCols, locDeletedItems;
int locItemCount;
int locUsersSum;
int locMaxValue;
decimal locAmount;
decimal locBookPrice;
decimal locAccountRest;
ArrayList locItems;
ArrayList locCols;
ArrayList locDeletedItems;
• Объявляйте переменные рядом с местом их первого использования
• Разумно упорядочивайте объявления
Технология разработки программного обеспечения
Размещение комментариев
• Делайте в комментарии такой же отступ, как и в соответствующем ему
коде;
• Отделяйте каждый комментарий хотя бы одной пустой строкой
While ( !m_Complete )
{
// Увеличиваем счетчик
Lock( m_Counter)
{
m_Counter++;
}
// Засыпаем на одну секунду
CurrentThread.Sleep(1000);
}
Технология разработки программного обеспечения
Размещение заголовков методов
• Используйте пустые строки для разделения составных частей метода.
Желательно оставлять пустые строки между заголовком метода,
объявлениями данных и именованных констант (если они есть) и телом
метода;
• Используйте стандартный отступ для аргументов метода; Для
форматирования заголовка метода можно задействовать те же, что и
раньше, варианты форматирования
public void GetAccountData(
int parAccountID,
out string parAccountCode,
out decimal parAccountRest
)
Технология разработки программного обеспечения
Форматирование классов - интерфейс
Соглашение о размещении интерфейсов классов предусматривает
перечисление членов класса в следующем порядке:
1. Шапка с комментарием, содержащая описание класса и любые
примечания, касающиеся общих вопросов его использования;
2. Конструкторы и деструкторы;
3. Открытые методы;
4. Защищенные методы;
1. Закрытые методы и члены – данные
Технология разработки программного обеспечения
Форматирование классов - реализация
Реализации классов, в общем случае, могут размещаться в следующем
порядке:
1.
2.
3.
4.
5.
Шапка с комментарием, описывающая содержимое файла с классом;
Данные класса;
Открытые методы;
Защищенные методы;
Закрытые методы.
Если файл содержит более одного класса, четко определяйте границы
каждого класса
Технология разработки программного обеспечения
Организация файлов и программ
• Помещайте каждый класс в отдельный файл;
• Называйте файл в соответствии с именем класса;
• Четко разделяйте методы внутри файла;
• Упорядочивайте методы по алфавиту
Download