exam13 2 - stankin/design-part-1 GitHub Wiki

Отличия понятия связности в применении к классам и объектам

Реферат к лекции 13 Научные методы в проектировании. Топология информационных систем.

Выполнила: Барабанова Анна ИДБ-18-06


Рассматривать связность классов и объектов следует в контексте ООП. Для четкого понимания рассматриваемых структур уточним понятия объектно-ориентированного подхода и другие основные понятия.

1. Основные понятия

Фрейм (англ. frame — «каркас» или «рамка») — способ представления знаний в искусственном интеллекте, представляющий собой схему действий в реальной ситуации. Первоначально термин «фрейм» ввёл Марвин Минский в 70-е годы XX века для обозначения структуры знаний для восприятия пространственных сцен.

Фрейм — это модель абстрактного образа, минимально возможное описание сущности какого-либо:

  • объекта
  • явления
  • события
  • ситуации
  • процесса

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

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

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

Объектно-ориентированный подход основан на систематическом использовании моделей для языково-независимой разработки программной системы, на основе из ее прагматики.

Рассмотрим детальнее понятие класса.

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

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

Объект — некоторая сущность, обладающая определённым состоянием и поведением, имеющая определённые свойства и операции над ними. Как правило, при рассмотрении объектов выделяется то, что объекты принадлежат одному или нескольким классам (абстракциям), которые определяют поведение (являются моделью) объекта. Термины «экземпляр класса» и «объект» взаимозаменяемы.

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

Например, экземпляром класса стиральных машин может быть ваша стиральная машина, имеющая следующие свойства: компания-производитель «Вятка», наименование модели «Вятка-автомат», серийный номер изделия ВЯТ454647, ёмкость 20 л.

Рассмотрим интересующую нас меру характеристик классов.

2. Понятие связности

Связность, или прочность (англ. cohesion, module strength), — мера силы взаимосвязанности элементов внутри модуля; способ и степень, в которой задачи связаны друг с другом.

3. Типы связности

В стандарте ISO/IEC/IEEE 24765 (направленном на объектно-ориентированное программирование) предлагается рассматривать следующие типы:

  • Случайная связность - тип связности, при котором задачи, выполняемые программным модулем, не имеют функциональной взаимосвязи друг с другом.
  • Коммуникационная связность - тип связности, при котором задачи, выполняемые программным модулем, используют одни и те же входные данные или участвуют в формировании одних и тех же выходных данных.
  • Функциональная связность - тип связности, при котором все задачи, выполняемые программным модулем, вносят вклад в выполнение одной и той же функции.
  • Логическая связность - тип связности, при котором задачи, выполняемые программным модулем, реализуют логически сходные функции (например, одинаково обрабатывают разные типы входных данных).
  • Процедурная связность - тип связности, при котором все задачи, выполняемые программным модулем, участвуют в некоторой программной процедуре.
  • Последовательностная связность - тип связности, при котором выходные данные одной задачи, выполняемой программным модулем, служат входным данными для другой задачи, выполняемой этим же модулем.
  • Временна́я связность - тип связности, при котором все задачи, выполняемые программным модулем, требуются для некоторой фазы выполнения программы (например, модуль содержит все задачи для инициализации).

Связность обычно противопоставляется связанности. Их часто путают из-за похожих названий. Рассмотрим и это понятие.

3. Связанность

Зацепление, сцепление, связанность, сопряжение (англ. coupling) — способ и степень взаимозависимости между программными модулями; сила взаимосвязей между модулями; мера того, насколько взаимозависимы разные подпрограммы или модули.

Приведем еще одно определение, которое хорошо описывает связанность.

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

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

4. Типы зацеплений

Типы зацепления, согласно стандарту ISO/IEC/IEEE 24765-2010, включают:

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

5. Примеры связности

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

Допустим, у нас есть класс Собака и Кошка.

Рассмотрим разные типы связности на примере класса Кошка и его возможных задач.

  • Случайная связность. Кошка имеет функции: кушать, программировать, перевод с русского на английский. При таких функциях вероятно будет плохая читаемость и сложное сопровождение. Такой класс мог бы получится из-за некорректной технической документации.
  • Коммуникационная связность. Рассмотрим функции с одними входными данными. Класс Кошка в нашем случае будет нацелен на игру с кошачьими игрушками. Название(чем, предмет).
    • сМячиком (лапа, мяч);
    • сЛентой(зубы, клубок);
    • сКошачьейМятой(нос, мята);
  • Функциональная связность. Класс Кошка в нашем случае будет нацелен на функцию питания. Такой класс мог бы быть в тамагочи.
    • найтиХозяина();
    • попроситьЕду();
    • понюхатьЕду();
    • съестьЕду();
  • Логическая связность. Под этот тип связности так же подходит пример Кошки, нацеленной на игру с разными игрушками.
  • Процедурная связность - Под этот тип связности так же подходит пример Кошки, созданной для тамагочи, где основная программная процедура – кормить животных.
  • Последовательностная связность. Рассмотрим Кошку, созданную для получения еды, с точки зрения такого типа связности.
    • найтиХозяина(комната); возвращает - хозяин
    • попроситьЕду(хозяин); возвращает - еда
    • понюхатьЕду(еда); возвращает - желаниеКушать
    • съестьЕду(желаниеКушать); возвращает – удовлетворение
  • Временна́я связность. Класс Кошка имел бы временную связность, если бы выполнялся именно в фазе выполнения программы «кормление кошки». Тогда класс назывался бы КошкаКормление, и потенциально присутствовали бы классы, например КошкаИгра и КошкаПрогулка.

6. Примеры зацеплений

Рассмотрим примеры различных зацеплений с точки зрения объектно-ориентированное программирования на классах Кошка и Собака.

  • Зацепление по общей области. Например, если класс Кошка и Класс собака будут одновременно работать с общей областью Дом.
  • Зацепление по содержимому. Такое возможно, если будет класс МоиПитомцы, который будет содержать экземпляры Кошки и Собаки.
  • Зацепление по управлению. Например, если Кошка будет иметь функцию поцарапатьСобаку(лапа, нос, сильно), где будет подавать данные о носе собаки, а Собака как-то отреагирует.
  • Зацепление по данным. У Кошки может быть функция поигратьССобакой() которая сама выбирает и возвращает название игры, а у Собаки функция поигратьСКошкой (названиеИгры).
  • Смешанное зацепление. Такое тоже возможно, если у Кошки будут переменные Характер и Окрас, а Собака будет включать Характер, и будет еще класс КошкаИгрушечная, который включает Окрас.
  • Патологическое зацепление. Подходит тот же вариант, где Кошка будет иметь функцию поцарапатьСобаку(лапа, нос, сильно), которая будет влиять на данные о носе собаки, причем напрямую.

8. Отличие связности между абстракциями (классами) между собой и конкретными экземплярами (объектами)

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

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

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

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

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

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

Вывод

В данной работе были рассмотрены понятия связности и связанности, их типы, объяснена их необходимость использования в классах. Были подробно проанализированы типы этих мер и созданы примеры на конкретных классах. Было рассмотрено отличие связности между абстракциями (классами) между собой и конкретными экземплярами (объектами).

Источники

  1. Википедия. Теория Фреймов.

  2. Википедия. Зацепление.

  3. Википедия. Связность.