Современные информационные технологии/2. Вычислительная техника и программирование

К.т.н. Жилинкова Л.А

Курский институт социального образования (филиал)РГСУ, Россия

Способы сокрытия реализации модулей программной системы

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

Скрытие реализации позволяет изменять отдельные модули, не затрагивая остальную часть системы, что облегчает внесение изменений и повышает надежность системы[3]. Скрытие внутренней реализации также часто называют контролем доступа или инкапсуляцией.

Инкапсуляция (encapsulation) - это механизм, который объединяет данные и код, манипулирующий этими данными, а также защищает и то, и другое от внешнего вмешательства или неправильного использования. В объектно-ориентированном программировании код и данные могут быть объединены вместе. Когда коды и данные объединяются таким способом, создаётся объект (object). Объект - это то, что поддерживает инкапсуляцию.

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

Модификаторы доступа

Явно задают область видимости каждого члена класса. Это модификаторы public, protected и private, обозначающие, соответственно, открытые члены класса, члены класса, доступные только из классов-потомков и скрытые, доступные только внутри класса.

Методы доступа

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

Также методы доступа позволяют ограничить доступ на чтение или изменение. Методы доступа называют ещё аксессорами (от англ. access — доступ), а по отдельности — геттерами (англ. get — чтение) и сеттерами (англ. set — запись). В объектно-ориентированном программировании считается "хорошим тоном"

организовывать доступ к данным через специальные методы доступа get и set. Обычное описание поля можно дополнить методами доступа get и set и тогда при любом чтении поля или при присваивании ему значения будет обязательно выполняться функциональность, записанная в этих методах доступа [2].

Свойство может являться доступным только для записи, если в нем определен только метод доступа set или только для чтения, если определен только метод get.

Рисунок 1. Реализация аксессора на языке C#.

Индексаторы

Индексаторы являются синтаксическим удобством, позволяющим создавать класс, структуру или интерфейс, доступ к которому клиентские приложения получают, как к массиву. Чаще всего индексаторы реализуются в типах, главная цель которых — инкапсуляция внутренней коллекции или массива[1].

Рисунок 2. Реализация индексатора на языке C#.

Перегрузка операторов

Иногда возникает потребность описывать и применять к созданным программистом типам данных операции, по смыслу эквивалентные уже имеющимся в языке. Они, как и обычные числовые типы, поддерживают арифметические операции, и естественным было бы создать для данного типа операции «плюс», «минус» и др., обозначив их теми же самыми знаками операций, что и для других числовых типов. Запрет на использование определённых в языке элементов вынуждает создавать множество функций с именами вида ComplexPlusComplex, IntegerPlusComplex и так далее. Перегрузка оператора позволяет избавиться от заполнения интерфейса подобными функциями.

Рисунок 3. Перегрузка оператора на языке C#.

Явное и неявное преобразование типов

Методы преобразования типов также можно скрыть используя неявное (информация при преобразовании типов не теряется) и явное преобразование[1].

Рисунок 4. Неявное приведение типов на языке C#.

Рисунок 5. Явное приведение типов на языке C#.

Наследование

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

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

Рисунок 6. Реализация наследования на языке C#.

Интерфейсы

Интерфейсы описывают группу связанных функциональных возможностей, которые могут принадлежать к любому классу. Класс или структура, которые реализуют интерфейс, должны реализовать все члены этого интерфейса, указанные в его определении. Класс или структура может наследовать несколько интерфейсов. Когда класс или структура наследует интерфейс, наследуются только имена и подписи методов, поскольку сам интерфейс не содержит реализаций, что решает проблему коллизий при множественном наследовании[1].

Рисунок 7. Реализация интерфейса на языке C#.

Агрегирование

Методика создания нового класса из уже существующих классов путём включения, называемого также делегированием. Можно выделить:

·                   Агрегирование по ссылке

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

·                   Композиция (агрегирование по значению)

Более строгий вариант агрегирования, когда включаемый объект может существовать только как часть контейнера. Если контейнер будет уничтожен, то и включённый объект тоже будет уничтожен.

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

Литература:

1. Использование индексаторов (Руководство по программированию в C#) -[Электронный ресурс] – Режим доступа. – URL: http://msdn.microsoft.com/ru-ru/library/2549tw02.aspx (дата обращения 10.11.2013)

2. Гради Буч. Объектно-ориентированный анализ и проектирование с примерами приложений на С++ / Гради Буч. – М: Вильямс, 2008. – 721с

3. Иванова Г.С. Объектно-ориентированное программирование / Г.С. Иванова, Т.Н. Ничушкина, Е.К. Пугачев. – М.: МГТУ им. Н.Э. Баумана, 2001. – 320 с.