-
Notifications
You must be signed in to change notification settings - Fork 17
exam13 2
Рассматривать связность классов и объектов можно только в контексте ООП. Для четкого понимания рассматриваемых структур уточним понятие ООП и другие основные понятия.
Объе́ктно-ориенти́рованное программи́рование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования.
Идеологически ООП это подход к программированию как к моделированию информационных объектов, решающий на новом уровне основную задачу структурного программирования: структурирование информации с точки зрения управляемости, что существенно улучшает управляемость самим процессом моделирования, что, в свою очередь, особенно важно при реализации крупных проектов.
Управляемость для иерархических систем предполагает минимизацию избыточности данных (аналогичную нормализации) и их целостность, поэтому созданное удобно управляемым — будет и удобно пониматься. Таким образом, через тактическую задачу управляемости решается стратегическая задача — транслировать понимание задачи программистом в наиболее удобную для дальнейшего использования форму.
Обычный человеческий язык в целом отражает идеологию ООП, начиная с инкапсуляции представления о предмете в виде его имени и заканчивая полиморфизмом использования слова в переносном смысле, что в итоге развивает выражение представления через имя предмета до полноценного понятия-класса.
Рассмотрим детальнее понятие класса.
Класс — в объектно-ориентированном программировании, представляет собой шаблон для создания объектов, обеспечивающий начальные значения состояний: инициализация полей-переменных и реализация поведения функций или методов. Другие абстрактные типы данных — метаклассы, интерфейсы, структуры, перечисления, — характеризуются какими-то своими, другими особенностями.
Класс является ключевым понятием в ООП. Суть отличия классов от других абстрактных типов данных состоит в том, что при задании типа данных класс определяет одновременно как интерфейс, так и реализацию для всех своих экземпляров (т.е. объектов), вызов метода-конструктора обязателен.
На практике объектно-ориентированное программирование сводится к созданию некоторого количества классов, включая интерфейс и реализацию, и последующему их использованию. Объектно-ориентированный подход за время своего развития накопил множество рекомендаций (паттернов) по созданию классов и иерархий классов.
Сама идея классов пришла из работ по базам знаний, имеющих отношение к исследованиям по искусственному интеллекту. Используемые человеком классификации в зоологии, ботанике, химии, деталях машин, несут в себе основную идею, что любую вещь всегда можно представить частным случаем некоторого более общего понятия. Конкретное яблоко — это в целом некоторое яблоко, вообще яблоко, а любое вообще яблоко — фрукт. Рассмотрим наиболее общее понятие объекта.
Объект в программировании — некоторая сущность в цифровом пространстве, обладающая определённым состоянием и поведением, имеющая определённые свойства (атрибуты) и операции над ними (методы). Как правило, при рассмотрении объектов выделяется то, что объекты принадлежат одному или нескольким классам, которые определяют поведение (являются моделью) объекта. Термины «экземпляр класса» и «объект» взаимозаменяемы.
Объекты обладают свойствами наследования, инкапсуляции и полиморфизма.
В менее абстрактном варианте, можно сказать, что экземпляр класса или объект (англ. instance) — это описание конкретного объекта в памяти. Класс описывает свойства и методы, которые будут доступны у объекта, построенного по описанию, заложенному в классе. Экземпляры используются для представления (моделирования) конкретных сущностей реального мира.
Например, экземпляром класса стиральных машин может быть ваша стиральная машина, имеющая следующие свойства: компания-производитель «Вятка», наименование модели «Вятка-автомат», серийный номер изделия ВЯТ454647, ёмкость 20 л. В отличие от имени класса, имя экземпляра обычно начинается со строчной буквы.
Рассмотрим интересующую нас меру характеристик классов.
Связность, или прочность (англ. cohesion, module strength), — мера силы взаимосвязанности элементов внутри модуля; способ и степень, в которой задачи, выполняемые некоторым программным модулем, связаны друг с другом.
Макконнелл объясняет понятие связности на примере класса (как частного случая модуля): «связность характеризует то, насколько хорошо все методы класса или все фрагменты метода соответствуют главной цели, — иначе говоря, насколько сфокусирован класс».
В контексте данной работы будет рассмотрено понятие связности именно в контексте классов.
В стандарте ISO/IEC/IEEE 24765 и современной литературе предлагается рассматривать следующие типы:
- Случайная связность - тип связности, при котором задачи, выполняемые программным модулем, не имеют функциональной взаимосвязи друг с другом.
- Коммуникационная связность - тип связности, при котором задачи, выполняемые программным модулем, используют одни и те же входные данные или участвуют в формировании одних и тех же выходных данных.
- Функциональная связность - тип связности, при котором все задачи, выполняемые программным модулем, вносят вклад в выполнение одной и той же функции.
- Логическая связность - тип связности, при котором задачи, выполняемые программным модулем, реализуют логически сходные функции (например, одинаково обрабатывают разные типы входных данных).
- Процедурная связность - тип связности, при котором все задачи, выполняемые программным модулем, участвуют в некоторой программной процедуре.
- Последовательностная связность - тип связности, при котором выходные данные одной задачи, выполняемой программным модулем, служат входным данными для другой задачи, выполняемой этим же модулем.
- Временна́я связность - тип связности, при котором все задачи, выполняемые программным модулем, требуются для некоторой фазы выполнения программы (например, модуль содержит все задачи для инициализации).
Связность обычно противопоставляется связанности. Их часто путают из-за похожих названий. Рассмотрим и это понятие.
Зацепление, сцепление, связанность, сопряжение (англ. coupling) — способ и степень взаимозависимости между программными модулями; сила взаимосвязей между модулями; мера того, насколько взаимозависимы разные подпрограммы или модули.
Приведем еще одно определение, которое хорошо описывает связанность.
Связанность - мера взаимосвязанности программных модулей (классов) между собой, отражаемая в количестве изменений, вносимых в зависимые классы при переписывании какого-то функционала основного класса.
Сильное зацепление рассматривается как серьёзный недостаток, поскольку затрудняет понимание логики модулей, их модификацию, автономное тестирование, а также переиспользование по отдельности. Слабое зацепление, напротив, является признаком хорошо структурированной и хорошо спроектированной системы, и, когда оно комбинируется с сильной связностью, соответствует общим показателям хорошей читаемости и сопровождаемости.
Типы зацепления, согласно стандарту ISO/IEC/IEEE 24765-2010, включают:
- Зацепление по общей области - тип зацепления, при котором два программных модуля совместно используют общую область данных.
- Зацепление по содержимому - тип зацепления, при котором некоторые или все программные модули включены в некоторый модуль как составные части.
- Зацепление по управлению - тип зацепления, при котором один программный модуль обменивается данными с другим модулем с явной целью повлиять на его последующее выполнение.
- Зацепление по данным - тип зацепления, при котором выходные данные одного программного модуля служат входными данными другого модуля.
- Смешанное зацепление - тип зацепления, при котором различные подмножества значений некоторого элемента данных используются в нескольких программных модулях для разных и несвязанных целей.
- Патологическое зацепление - тип зацепления, при котором один программный модуль зависит от деталей внутренней реализации другого модуля или влияет на них.
Приведем примеры практического использования этих понятий и определим разницу между связностью и связанностью классов и объектов.
Допустим, у нас есть класс Собака и Кошка.
Рассмотрим разные типы связности на примере класса Кошка и его возможных задач.
- Случайная связность. Кошка имеет функции: кушать, программировать, перевод с русского на английский. При таких функциях вероятно будет плохая читаемость и сложное сопровождение. Такой класс мог бы получится из-за некорректной технической документации.
- Коммуникационная связность. Рассмотрим функции с одними входными данными. Класс Кошка в нашем случае будет нацелен на игру с кошачьими игрушками. Название(чем, предмет).
- сМячиком (лапа, мяч);
- сЛентой(зубы, клубок);
- сКошачьейМятой(нос, мята);
- Функциональная связность. Класс Кошка в нашем случае будет нацелен на функцию питания. Такой класс мог бы быть в тамагочи.
- найтиХозяина();
- попроситьЕду();
- понюхатьЕду();
- съестьЕду();
- Логическая связность. Под этот тип связности так же подходит пример Кошки, нацеленной на игру с разными игрушками.
- Процедурная связность - Под этот тип связности так же подходит пример Кошки, созданной для тамагочи, где основная программная процедура – кормить животных.
- Последовательностная связность. Рассмотрим Кошку, созданную для получения еды, с точки зрения такого типа связности.
- найтиХозяина(комната); возвращает - хозяин
- попроситьЕду(хозяин); возвращает - еда
- понюхатьЕду(еда); возвращает - желаниеКушать
- съестьЕду(желаниеКушать); возвращает – удовлетворение
- Временна́я связность. Класс Кошка имел бы временную связность, если бы выполнялся именно в фазе выполнения программы «кормление кошки». Тогда класс назывался бы КошкаКормление, и потенциально присутствовали бы классы, например КошкаИгра и КошкаПрогулка.
Рассмотрим примеры различных зацеплений на классах Кошка и Собака.
- Зацепление по общей области. Например, если класс Кошка и Класс собака будут одновременно работать с общей областью Дом.
- Зацепление по содержимому. Такое возможно, если будет класс МоиПитомцы, который будет содержать экземпляры Кошки и Собаки.
- Зацепление по управлению. Например, если Кошка будет иметь функцию поцарапатьСобаку(лапа, нос, сильно), где будет подавать данные о носе собаки, а Собака как-то отреагирует.
- Зацепление по данным. У Кошки может быть функция поигратьССобакой() которая сама выбирает и возвращает название игры, а у Собаки функция поигратьСКошкой (названиеИгры).
- Смешанное зацепление. Такое тоже возможно, если у Кошки будут переменные Характер и Окрас, а Собака будет включать Характер, и будет еще класс КошкаИгрушечная, который включает Окрас.
- Патологическое зацепление. Подходит тот же вариант, где Кошка будет иметь функцию поцарапатьСобаку(лапа, нос, сильно), которая будет влиять на данные о носе собаки, причем напрямую.
В данной работе были рассмотрены понятия связности и так же связанности, их типы, объяснена их необходимость использования и классах. Были подробно проанализированы типы этих мер и созданы примеры на конкретных классах.
Выполнила: Барабанова Анна ИДБ-18-06