Разница между сцеплением и сцеплением

Или, если кто-то должен использовать XPathDocument, например me:

XPathDocument xdoc = new XPathDocument(file);
XPathNavigator nav = xdoc.CreateNavigator();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(nav.NameTable);
nsmgr.AddNamespace("y", "http://schemas.microsoft.com/developer/msbuild/2003");
XPathNodeIterator nodeIter = nav.Select("//y:PropertyGroup", nsmgr);
425
задан iliketocode 10 July 2018 в 03:07
поделиться

3 ответа

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

Пример низкой связности:

-------------------
| Staff           |
-------------------
| checkEmail()    |
| sendEmail()     |
| emailValidate() |
| PrintLetter()   |
-------------------

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

----------------------------
| Staff                   |
----------------------------
| -salary                 |
| -emailAddr              |
----------------------------
| setSalary(newSalary)    |
| getSalary()             |
| setEmailAddr(newEmail)  |
| getEmailAddr()          |
----------------------------

Что касается связности, то она относится к тому, насколько связаны или зависимы друг от друга два класса/модуля. Для классов с низкой связью изменение чего-то важного в одном классе не должно влиять на другой. Высокая связь затрудняет изменение и сопровождение кода; поскольку классы тесно связаны друг с другом, внесение изменений может потребовать перестройки всей системы.

Хороший дизайн программного обеспечения имеет высокую сплоченность и низкую связанность.

653
ответ дан 22 November 2019 в 23:07
поделиться

Высокая степень согласованности внутри модулей и низкая взаимосвязь между модулями часто считаются связанными с высоким качеством в языках программирования OO.

Например, код внутри каждого Java-класса должен иметь высокую внутреннюю сплоченность, но быть как можно слабее связан с кодом в других Java-классах.

Глава 3 Построение объектно-ориентированного программного обеспечения Майера (2-е издание) является прекрасным описанием этих проблем.

72
ответ дан 22 November 2019 в 23:07
поделиться

Увеличение сплоченности и уменьшение связанности действительно приводят к хорошему дизайну программного обеспечения.

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

Decoupling позволяет вам изменять реализацию, не затрагивая другие части вашего программного обеспечения.

Cohesion гарантирует, что реализация более специфична для функциональности и в то же время ее легче поддерживать.

Наиболее эффективным методом уменьшения связанности и увеличения сплоченности является проектирование по интерфейсу.

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

Хотя в некоторых сценариях это не реалистично, это должно быть целью проектирования.

Пример (очень схематичный):

public interface IStackoverFlowQuestion
      void SetAnswered(IUserProfile user);
      void VoteUp(IUserProfile user);
      void VoteDown(IUserProfile user);
}

public class NormalQuestion implements IStackoverflowQuestion {
      protected Integer vote_ = new Integer(0);
      protected IUserProfile user_ = null;
      protected IUserProfile answered_ = null;

      public void VoteUp(IUserProfile user) {
           vote_++;
           // code to ... add to user profile
      }

      public void VoteDown(IUserProfile user) {
          decrement and update profile
      }

      public SetAnswered(IUserProfile answer) {
           answered_ = answer
           // update u
      }
}

public class CommunityWikiQuestion implements IStackoverflowQuestion {
     public void VoteUp(IUserProfile user) { // do not update profile }
     public void VoteDown(IUserProfile user) { // do not update profile }
     public void SetAnswered(IUserProfile user) { // do not update profile }
}

Где-нибудь в другом месте вашей кодовой базы вы могли бы иметь модуль, который обрабатывает вопросы, независимо от того, какие они:

public class OtherModuleProcessor {
    public void Process(List<IStackoverflowQuestion> questions) {
       ... process each question.
    }
}
32
ответ дан 22 November 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: