Заметка скорее лирическая, чем техническая. Несколько месяцев назад довольно неожиданно начал сбоить код двухлетней давности. Сначала занимался поиском ошибки изредка, но, когда исправление уже стало необходимым, плотно занялся, и просидел почти неделю. После тестирования было найдено “проблемное” место, где изменялись свойства нескольких объектов, а те, в некоторых случаях, могли изменить общий объект, но только один раз. Свойство общего объекта описано стандартным способом (проверка корректности и сохранение значения), плюс внешний флажок одноразового выполнения.
Т.к. объекты нетривиальные, то отладчиком Visual Studio 2010 момент появления неправильного состояния объектов локализовать не удавалось. Как положено опытному разработчику, полез в анализ многопотоковости, выяснения, какой код и каким образом может влиять (так уходит время). После некоторой отладки, все-таки стало ясно, что ошибка возникает только при совпадении нового и старого значения свойства. Если же значения разные, то все нормально. Этот факт сузил поиск до внимательного анализа всех “!=”. А теперь достаточно внимательно посмотреть на код “стандартного” свойства (на C#):
class Foo
{
/* ... */
/// значение свойства
private object m_property = null;
public object Property
{
get
{
/// некоторые проверки и
/// дополнительные манипуляции
return this.m_property;
}
set
{
/// избегаем ненужной работы (Equals не нужен :))
if( this.m_property == value )
return;
/// проверка корректности значения
if( !this.Suitable( value ) )
return;
/// дополнительные манипуляции
/// ....
this.m_property = value;
/// дополнительные манипуляции
/// ....
}
}
/* ... */
}
Далее, понятно, исправляем проверку равности значений. Ура: ошибка найдена и исправлена!
Какие выводы можно сделать из этой ситуации?
1. Штампы поведения – страшная штука. Они настолько въедаются в нашу жизнь и деятельность, что их даже не замечаешь. Смотришь – и не видишь. Потому что “так” а-приори “правильно” (есть хорошая книга на эту тему: Роберт Чалдини “Психология влияния”).
2. 99% ошибок программного кода – очень простые. И только, если очень повезет, можно натолкнуться на действительно интересную и сложную ошибку. Поэтому надо сначала искать что-то очевидно-простое: некорректная проверка входа/выхода из конструкции, не тем значением инициализирована переменная, повторное изменение переменной.
Желаю успехов коллегам в отладке программного кода!
1. Все используемые IP-адреса, имена серверов, компьютеров, доменов, пользователей, являются фиктивными и используются исключительно в демонстрационных целях.
2. Информация приводится «AS IS».