Концепции метапрограммирования

В этой главе:

  • Определение метапрограммирования
  • Примеры метапрограммирования

В наши дни большинство разработчиков программного обеспечения понимают основные принципы объектно-ориентированного программирования (ООП). Например, вы, наверное, понимаете, как инкапсуляция и скрытая реализация могут улучшить взаимосвязь классов. Такие языки, как C# и Visual Basic, отлично подходят для создания отдельных типов, так как они предоставляют простые возможности для группирования и скрытия кода и данных. Вы можете использовать взаимосвязанные типы, чтобы увеличить уровень абстракции во всей системе, что позволяет прийти к слабосвязанным компонентам. Системы, которые используют слабые связи на высшем уровне, гораздо легче поддерживать, потому что каждая подсистема не так зависит от других. Эти преимущества реализуются на более низких уровнях, как правило, через уменьшение сложности и повторное использование классов. Взгляните на рисунок 1-1: какую из двух описанных систем проще изменить?

Рисунок 1-1: Какую систему проще изменить?

Не зная, что изображено серыми кругами, большинство разработчиков выбрали бы схему справа. И дело даже не в программистах. Если показать диаграмму бухгалтеру, он также выбрал бы ту, что справа, поскольку она менее сложная. Мы узнаем простоту, когда мы видим ее. Наша задача как программистов состоит в том, чтобы видеть возможности для упрощения систем, которые мы разрабатываем. Такие возможности языка, как инкапсуляция, абстракция, наследование, сокрытие данных и полиморфизм играют очень важную роль, но это еще не все.

I в SOLID

Попутно мы будем ссылаться на некоторые из пяти принципов SOLID объектно-ориентированного программирования (ООП). В то время как мы думаем о связях и взаимосвязях, хорошее время обсудить “I” в SOLID: принцип разделения интерфейса (ISP). ISP говорит, что много специализированных интерфейсов лучше, чем один универсальный.

Это, кажется, противоречит понятию, что сильная связанность – всегда хорошая вещь. Если вы рассмотрите ISP вместе с другими четырьмя принципами SOLID, вы поймете, что здесь говорится о золотой середине в разработке программного обеспечения. Диаграмма слева на рисунке 1-1 может представлять собой нелепую тесную связь и малую взаимосвязь. Тот, что справа, может воплотить в другую крайность. ISP говорит нам, что стоит найти нечто среднее.

Стиль метапрограммирования разработки программного обеспечения разделяет многие из традиционных целей ООП. Метапрограммирование включает в себя все то, что связано с созданием простого и многоразового программного обеспечения. Но вместо того, чтобы полагаться исключительно на возможности языка, чтобы снизить сложность кода или расширить повторное его использование, метапрограммирование достигает этих целей с помощью различных библиотек и методов кодирования. Есть языковые возможности, которые в некоторых обстоятельствах облегчают метапрограммирование. По большей части, однако, метапрограммирование представляет собой набор независимых от языка навыков. Мы используем C# для большинства примеров в этой книге, но не удивляйтесь, когда мы немного воспользуемся JavaScript или F#, если нам это потребуется.

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

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

С другой стороны, DSL, как известно, трудно проектировать, писать, тестировать и поддерживать. Некоторые утверждают, что DSL являются слишком сложными и игра не стоит свеч. Но с точки зрения потребителя, DSL драгоценны для бизнеса именно потому, что они понижают кажущуюся сложность. В конце концов, разве это не то, что мы делаем в жизни? Мы делаем так, чтобы сложные проблемы бизнеса казались простыми. Когда вы будете изучать метапрограммирование на протяжении всей книги, постарайтесь не упускать эту мысль.

Примечание

DSLs in Action (www.manning.com/ghosh) и DSLs in Boo (www.manning.com/rahien) являются отличным выбором, если ваша цель состоит в том, чтобы научиться создавать богатые DSLs.

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

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

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

Примеры метапрограммирования

Резюме

или RSS канал: Что новенького на smarly.net