65
Качественный код Разработка бизнес приложений Лекция 8

разработка бизнес приложений (8)

Embed Size (px)

DESCRIPTION

Курс лекций для СТАНКИН. 2011 год.

Citation preview

Page 1: разработка бизнес приложений (8)

Качественный код

Разработка бизнес приложений Лекция 8

Page 2: разработка бизнес приложений (8)

Зачем нужен качественный код

• Обеспечение работы нескольких программистов– Читабельность, отладка– Совместное владение кодом

(взаимозаменяемость)• Стоимость поддержки– Меньше багов– Замена детальной документации

Page 3: разработка бизнес приложений (8)

Инженерные практики

• Стандарты кодирования– Стилистика кода и другие соглашения

• Рефакторинг• Тестирование– Автоматизированное и нет– Нагрузочное и оптимизация производительности

• Совместная разработка– Парное программирование– Code review

• Continuous integration / Source Control

Page 4: разработка бизнес приложений (8)

СТАНДАРТЫ КОДИРОВАНИЯ

Page 5: разработка бизнес приложений (8)

Общие

• Организация файлов и классов– Один класс – один фаил– Нормальная структура каталогов / пространств

имен (не больше 10 файлов в подкаталоге)• Группировка членов класса– Константы / статические поля– Поля– Конструкторы– Свойства– Методы (публичные, приватные, интерфейсы)

Page 6: разработка бизнес приложений (8)

Форматирование• Пробелы, блоки, индентация• Например:

