2012-05-31 6 views
63

Я изучаю компьютерное программирование, и в нескольких местах я наткнулся на концепцию сплоченности, и я понимаю, что желательно, чтобы программное обеспечение обладало «высокой связностью», но что это значит? Я программист на Java, C и Python, изучающий C++ из книги C++ Primer, в которой упоминается сплоченность, не имея ее в индексе, не могли бы вы указать мне некоторые ссылки на эту тему? Я не нашел страницу wikipedia об информативности в области информатики, поскольку она просто говорит, что это качественная мера и не дает реальных примеров кода.Что такое высокая сплоченность и как ее использовать/сделать?

+4

http: //en.wikipedia.org/wiki/Cohesion_ \ (computer_science \) – pablochan

+2

Высокая сплоченность: связанное поведение, чтобы сидеть вместе, и не связанное поведение, чтобы сидеть где-нибудь в другом месте. –

ответ

184

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

Давайте возьмем пример:

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

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

+8

Честно говоря, я не определяю такую ​​сплоченность. Ваше определение - SRP (принцип единой ответственности). И сплоченность заключается в том, насколько близки друг к другу близкие друг к другу классы, основанные на пакетах, одинаково функционально-орбитальные. –

+2

SRP (Single Responsiblity Principle) - это еще один способ выразить ту же концепцию. Сплоченность - это скорее метрика; СРП является прагматичным руководством, которое, если следовать, приведет к сплоченным классам. – ComDubh

+1

Я думаю, что окно класса не должно вызывать какой-либо объект класса sum, поскольку его единственной целью является рендеринг, который ему не нужно знать о «существовании» суммы класса или любого другого класса. В этом случае должен быть другой класс «Драйвер», который должен получить результат из класса sum и передаст результат классу Window для рендеринга – Eklavyaa

0

MSDN's статья на нем, вероятно, более информативна, чем Википедия в этом случае.

1

cohesion означает, что класс или метод выполняет только одно задание. имя метода или класса также должно быть понятным. например, если вы пишете калькулятор, вы должны назвать класс «калькулятор», а не «asdfghj». также вы должны подумать о создании метода для каждой задачи, например. subtract() add() и т. д. программист, который может использовать вашу программу в будущем, точно знает, что делают ваши методы. хорошее именование может уменьшить комментируя усилия

также принцип DRY - не повторять себя

3

Это пример низкого сцепления:

class Calculator 
{ 


    public static void main(String args[]) 
    { 

      //calculating sum here 
      result = a + b; 
      //calculating difference here 
      result = a - b; 
      //same for multiplication and division 
    } 
} 

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

class Calculator 
{ 


    public static void main(String args[]) 
    { 

      Calculator myObj = new Calculator(); 
      System.out.println(myObj.SumOfTwoNumbers(5,7)); 
     } 


    public int SumOfTwoNumbers(int a, int b) 
    { 

      return (a+b); 
    } 

    //similarly for other operations 

} 
16

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

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

например. Класс электронной почты. Он должен содержать члены данных в, из, cc, bcc, subject, body и может содержать эти методы saveAsDraft(), send(), discardDraft(). Но login() не должен быть здесь, так как существует несколько протоколов электронной почты и должен быть реализован отдельно.

27

Объяснения того, что это от кодекса Стива Макконнелла Полного:

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

Некоторые из способов ее достижения от дяди Боба Чистый код:

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

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

Понятие сцепления сильно связано с понятием сцепления; Кроме того, существует принцип, основанный на эвристике высокой сплоченности, названной принципом единой ответственности (S от SOLID).

1

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

5

Сплоченность обычно измеряется с использованием одной из показателей LCOM (Отсутствие сплоченности), исходная метрика LCOM поступает из Chidamber и Kemerer. См. Например: http://www.computing.dcu.ie/~renaat/ca421/LCOM.html

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

Псевдокод сплоченного класса:

class FooBar { 
    private SomeObject _bla = new SomeObject(); 

    public void FirstMethod() { 
    _bla.FirstCall(); 
    } 

    public void SecondMethod() { 
    _bla.SecondCall(); 
    } 

    public void ThirdMethod() { 
    _bla.ThirdCall(); 
    } 
} 

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

Псевдо код плохо сплоченного класс:

class FooBar { 
    private SomeObject _bla = new SomeObject(); 
    private SomeObject _foo = new SomeObject(); 
    private SomeObject _bar = new SomeObject(); 

    public void FirstMethod() { 
    _bla.Call(); 
    } 

    public void SecondMethod() { 
    _foo.Call(); 
    } 

    public void ThirdMethod() { 
    _bar.Call(); 
    } 
} 

Класс делает один принцип вещи является Single Responsibility Principle, который приходит от Роберта С. Мартина и один из SOLID принципов. Принцип предписывает, что класс должен иметь только одну причину изменения.

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

0

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

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

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

Модуль может быть классом на объектно-ориентированном языке или функцией на функциональном языке или не-объектно-ориентированном языке, таком как C. Большая часть оригинальной работы в этой области измерения сплоченности в основном связана с работой с программами COBOL на IBM еще в 1970-х годах, поэтому сплоченность - это не просто объектно-ориентированная концепция.

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

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

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

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

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

Например функция, которая генерирует исключение или задает глобальные переменные ошибки (errno в C) или должны быть использованы в последовательности (strtok() функции представляет собой пример из стандартной библиотеки C, поскольку она поддерживает внутреннее состояние) или который предоставляет указатель, который затем должен управляться или выдает журнал для какой-либо утилиты журнала - все это примеры функции, которая больше не является функциональной связностью.

Я прочитал оригинальную книгу Твордона и Константина «Структурированное программирование», в которой я впервые натолкнулся на идею сплочения в 1980-х годах и книгу «Мейлир Пейдж-Джонс» «Практическое руководство по проектированию структурированных систем», а Пейдж-Джонс многое сделал лучше описать связь и сцепление. Книга Youdon и Constantine кажется немного более академичной. Книга Стив Макконнелл Code Complete довольно хороша и практична, и в пересмотренном издании есть немного сказать о хорошей практике программирования.

+0

Вы говорите: «Минимальный объем исходного кода, необходимый для создания выходов модуля, находится в модуле и не более», это не связано с Cohesion, а с [DTSTTCPW] (http://c2.com/xp/DoTheSimplestThingThatCouldPossiblyWork .html) –

+0

@ v.oddou, минимальный код действительно связан с Cohesion. Чем больше кода в модуле, не связанного с модулем, тем выше вероятность того, что код имеет побочные эффекты, следовательно, более низкое сцепление. Каждая концепция имеет разные перспективы, особенно такие понятия, как сплоченность, которые несколько неоднозначны. Измерения для Cohesion являются качественными, требующими своего рода нечеткой логики для выделения определенного модуля в одну или другую категорию с использованием какой-либо рубрики. Высказывание минимального кода для выходов не является достаточной характеристикой для высокой Cohesion только одной из нескольких. –