Skip to content
anrabana edited this page Dec 18, 2021 · 22 revisions

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

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

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

Объе́ктно-ориенти́рованное программи́рование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования.

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

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

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

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

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

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

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

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

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

Объекты обладают свойствами наследования, инкапсуляции и полиморфизма.

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

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

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

Что такое связность?

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

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

В контексте данной работы будет рассмотрено понятие связности именно в контексте классов.

Какие есть типы связности?

В стандарте ISO/IEC/IEEE 24765 и современной литературе предлагается рассматривать следующие типы:

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

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

Что такое связанность?

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

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

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

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

Какие есть типы зацеплений?

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

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

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

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

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

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

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

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

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

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

Вывод

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

Источники

Википедия. ООП.

Википедия. Объект.

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

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

Титры

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

Clone this wiki locally