Лето...

12 июл. 2010 г. | | |

Лето.... Время отпусков, жары и комаров :) Время лежать на золотом песке под солнышком и ни о чем не думать... Ленивое время, вобщем...
На улице жара, делать ничего не хочется, мысли бессвязно и очень вяло ползают в голове... Работа не идет, вспоминается поговорка "Если хочешь поработать – ляг, поспи и все пройдет". Даже кофе не помогает!
Надо как-то себя мотивировать, а ни один способ мотивации не срабатывает...
Нет, один срабатывает, но эффективность все равно не та: через силу начинаю делать и по чуть-чуть увлекаюсь, и пошел процесс.... Последнее, что пришлось делать через принуждение - переписывать код за коллегой... Сначала задание было "чуток дописать", но, увидев "чудеса чудесные, прелести прелестные" пришлось переписать добротный кусок кода, а занятие это не из приятнейших... Само по себе редактирование, правка чужого кода - та еще задача. А если код написан из рук вон плохо, с огромным количеством "code smells" ;( ... Ничего, бывает, пережили...
Главное, что до пятницы осталось совсем немного - еще пятьдесят три минуты рабочего времени понедельника и три дня!

Пример рефакторинга кода на C#

26 июн. 2010 г. | | |

Что такое рефакторинг? М. Фаулер дает следующее определение рефакторинга ("Рефакторинг: улучшение существующего кода"):
Рефакторинг (англ. refactoring) — процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий целью облегчить понимание её работы. В основе рефакторинга лежит последовательность небольших эквивалентных (то есть сохраняющих поведение) преобразований.
Давайте рассмотрим на примере.

10 поговорок, которые должен знать каждый программист

16 июн. 2010 г. | | |

Перевод поста "10 Programming Proverbs Every Developer Should Know" Кевина Панга. Оригинал тут

Поговорки выражают общеизвестные истины или жизненные уроки в короткой и запоминающейся форме. Я считаю, что это отличный способ вести дела - и в личной жизни, и на работе. Поэтому я выделил 10 поговорок, которые каждый программист должен иметь в своем арсенале.

Топ 10 вещей, которые бесят программистов

15 июн. 2010 г. | | |

Перевод поста "Top 10 Things That Annoy Programmers" Кевина Панга. Оригинал тут

Библиотека

31 мая 2010 г. | | |

Д. Нильссон. Применение DDD и шаблонов проектирования (скачать)
Книга о разработке корпоративных программных приложений в среде .NET с применением шаблонов проектирования. В ней описаны: как строится четкая и удобная, с точки зрения сохраняемости, модель предметной области (Domain Model), рассматриваются вопросы проектирования, ориентированного на предметную область (DDD, или Domain-Driven Design), разработки посредством тестирования (TDD, или Test-Driven Development), объектно-реляционное преобразование, т.е. методы, которые относятся к ключевым технологиям разработки программного обеспечения. По мере развития и усложнения технологии все большее значение приобретают вопросы правильного применения методов проектирования, которые налаживают взаимосвязь между пользователями и разработчиками, предметной областью и программным обеспечением, логикой и хранением информации, проектировщиками баз данных и программистами.
Большинство примеров кода, в книге, представлено на языке C#, но материал окажется полезным и пользователей платформы Java.
Книга адресована опытным разработчикам архитектуры и прикладного программного обеспечения уровня предприятий, в том числе и в среде .NET.
Р. Мартин, Д. Ньюкирк. Быстрая (гибкая) разработка программ: принципы, шаблоны, практика (скачать)
Книга рассказывает о различных методиках быстрого (и даже экстремального) программирования. Изложение начинается с обзора основных понятий экстремального программирования и завершается готовыми программами, применяемыми на практике. В каждой главе приведены примеры кода на языках программирования Java и C++. Книга будет полезной руководителям групп программистов, нацеленных на быструю разработку коммерческих программных проектов, характеризующихся высоким уровнем качества и минимальной себестоимостью.

Комментарии в коде

30 мая 2010 г. | | |

Все мы не раз слышали, что код нужно комментировать, чтобы в нём потом можно было разобраться. Неопытные программисты часто возражают : "Это мой код, и я знаю, что он делает, и не забуду даже через полгода, что значит переменная k в выражении empS += k*arr[i] + bon[i]!" И при этом совершенно не учитывается, что кроме них, этот код могут править другие программисты - те бедолаги, которым придется сопровождать этот код. Но, опять же, комментарии, написанные, лишь бы написать, чтоб не цеплялись, - это еще хуже, чем отсутствие комментариев.

При плохом выполнении комментирование является пустой тратой времени и иногда причиняет вред.
С.Макконнелл

Например, в следующем коде комментарии совершенно бесполезны, потому что совершенно ничего не говорят:

int k = getKoeff(m); /*инициализируем переменную k значением, возвращаемым методом getKoeff */
double empS = 0.0; //инициализируем переменную empS нулем
for(int i=0; i<getWNub(m); i++)
{
empS +=k*arr[i] + bon[i]; //вычисляем сумму в цикле
}

Раз уж зашел разговор о полезности комментариев, то давайте определим цели - для чего вообще нужны комментарии в коде? Комментарии должны давать представление о том, что делает данный код, должны помогать читать его, так? На мой взгляд, самый лучший комментарий к коду - сам код.
Хороший код сам является самой лучшей документацией. Если код настолько плох, что требует объемных комментариев, попытайтесь сначала улучшить его.
С.Макконнелл
Я не призываю отказаться от комментариев в коде, я призываю к написанию ясного кода, который легко понять и модифицировать даже по прошествии длительного периода времени.
Что в моем понимании "ясный код"? Это, конечно же, самодокументирующийся код. Например, предыдущий кусок кода можно переписать так:

int koefficient = getSalaryKoefficient(monthNumber);
double employeeSalary = 0.0;
int workingDaysInCurrentMonth = getWorkingDaysNumber(monthNumber);
for(int dayNubmer=0; dayNumber<workingDaysInCurrentMonth; dayNubmer++)
{
employeeSalary +=koefficient*workingHours[dayNubmer] + dayBonus[dayNubmer];
}

Что изменилось в коде? Всего лишь имена переменных и методов, но этот код, в отличие от первого его варианта, понятен без комментариев. Имена переменных и методов говорят сами за себя, им не нужны никакие комментарии. Такими же должны делать имена классов, интерфейсов, констант, перечислений, элементов перечислений и т.д. О том, насколько важно правильно выбирать имена и как это делать, можно почитать в книге "Совершенный код" С. Макконнелла.
Почувствовав потребность написать комментарий, попробуйте сначала изменить структуру кода так, чтобы любые комментарии стали излишними...
М.Фаулер
Как менять структуру кода и когда это нужно делать, можно почитать в книге Мартина Фаулера "Рефакторинг. Улучшение существующего кода". Но, конечно же, есть несколько случаев, когда следовать вышеприведенной цитате не нужно. Во-первых, когда код делает не очевидные вещи, например (пример взят из книги "Совершенный код" С.Макконелла):

for(element = 0; element<elementCount; element++)
{
/*Для деления на 2 используется операция сдвига вправо. Это сокращает время выполнения цикла на 75% */
elementList[element] = elementList[element] >>1;
}

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

//Цвет фона по умолчанию - белый
itemBgColor = Color.FromAGB(255,255,255);

Этот код лучше будет даже переписать следующим образом:

const Color DEFAULT_BG_COLOR = Color.FromAGB(255,255,255);
...
itemBgColor = DEFAULT_BG_COLOR;

Кроме того, следует комментировать использование недокументированных возможностей или исправление обнаруженных ошибок - ведь в следующих версиях системы этих возможностей может и не быть, а ошибки могут быть исправлены :)
Полезным может оказаться документирование ограничений, если они не заданы константами с говорящими именами, а используются в коде как есть - в виде чисел. Но с таким настоятельно советую бороться :)
В своей практике кроме всего выше перечисленного я предпочитаю давать краткое описание методу перед началом его кодирования, при этом использую очень замечательную возможность документирования кода в Visual Studio. Это выглядит так:

/// <summary>
/// Возвращает следующий по номеру ваучер по отношению к номеру текущего ваучера
/// </summary>
/// <returns>VoucherItem</returns>
public VoucherItem GetNextVoucherItem()
{
return VoucherRepository.GetNextVoucher(this.VoucherNumber);
}

Клиентский код, использующий методы моего класса, получает возможность использовать IntelliSense, что очень удобно.
И напоследок приведу такую цитату:
Пишите код, исходя из того, что все программисты, которые будут сопровождать вашу программу, - склонные к насилию психопаты, знающие, где вы живёте.
С.Макконнелл