if(showResult==true) { for(int i=0;i<10;i++) { // }} ----------------------------------------------------------------------------------------------------------------------if (showResult == true){ for (int i = 0; i < 10; i++) { // }}

Page 7: разработка бизнес приложений (8)

Именование

• PascalCasing / camelCasing (поля, лок. переменные)– HungarianNotation (i_Index) - зло

• ВЕРХНИЙ РЕГИСТР и _• Префиксы, суффиксы, аббревиатуры,

спецклассы (Exception)• Использование русского языка (unicode)

Page 8: разработка бизнес приложений (8)

Самодокументируемость!

• GetSomething – метод который вычисляет некое значение и возвращает его:

• GetRowCount – возвращает кол-во строчек• DoSomething, MakeSomething – метод

который просто что-то делает (часто Do можно и нужно опускать):

• DoDelete – удаляет• Delete – тоже удаляет

Page 9: разработка бизнес приложений (8)

Самодокументируемость!!

• Delete(User user) – очевидно, удаляет пользователя

• Delete(int userId) – тоже, почти очевидно, удаляет пользователя

• Delete(int i) – НЕ ПОНЯТНО, ЧТО ДЕЛАЕТ. ТАК НЕ НАДО ПИСАТЬ!

Page 10: разработка бизнес приложений (8)

Самодокументируемость!!!

• Можно написать так:

• DeleteUser(int id) – вполне понятно что делает.

• Конкретный стиль выбирайте сами, надо помнить, что есть еще название класса. Потому как метод Delete(int id) вполне понятен если он находится в классе User.

Page 11: разработка бизнес приложений (8)

Самодокументируемость!!!!

• Старайтесь писать код так, что бы его можно было читать как предложение.

• При прочтении кода вслух, должно создаваться впечатление что человек читает написанный алгоритм.

Page 12: разработка бизнес приложений (8)

Сложность кода

• Избегайте слишком больших файлов. Если в файле более 500 строк кода, подумайте о разделении класса на несколько классов, вынесенные в отдельные файлы.

• Избегайте слишком длинных методов – это приводит к дублированию кода.

• Не больше 30 строчек кода в каждом методе• Максимальная вложенная глубина

(if/case/циклы вложенные) – 5.

Page 13: разработка бизнес приложений (8)

Закон Деметры

• Метод f класса C должен ограничиваться вызовом методов следующих объектов:– C– объекты, созданные f– объекты – аргументы f– объекты – являющиеся состоянием C

• Позволяет достичь низкой связности кода

Page 14: разработка бизнес приложений (8)

Сложность кода

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

• Поддерживайте качество ООП абстракций (см. ранее)

Page 15: разработка бизнес приложений (8)

Обработка ошибок

• Используйте exceptions!• Fail fast: не глотайте то, что не можете

обработать– Имейте общее место обработки фатальных ошибок

– дружественный вывод пользователю и лог• Четко определите контракт и падайте если он

нарушен– Принимайте на вход как можно больше вариантов,

а на выход выдавайте как можно меньше

Page 16: разработка бизнес приложений (8)

Понятность имениХорошо: void SavePhoneNumber(string phoneNumber) { // Save the phone number. } Плохо: /// <summary>

/// This method will save the phone number. /// </summary> /// <param name="phoneNumber">Phone number</param>

void SaveData(string phoneNumber) { // Save the phone number. }

Page 17: разработка бизнес приложений (8)

Атомарность методовПлохо:void SaveAddressAndSendMail ( string address, string email ) {// Save the address….// Send an email…} Хорошо:void SaveAddress(string address) {} void SendEmail(string address, string email) {}

Page 18: разработка бизнес приложений (8)

Вариант

void SaveAddressAndSendMail ( string address, string email ){

SaveAddress(address); SendEmail(address, email);

}

Page 19: разработка бизнес приложений (8)

Переменные

• Объявляйте и инициализируйте переменные как можно ближе к месту их использования.

• Делайте время жизни переменной как можно короче.

• Не используйте одну и ту же переменную в разных целях.

Page 20: разработка бизнес приложений (8)

Магические константы

Плохо: string veryImportant = "VIP"; int start = 385170

Хорошо:public static readonly string VipString = "VIP";public static readonly string StartIndex = 385170; string veryImportant = VipString ;int start = StartIndex ;

Page 21: разработка бизнес приложений (8)

Любые другие договоренности

• К примеру, длинна строк кода (в зависимости от мониторов)

• Использование this• Специфические конструкции языка• Использование автоматизированных утилит

проверки во время билда (CI)– Stylecop, FX Cop, Simian, NDepend и другие

Page 22: разработка бизнес приложений (8)

Законченные switchvoid SendMail (string message, string mailType){ switch ( mailType ) { case "Html": // Do something, break; case "PlainText": // Do something break; default: // Do something break; }}------------------------------------------------------------------------------------------------------------ enum MailType { Html, PlainText, Attachment }

void SendMail (string message, MailType mailType) { switch ( mailType ) { case MailType.Html: // Do something break; case MailType.PlainText: // Do something break; default: // Do something break; } }

Page 23: разработка бизнес приложений (8)

Сложные логические условияПлохо:if ((document.AtEndOfStream) && (!inputError)) && ((MIN_LINES <= lineCount) && (lineCount <= MAX_LINES)) && (!ErrorProcessing()))// Do something Хорошо:var allDataRead = document.AtEndOfStream && !inputError;

var legalLineCount = MIN_LINES <= lineCount && lineCount <= MAX_LINES;

if (allDataRead && legalLineCount && !ErrorProcessing())// Do something

Page 24: разработка бизнес приложений (8)

РЕФАКТОРИНГИ

Page 25: разработка бизнес приложений (8)

Двойное отрицание

Page 26: разработка бизнес приложений (8)

Вложенные условия

Page 27: разработка бизнес приложений (8)

Объединение условий

Page 28: разработка бизнес приложений (8)

Поясняющая переменная

Page 29: разработка бизнес приложений (8)

Обращение проверки

Page 30: разработка бизнес приложений (8)

Разбить сложную проверку

Page 31: разработка бизнес приложений (8)

Вынесение повторяющего фрагмента if

Page 32: разработка бизнес приложений (8)

Внешний метод

Page 33: разработка бизнес приложений (8)

Явная проверка

Page 34: разработка бизнес приложений (8)

Убираем переменную

Page 35: разработка бизнес приложений (8)

Убираем метод

Page 36: разработка бизнес приложений (8)

Вводим константу

Page 37: разработка бизнес приложений (8)

Замена ловли исключения проверкой

Page 38: разработка бизнес приложений (8)

Замена кода возврата исключением

Page 39: разработка бизнес приложений (8)

Замена присваивания инициализацией

Page 40: разработка бизнес приложений (8)

Замена магического массива объектом

Page 41: разработка бизнес приложений (8)

Замена параметра явным методом

Page 42: разработка бизнес приложений (8)

Уберите присваивание параметрам

Page 43: разработка бизнес приложений (8)

Передайте весь объект

Page 44: разработка бизнес приложений (8)

Разбейте временную переменную

Page 45: разработка бизнес приложений (8)

Разбейте цикл

Page 46: разработка бизнес приложений (8)

Замените temp методом

Page 47: разработка бизнес приложений (8)

Замените static пер-ю параметром

Page 48: разработка бизнес приложений (8)

Замена параметра методом

Page 49: разработка бизнес приложений (8)

Замена тела метода (в итоге)

Page 50: разработка бизнес приложений (8)

Оптимизация производительности

• Только после измерения– Невозможно узнать что тормозит

• Никогда не нужно оптимизировать заранее– Невозможно угадать что тормозит– Хотя бывают редкие очевидные (с опытом)

случаи

Page 51: разработка бизнес приложений (8)

Ориентировочные времена• Вызов виртуального метода

– Миллион раз: 4 мс • Создание объекта

– Миллион штук: 9 мс• Случайное заполнение и сортировка List<int> на

миллион элементов– 20 + 80 мс

• Запрос в БД– ~3-30+ мс

• Запрос HTTP– ~~ 30 – 500+ мс

Page 52: разработка бизнес приложений (8)

Сложность алгоритмов и структуры данных

• O(n) – это было на матанализе– Кол-во элементарных операций

• O(n2) – начинаем волноваться– Но нужно понимать при каком n - в зависимости от

«элементарности» операции• Нормальная сортировка (quicksort) – O(n*logn)• HashTable: выбор по ключу - O(1), с хорошими хэшами• Есть другие варианты по всяким нюансам – память, те

или иные крайние случаи. Читаем по необходимости.

Page 53: разработка бизнес приложений (8)

ОРГАНИЗАЦИОННЫЕ ПРАКТИКИ

Page 54: разработка бизнес приложений (8)

Автоматизированное тестирование

• Unit тесты– На конкретные классы

• Integration тесты– На несколько систем вместе, иногда с БД

• Acceptance тесты– Понятные заказчику, в стиле спецификаций,

обычно на полноценно развернутой системе

• UI тесты• Нагрузочные тесты

Скорость выполнения

Ручной QA

Page 55: разработка бизнес приложений (8)

Подходы к написанию тестов

• Типы тестов:– Традиционные (black box): вход – действие –

выход.– BDD (white box): вход, конкретная

последовательность действий, выход• Для разделения зависимостей используются

test proxy – fake объекты:– Mock (отслеживают порядок, кол-во вызовов и

прочее). Нужно для BDD.– Stub (все остальное)

Page 56: разработка бизнес приложений (8)

Совместная разработка

• Pair programming (см. XP)– Один кодит– Другой выдумывает и сморит за ошибками– Потом меняются (обычно, по 2 часа)– ~15-25% дороже, на 45% быстрее и на 60%

меньше ошибок• CodeReview (постоянный)– И более формальные инспекции кода

Page 57: разработка бизнес приложений (8)

Continuous integration

• Что-то должно постоянно билдить код и выполнять все тесты и проверки (каждый checkin)– CI Server (CruiseControl, TeamCity)

• Идеал – релиз в любой момент, причем автоматический

Page 58: разработка бизнес приложений (8)

Сорс контрол

• Он нужен (GIT, Mercurial, SVN)• Бранчи – зло. Постарайтесь обойтись одним (trunk) и

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

следствие более глобальных, но)– База данных– Большие рефакторинги– Разные команды– Ручной QA– Официальные релизы– …

Page 59: разработка бизнес приложений (8)

И получается

http://www.infoq.com/articles/agile-version-control#q5

Page 60: разработка бизнес приложений (8)

С т.ч. релизов

http://www.infoq.com/articles/agile-version-control#q5

Page 61: разработка бизнес приложений (8)

Ресурсы

• Совершенный код• Чистый код. Создание, анализ и

рефакторинг• Непрерывное развертывание ПО. Авто

матизация процессов сборки, тестирования и внедрения новых версий программ

• eXtreme Programming• TDD

Page 62: разработка бизнес приложений (8)

Темы для докладов

• AOP• Kanban / Lean (Карпов)• SCRUM: Team / ScrumMaster – подробнее про процесс (DS,

Retro, SprintPlan, Demo…) (Большаков)

• NoSql БД• Реализация ООП в Javascript (прототипы)

Page 63: разработка бизнес приложений (8)

Объявления

• Лекции 15го декабря не будет, осталось 3 лекции для докладов!

• Кто ничего не делал – на экзамене 5 не получит никак.

• Отчет по лабам

Page 64: разработка бизнес приложений (8)

Лабы

• Обработка открытых данных– http://minenergo.gov.ru/activity/statistic/,http://www.fms.gov.ru/about/ofstat/,

http://www.federalspace.ru/main.php?id=10, http://ivan.begtin.name/2011/10/02/gosuslugijson/

• Индивидуальное задание (для тех, у кого уже есть что показать)

• Нужно:– Или наличие БД– Или наличие веб интерфейса– Отчет по лабам

• Стажировка (Тестер / Разработчик)– Нужно знание: C#, MS MVC, MS SQL Server

Page 65: разработка бизнес приложений (8)

Использованные материалы

• Никита Филлипов (www.scrumtrek.ru), Сергей Дмитриев (www.agilecoach.ru)– Курс SCPO Msk (31.08.11)

• Бочков Илья (Архитектура корпоративных приложений, МИФИ)

• MIT: electrical-engineering-and-computer-science– http://ocw.mit.edu/courses/#

electrical-engineering-and-computer-science• http://www.refactoring.com (Фаулер)