Чтобы было яснее

Оглавление

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

Атрибуты и отображения

Допустим, нам нужна структура данных для описания человека. Мы можем реализовать ее, используя некоторые поля, как показано на рисунке 1. Разумеется, для этого нужно определить ряд переменных в классе Person. С другой стороны, язык Ruby, как и многие другие современные языки программирования, поддерживает отображения (известные также под именем ассоциативных массивов или хэш-таблиц). Мы могли бы определить структуру данных для класса Person, воспользовавшись отображением, как показано на рисунке 2 (это будет работать медленнее, но предположим, что производительность этой части кода не так уж важна).

Использование отображения - весьма привлекательный способ, так как он позволяет менять набор полей, сохраняемых в классе Person, не изменяя сам класс. Если вы захотите добавить сюда номер телефона, вам не придется менять для этого начальный код.

Несмотря на это, использование отображения не упрощает процесс модификации кода. Если я попытаюсь использовать эту структуру данных, я не смогу сразу определить, что в ней находится. Чтобы узнать, что некто использует ее для хранения количества материально зависимых лиц (numberOfDependents), мне потребуется прочесать всю систему. Если бы соответствующая переменная была определена в классе, то мне было бы достаточно одного взгляда на код класса, чтобы выяснить, какие поля он поддерживает.

Основной принцип ясного кода в том, что его проще понимать (и, как следствие, проще модифицировать). Как говорит Кент Бек, такой код представляет собой ясное выражение изначальных намерений.

Наш пример с отображением очень невелик, однако вышеописанный принцип остается верным при проектировании программных систем любого масштаба.

Рисунок 1. Использование полей класса (язык Ruby)

class Person
attr_accessor :lastName,:firstName,:numberOfDependents
end
def frag1
martin =Person.new
martin.firstName =“Martin ”
martin.lastName =“Fowler ”
martin.numberOfDependents =1
print (martin.firstName,““,martin.lastName,“has “,
martin.numberOfDependents,“dependents ”)
end

Рисунок 2. Использование отображения для хранения полей (язык Ruby)

class Person
attr_accessor :data
def initialize()
@data = {}
end
end

def frag2
martin = Person.new
martin.data [“firstName ”] = “Martin”
martin.data [“lastName ”] = “Fowler”
martin.data [“numberOfDependents ”] = 1
print (martin.data [“firstName ”],““,
martin.data [“lastName ”],“has “,
martin.data [“numberOfDependents ”],
“dependents ”)
end

 
« Предыдущая статья   Следующая статья »


  • Теория программирования, Безопасность в сервис-ориентированных архитектурах (SOA)
    Предоставляя свободно связанные сервисы, сервис-ориентированная архитектура позволяет гибко реагировать на постоянно меняющиеся деловые процессы. При этом необходимо уделить внимание не только функциональным аспектам, но и созданию гибкой инфраструктуры безопасности, поскольку изменения деловых процессов оказывают на нее серьезное влияние. К примеру, привлечение новых деловых партнеров или включение конфиденциальных сведений в важные корпоративные процессы требует адекватного стандартизованного ...
  • Теория программирования, Многоядерное программирование: использование преимуществ многоядерных систем
    В этой статье я глубже опишу мир многопоточности, а также опишу некоторые способы снижения сложности при разработке многопоточных приложений....
  • Теория программирования, Справочник по технологии COM
    Справочник по интерфейсам, структурам и функциям, используемым в технологии COM. Рассматриваются функции компиляции типа и работы с библиотеками, функции API, работающие с вариантами, получение информации об ошибке, функции API обработки ошибок, обзор диспетчерских функций API, регистрация активного объекта с помощью функций API, функции преобразования даты и времени, функции преобразования BSTR и векторов, функции преобразования чисел из строкового представления в цифровое, функции API, работаю...
  • Теория программирования, Собственные вектора и значения матриц
    Как выясняется, некоторые специалисты до сих пор интересуются такой проблемой линейной алгебры, как вычисление собственных значений и собственных векторов матриц. Эта проблема возникает во многих областях математики, механики, инженерного дела и геологии. На сайте представлен несколько переработанный перевод 11-ой главы книги Numerical Recipes in C, 2nd edition, Cambridge University Press, reprinted 1999....
  • Теория программирования, Ориентация на сервисы и её роль в Стратегии распределенных систем
    Сервисная ориентация - средство для формирования распределенных систем. Наиболее абстрактно, сервисная ориентация рассматривает всё - от основных приложений, от принтера, до клерка из дока отгрузки, до компании ночной доставки - как поставщика услуг. Поставщики услуг предоставляют возможности через интерфейсы. SOA отображает эти возможности и интерфейсы так, что они могут гармонично сочетаться в процессы. Сервисная модель "рекурсивна"(fractal): вновь сформиро...
  • Теория программирования, Регулярные выражения
    Регулярные выражения – это один из способов поиска подстрок (соответствий) в строках. Осуществляется это с помощью просмотра строки в поисках некоторого шаблона. Общеизвестным примером могут быть символы «*» и «?», используемые в командной строке DOS. Первый из них заменяет ноль или более произвольных символов, второй же – один произвольный символ. Так, использование шаблона поиска типа "text?.*" найдет файлы textf.txt, text1.asp и другие анало...
  • Теория программирования, Некоторые аспекты построения агентных систем
    Одной из важных задач, стоящих перед разработчиками программного обеспечения, является автоматизация процесса обращения информации. Как это показал Глушко, в свое время компьютер помог преодолеть человечеству информационный кризис, связанный с возрастающими объемами информации. Однако объемы хранимой и обрабатываемой информации продолжают расти, в связи с чем ставится вопрос о том, чтобы передать некоторые функции обработки этой информации интеллектуальным системам. При этом подобные системы дол...
  • Теория программирования, Теория фреймов
    Теория фреймов - это  парадигма для представления знаний с целью использования этих знаний компьютером . Впервые была представлена Минским как  попытка построить фреймовую сеть , или парадигму с целью достижения большего эффекта понимания  . С одной стороны Минский пытался сконструировать базу данных , содержащую энциклопедические знания  , но с другой стороны , он хотел создать наиболее описывающую базу , содержащую информацию в структурированной и упорядоченной форме . Эта ...