ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C Часть 1

Ортогональное программирование

Ортогональность очень важна, если вы хотите создавать системы, которые легко поддаются проектированию, сборке, тестированию и расширению. Однако этому принципу редко обучают непосредственно. Часто он является лишь скрытым достоинством других разнообразных методик, которые вы изучаете. Это неправильно. Как только вы научитесь непосредственно применять принцип ортогональности, вы сразу заметите, что улучшилось качество создаваемых вами систем.

Для начала вспомним, что такое ортогональность. Две линии являются ортогональными, если они пересекаются под прямым углом, например оси координат на графике.

В терминах векторной алгебры две такие линии являются независимыми. Если двигаться в доль одной из линий, то проекция движущейся точки на другую линию не меняется.

Этот термин был введет в информатике для обозначения некой разновидности независимости или несвязанности. Два или более объекта ортогональны, если изменения, вносимые в один из них, не влияют на любой другой. В грамотно спроектированной системе программа базы данных будет ортогональной к интерфейсу пользователя: вы можете менять интерфейс пользователя без воздействия на базу данных и местами базы данных, не меняя интерфейса. Перед тем как рассмотреть преимущества ортогональнных систем, рассмотрим систему, которая не является ортогональной.

Итак, вы находитесь в вертолете на высоте тридцати метров. В этот момент пилот теряет сознание. Не велико горе, вы догадываетесь, что рычаг управления общим шагом несущего винта обеспечивает подъем машины, так что, если его слегка опустить, вертолет начнет плавно снижаться. Однако когда вы пытаетесь сделать это, то осознаете, что жизнь — не такая простая штука. Вертолет клюет носом, и вас начинает вращать по спирали влево. Внезапно вы понимаете, что управляете системой, в которой каждое воздействие имеет побочные эффекты. При нажатии на левый рычай вам придется сделать уравновешивающее движение назад правым рычагом и нажать на правую педаль. Но при этом каждое из этих действий вновь повлияет на все органы управления. Неожиданно вам приходится жонглировать невероятно сложной системой, в которой любое изменение влияет на все остальные управляющие воздействия. Вы испытываете феноменальную нагрузку: ваши руки и ноги находятся в постоянном движении, пытаясь уравновесить все взаимодействующие силы. Органы управления вертолетом определенно не являются ортогональными.

Как показывает пример с вертолетом, неортогональные системы сложнее изменять и контролировать. Если составляющие системы отличаются высокой степерью взаимозависимости, то невозможно устранить какую либо неисправность лишь на локальном уровне. С другой стороны, когда компоненты изолированы друг от друга, вы уверены, что можно изменить один из них, не заботясь об остальных. Пока внешние интерфейсы этого компонента остаются неизменными, вы можете быть спокойны, что не создадите проблем, которые распространятся по всей системе. При создании ортогональных систем у вас появляется два больших преимущества: увеличение производительности и снижение риска.

  • Изменения в системе локализуются, поэтому периоды разработки и тестирования сокращаются. Легче написать относительно небольшие, самодостаточные компоненты, чем один большой программынй модуль. Простые компоненты могут быть спроектированы, запрограммированы, протестированы и затем забыты — не нужно непрерывно менять существующий текст по мере того, как к нему добавляются новые фрагменты.
  • Ортогональный подход так же способствует многократному использованию компонентов. Если компоненты имеют определенную, четкую сферу ответственности, то они могут комбинироваться с новыми компонентами теми способами, которые не предпологались при их первоначальной реализации. Чем меньше связанность в ваших системах, тем легче их перенастроить и провести их обратное проектирование.
  • При комбинировании ортогональных компонентов происходит едва заметное увеличение производительности. Предположим, что один компонент способен осуществить М различных операций, а второй Н различных операций. Если эти объекты ортогональны и комбинируются, то в сумме они способны осуществить М*Н различных операций. Но если два компонента не являются ортогональными, то они будут перекрываться и результат их действия будет меньшим. Вы получаете большее количество функциональных возможностей в пересчете на единичное усилие, если комбинируете между собой ортогональные компоненты.
  • Ошибочные фрагменты текста программы изолируются. Если модуль содержит ошибку, то вероятность ее распространения на всю систему уменьшается. Кроме того, ошибочный фрагмент может быть извлечен и заменен новым (исправленным).
  • Конечный продукт (система) становится менее хрупким. Проблемы, появляющиеся при внесении небольших изменений и устранении недочетов на определенном участке, не проходят дальше этого участка.
  • Ортогональная система способстует повышению качества тестирования, поскольку облегчается проектирование и тестирование отдельных ее компонентов.

Хорошим примером неортогональной системы является наш первый парсер XML (Создаем свою читалку RSS). В этом примере мы получаем данные с сети, парсим и выводим в таблицу, и все это в одном классе. Хотя это небольшой учебный пример — в нем легко допустить ошибку. И чем незначительней эта ошибка, тем тяжелее ее найти. Не легче будет изменить эту систмму в случае изменения формата XML-файла.

Примером ортогональной системы является пример работы с моделью данных (Модель данных). В нем каждный функционал программы изолирован друг от друга. APIDownload выпоняет загрузку данных, TBXML — парсит XML-файлы, NewsItem выполняет функцию хранилища данных и наконец RootViewController, который осуществляет взаимодействие с пользователем. Проекцией каждого из этих классов на класс RootViewController является одна точка (функция), в которой вызывается объект этого класса или объект возвращает данные.

Comments are closed.