Как Закон Деметры применяется к объектно-ориентированным системам в отношении сцепления и сцепления? [закрыто]

15

Как Закон Деметры применяется к объектно-ориентированным системам со связью и сцеплением?

Я читал книгу «Разработка программного обеспечения и профессиональная практика» и наткнулся на главу о LoD, и мне было любопытно, как этот принцип применяется в объектно-ориентированных системах.

Джереми
источник
Однажды я унаследовал проект, который имел высокий уровень связи (топология звезды). Я исправил ситуацию, используя «Шаблон посредника», чтобы ограничить связь между объектами и позволить посреднику вместо этого общаться с каждым объектом. Несмотря на то, что все еще существует связь, она ограничивает количество людей, которые связаны. Некоторые могут захотеть изучить это еще больше, если они чувствуют, что у них есть проблема с высокой связью с их дизайном.
Jeach

Ответы:

9

По словам Эмерсона Маседо Закон Деметры гласит следующее:

  • Каждый юнит должен иметь только ограниченные знания о других юнитах: только юниты, «тесно» относящиеся к текущему юниту.
  • Каждый юнит должен разговаривать только со своими друзьями; не разговаривай с незнакомцами
  • Поговорите только со своими непосредственными друзьями.

Это напрямую соответствует принципу слабой связи, поскольку единицы (или объекты) должны, как и выше:

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

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

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

Spoike
источник
8

Муфта упрощенная

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

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

созерцая связь

  • Ссылаясь даже на одну проп., Метод соединяет два объекта.
  • Очевидно, связь необходима для создания программного обеспечения.
  • Учитывая характер связывания «шаг блокировки», мы хотим ограничить и изолировать его. Эта цель просто соответствует общей разработке программного обеспечения. принципы.
  • Чем меньше объектов мы будем говорить, тем меньше связь.
  • Если мне нужно сделать, скажем, 20 различных вызовов методов, связь будет ниже, если все 20 вызовов относятся к одному классу / объекту, то есть те же методы распространяются на несколько классов / объектов.

Большинство знаний вызывает сумасшедшую связь

Здесь у нас Employeeесть, у Personкоторого есть «Адрес»

public class Employee {
    public Person me = new Person();
}
public class Person {
    public Address home = new Address();
}
public class Address {
    public string street;
} 

Для того, чтобы получить на улицу , я должен позвонить: myEmployee.me.home.street. Это на 180 градусов противоположно принципу наименьшего знания. Я должен знать о внутренностях, композиционной структуры, из Employee, Personи Addressклассов.

Этот дефектный дизайн класса вынуждает меня знать обо всех этих классах и таким образом myEmployee.me.home.streetсоединяет меня (объект вызывающего) не менее чем с 3 классами - чтобы получить только одно свойство!

Наименьшее знание спасает день

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

Добавляя все необходимые свойства в Employeeклассе, мы фиксируем связь.

таким образом

public class Employee {
    public Person me = new Person();
    public string street { return me.home.street; }
}

Позволяет мне позвонить: myEmployee.street-

  1. Я только "знаю" Employee
  2. Я связан только с Employee- независимо от того, насколько сложна его структура.

Наименее Знание полностью вниз

Мы отделили myEmployee от Personи Addressи, в идеале, мы должны продолжать применять наименьшее количество знаний, добавляя сквозные свойства, которые Employeeтолько говорят Personи Personтолько говорят сAddress

radarbob
источник
1

Исследование ( В. Базили, Л. Бриан и В. Л. Мело. Проверка объектно-ориентированных метрик проектирования как показателей качества ) показало, что классы с большими наборами ответов имеют тенденцию создавать больше ошибок, чем классы с меньшим набором ответов, потому что больше набор ответов означает шанс более высокого сцепления.

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

Тед
источник
1
Исследование ( Anquetil, N. and Laval, J. Legacy Software Restructuring: Анализ конкретного случая ) также продемонстрировало, что уменьшение сцепления и повышение когезии не всегда приводит к улучшению качества. Опираясь на результат одного небольшого исследования, считается вредным.
0

Это довольно просто; скажем, A зависит от B, а B зависит от C. Без закона Деметры вы можете использовать как B, так и C в A, но, придерживаясь этого закона, A зависит только от B, оно не может зависеть от C.

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

m3th0dman
источник