Инструменты пользователя

Инструменты сайта


examination:oop:question12

12. Метафора объектно-ориентированного программирования, реализуемая языком C++.

Особенностью объектно ориентированного программирования является то, что в отличие от процедурных языков, где ключевыми являются различные функции, а данным отводится так или иначе второстепенное место, при объектно-ориентированном программирование основную позицию в структурировании программ занимает объект, то есть сущность которая в себе инкапсулирует данные + необходимые функции для работы с этими данными.

Фактически при объектно-ориентированном программировании код программы представляет собой не единое целое, а совокупность различных маленьких объектов, фактически структуру объектно-ориентированной программы можно было бы представить в виде дерева: то есть один объект содержит в себе другие объекты, другие объекты также содержат в себе какие-то объекты. Это позволяет при разработке продукта сконцентрироваться на создании маленьких частей системы (то есть описании классов), причем никак не влияя систему в целом, тогда как при процедурном программировании пришлось бы тщательно отслеживать все места использования функций, чтобы ничего не сломать.

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

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

Все используют метафоры - аналогии - для обсуждения и обучения техническим проблемам. Эта книга не является исключением. Центральными метафорами для нее являются понятия наследования и Проектирования по контракту. Метафорой является и слово «объект», термин, нагруженный повседневным смыслом, но используемый для специфических целей.

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

Хорошо или плохо применять метафоры? Это может быть очень хорошо или очень плохо - все зависит от целей, для которых они используются.

Ученые используют метафоры в своих исследованиях; употребляя для объяснения наиболее абстрактных понятий конкретные видимые образы.

Первоначальной (и, возможно, наиболее используемой) парадигмой программирования было:

Определите, какие процедуры вам нужны; используйте лучшие из известных вам алгоритмов!

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

Со временем при в проектировании программ акцент сместился с организации процедур на организацию структур данных. Помимо всего прочего это вызвано и ростом размеров программ. Модулем обычно называют совокупность связанных процедур и тех данных, которыми они управляют. Парадигма программирования приобрела вид:

Определите, какие модули нужны; поделите программу так, чтобы данные были скрыты в этих модулях

Эта парадигма известна также как «принцип сокрытия данных». Если в языке нет возможности сгруппировать связанные процедуры вместе с данными, то он плохо поддерживает модульный стиль программирования. Теперь метод написания «хороших» процедур применяется для отдельных процедур модуля.

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

В языках Ада, Clu, С++ и подобных им эта трудность преодолевается благодаря тому, что пользователю разрешается определять свои типы, которые трактуются в языке практически так же, как встроенные. Такие типы обычно называют абстрактными типами данных или пользовательскими. Парадигму же программирования можно выразить теперь так:

Определите, какие типы вам нужны; предоставьте полный набор операций для каждого типа.

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

В языке С++ класс circle называется производным по отношению к классу shape, а класс shape называется базовым для класса circle. Возможна другая терминология, использующая названия «подкласс» и «суперкласс» для классов circle и shape соответственно. Теперь парадигма программирования формулируется так:

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

examination/oop/question12.txt · Последние изменения: 2014/01/15 08:22 (внешнее изменение)