Термин «сплоченность» изначально использовался для описания модулей исходного кода как качественной меры того, насколько хорошо исходный код модуля связан друг с другом. Идея сплоченности используется в самых разных областях. Например, группа людей, такая как военное подразделение, может быть сплоченной, что означает, что люди в подразделении работают вместе для достижения общей цели.
Суть согласованности исходного кода заключается в том, что исходный код в модуле работает вместе для достижения общей, четко определенной цели. Минимальный объем исходного кода, необходимый для создания выходных данных модуля, находится в самом модуле и не более. Интерфейс хорошо определен, и входные данные проходят через интерфейс, а выходы - обратно через интерфейс. Побочных эффектов нет, упор сделан на минимализм.
Преимущество функционально связанных модулей заключается в простоте разработки и автоматизации модульных тестов. Фактически, хорошей мерой сплоченности модуля является то, насколько легко создать полный набор исчерпывающих модульных тестов для модуля.
Модуль может быть классом на объектно-ориентированном языке или функцией на функциональном языке или не объектно-ориентированном языке, таком как C.Большая часть оригинальной работы в этой области измерения сплоченности в основном включала работу с программами COBOL в IBM еще в те времена. 1970-е годы, поэтому сплоченность - это определенно не просто объектно-ориентированная концепция.
Первоначальная цель исследования, на основе которого возникла концепция сплоченности и связанная с ней концепция связанности, заключалась в том, чтобы выяснить, какие характеристики программ легко понять, поддерживать и расширять. Цель заключалась в том, чтобы научиться лучшим практикам программирования, систематизировать эти лучшие практики, а затем обучить этим методам других программистов.
Цель хороших программистов - написать исходный код, связность которого будет как можно более высокой с учетом среды и решаемой проблемы. Это означает, что в большом приложении некоторые части тела исходного кода будут отличаться от других частей в отношении уровня связности исходного кода в этом модуле или классе. Иногда лучшее, что вы можете получить, - это временная или последовательная сплоченность из-за проблемы, которую вы пытаетесь решить.
Наилучший уровень сплоченности - это функциональная сплоченность. Модуль с функциональной связностью похож на математическую функцию в том, что вы предоставляете набор входных данных и получаете конкретный результат. По-настоящему функциональный модуль не будет иметь побочных эффектов в дополнение к выходным данным и не будет поддерживать какое-либо состояние. Вместо этого он будет иметь четко определенный интерфейс, который инкапсулирует функциональность модуля, не раскрывая какие-либо внутренние компоненты модуля, а человек, использующий модуль, предоставит определенный набор входных данных и получит в ответ конкретный выход. По-настоящему функциональный модуль также должен быть потокобезопасным.
Многие библиотеки языков программирования содержат ряд примеров функциональных модулей, будь то классы, шаблоны или функции. Наиболее функциональными связными примерами могут быть математические функции, такие как sin, косинус, квадратный корень и т. Д.
Другие функции могут иметь побочные эффекты или поддерживать какое-либо состояние, что усложняет использование этих функций.
Например, функция, которая генерирует исключение или устанавливает глобальную переменную ошибки ( errno
в C) или должна использоваться в последовательности ( strtok()
функция является примером из стандартной библиотеки C, поскольку она поддерживает внутреннее состояние) или которая предоставляет указатель, который затем должен быть управляемым или выдает журнал какой-либо служебной программе журнала - все это примеры функции, которая больше не является функциональной связностью.
Я прочитал оригинальную книгу Юрдона и Константина «Структурированное программирование», где я впервые натолкнулся на идею сплоченности в 1980-х годах, и книгу Мейлир Пейдж-Джонс «Практическое руководство по проектированию структурированных систем», и Пейдж-Джонс проделал гораздо лучшую работу по описанию как сцепление, так и сплоченность. Книга Юрдона и Константина кажется немного более академичной. Книга Стива МакКоннелла «Code Complete» довольно хороша и практична, и в ее исправленном издании есть что сказать о хорошей практике программирования.