Wednesday, February 28, 2007

Объектно-ориентированному дизайну пора потесниться

Явно пришло время изменений. Предыдущий пост был про идею новой методологи разработки, а сегодня пришло время пересмотреть основы программирования и дизайна – OOP и OOD.

Большинство изменений происходят постепенно. За текучкой мы эти изменения не замечаем.

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

OOD сейчас не то, чтобы устарел (к процедурному стилю никто переходить не собирается), но многими принципами приходится поступаться ради удобства тестирования.

Основная проблема – область видимости. Закон инкапсуляции гласит, что все внутреннее устройство объекта никого не интересует и должно быть запрятано внутрь. Однако им приходится часто поступаться - ради возможности протестировать работу приватного метода, его приходится делать публичным. Т.е. теперь все внутренне устройство становится интересно тесту.

Самое неприятное - когда красиво спроектированную архитектуру приходится портить ради тестов. Какой выход из этой ситуации?

Для того, чтобы не ломать архитектуру UnitTest-ы класса можно размещеть в том же юните, что и сам класс. Но такое решение имеет свои недостатки – резкое увеличение объема кода одного юнита, сложность распараллеливания работ над реализацией класса и тестами к нему. Но основная проблема в том, что такое решение подходит только для UnitTest-ов. Для функциональны тестов, использующих объекты, расположенные в разных юнитах нужны дополнительные хитрости – например использование тестовых классов, отнаследованных от тестируемых классов, которые дают публичный доступ ко внутренним процедурам тестируемых классов. Но и тут могут возникнуть проблемы, особенно при сложных структурах наследования. Возможность использовать подобные ухищрения зависит от языка и от утилит тестирования.

Roy Osherove предлагает кардинально другое решение. Он предлагает поменять подход к дизайну и делать его не только объектно-ориентированным, но и тесто-ориентированным. Итак, на замену OOD идет OOTD (Object Oriented Testable Design).

На мой взгляд идея хорошая. Признание факта противоречия классических канонов OOD и тестирования – это хорошая причина уделить внимание проблемам тестирования еще на этапе проектирования.

Saturday, February 03, 2007

Post-Agile

Это должно было свершиться и это свершилось. В наше время быть "новой методологией" в течении 10 лет невозможно. 10 лет это слишком долго, чтобы называться "новым".

Итак, прощай Agile, здравствуй Post-Agile. Early adopters уже "наигрались" с Agile, перепробовали все предлагаемые практики и методологии в разных комбинациях, и теперь им стало скучно с Agile. На текущий момент определенной новой сформировавшейся методологии нет, но Google уже выдает более 10тыс. результатов по фразе "Post-Agile".

Flow – одна из методологий (или, скорее, идеологий), претендующих на звание Post-Agile.

Сейчас "на коне" web2.0 проекты и цикл их жизни очень сильно отличается от жизненного цикла локальных конечнопользовательских приложений и, еще больше, от жизненного цикла корпоративных систем. Основное отличие в том, что эти проекты не предлагают решения проблем или нужд пользователей, они развлекают, делают жизнь более приятной, красочной, интересной. Многие из них, безусловно, очень полезны, но не необходимы. А так как любая игрушка рано или поздно надоедает - надо пользователям постоянно давать что-то новое, чем-то их привлекать снова и снова, чтобы они не ушли на другой свежий ресурс. Именно на это нацелен Flow:

Картинка из поста "What comes after usability?"

Если честно, меня такая иерархия немного пугает, но, возможно, это именно то, что надо пользователям от игр и ресурсов общительно-развлекательного направления.