Технология разработки программного обеспечения Форматирование и стиль Технология разработки программного обеспечения Список литературы • • • • Макдоннелл. С. Совершенный код. Мастер-класс / Пер. с англ. – М.: Издательско-торговый дом «Русская редакция»; Спб. : Питер, 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. Шапка с комментарием, описывающая содержимое файла с классом; Данные класса; Открытые методы; Защищенные методы; Закрытые методы. Если файл содержит более одного класса, четко определяйте границы каждого класса Технология разработки программного обеспечения Организация файлов и программ • Помещайте каждый класс в отдельный файл; • Называйте файл в соответствии с именем класса; • Четко разделяйте методы внутри файла; • Упорядочивайте методы по алфавиту