Качество кода: слабое связывание и высокая сопряженность (Low coupling and High Cohesion)

Публикация № 1191718

Методология - Рефакторинг и качество кода

Высокое сопряжение Слабое связывание Паттерны проектирования Low coupling High Cohesion

Поговорим о некоторых общепринятых подходах и принципах разработки кода.

Вступление:

И так здравствуйте меня зовут Крючков Владимир Вячеславович. Сегодня я хочу поднять актуальный и фундаментальный вопрос в процессе разработки – Слабое связывание и Высокое сопряжение/зацепление. Узнаем что из себя представляет спагетти-код и как от него избавиться. И в конце приведу 7-8 принципов для создания хорошего и качественного кода в разработке.

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

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

О чем речь?

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

На самом деле это принцип взят и теории ООП. Эти два принципа входят в аббревиатуру GRASP. В 1С нет как таковы классов, но описанные принципы можно применить и к языку 1С Enterprise.

Шаблоны GRASP.

Это два шаблона из GRASP (англ. general responsibility assignment software patterns — общие шаблоны распределения ответственностей). 

Их всего девять. Некоторые выделяют 5 основных и 4 дополнительных.

  • Информационный эксперт (Information expert)
  • Создатель (Creator)
  • Контроллер (Controller)
  • Слабое связывание (Low Coupling)
  • Высокое сопряжение (High Cohesion) 
  • Полиморфизм (Polymorphism)
  • Чистая выдумка (Pure Fabrication)
  • Посредник (Indirection)
  • Устойчивость к изменениям (Protected Variation)

Мы сегодня поговорим про два из них – слабое связывание и высокое сопряжение.

Что за сущность класс в 1С?

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

  • Обработка (реквизиты, ТЧ, модуль объекта)
  • Комбинацию из общих модулей и объектов метаданных (справочники, документы, регистры)
  • Отдельный общий модуль, отдельный объект метаданных
  • Расширения – вот это на текущий момент самая близкая аналогия

И так начнем!

Слабое связывание.

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

Проблема

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

Как обеспечить независимость, незначительное влияние изменений и повысить возможность повторного использования?

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

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

Пример: все знают БСП? Вот я вспоминаю один случай, когда они изменили местоположение функции «Текущий пользователь» из общего модуля «Общего Назначения» в «Пользователи», то пришлось перелопатить всю конфигурацию, когда мы накатывали обновление БСП, т.е. они нарушили принцип «открытый/закрытый» об этом речь пойдет ниже.

Что значит повторное использование кода – это значит, что я пишу функцию или процедуру не для одного случая и называю ее «Получить Реквизит Сумма Заказа Клиента», а «Получить Реквизиты Объекта». В результате я смогу вызывать ее многократно и не писать каждый раз новый код, замусоривая конфигурацию (вспоминаем про рефакторинг).

Решение.

Требуется распределять обязанности, чтобы степень связанности осталась низкой.

 

I) Слабая связанность. 

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

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

Ниже приведу примеры по типу плохо и хорошо.

Найди нужную нить!

Если элементы сильно связаны, то любое их изменение приводит к изменению во всех связанных объектах. Слабо проследить нить решения?

Возможен взрыв мозга.

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

Если все распутать

Чем меньше элемент знает о соседях, тем лучше. 

Но вот котику видимо не понять. Уверен, что первая ситуация с клубком нитей -  его работа!

Проблемы высокой связанности.

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

  • Изменения в других модулях/объектах приводят к изменению в локальном текущем и наоборот.
  • Затрудняет понимание каждого модуля в отдельности
  • Усложняет повторное использование, так как требует анализа взаимосвязей

Сильное связывание. Пример.

Посмотрите на пример и увидите одну из самых плохих ситуаций, которые вызывает следование принципу создание высоких связей в коде. Оба модуля переплетены максимально и взывают функции и процедуры из друг друга. А теперь представьте, что этих модулей 1000 как в ERP! 

Лучше слабое связывание. Пример.

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


Хочу отметить, что четкого требования делать все слабо связанно нет, но стремиться к такой ситуации необходимо всегда.

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

II) Высокая сопряженность.

И так вторая сущность — это высокая сопряженность или зацепление – перевод с английского. Текущая заставка должна направить ваше мышление на то, о чем пойдет далее речь.

Проблема

Рассмотрим проблему/задачу, сформулированную следующим образом:

Как обеспечить возможность управления сложностью?

Хотим обеспечить возможность управления сложностью? Звучит фантастически, но хорошо)

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

Решение.

Распределять обязанности, поддерживающие высокую сопряженность/зацепление (сгруппированность).

Сильное сопряжение. Определение.

Сопряженность/зацепление (в основном функциональное зацепление) – это мера связанности и сфокусированности обязанностей. 

Т.е. у нас есть группировка по функциональному (самый оптимальный), логической, структурной и др. принципу.

Пример Бардак.

Представьте себе магазин, в который вы пришли за покупками (пончики, лимоны и кофе). А у них пронесся ураган, и вместо сгруппированных по полочкам и отделам/рядам стеллажам валяется как попало и вперемешку. И вот в этом бардаке вам надо найти лимон, кофе и пончики. А магазин размером с АШАН?

Ваш код тоже похож на вот это?

Порядок.

Но лучше все же так. Вон видите указатель на кофе, а вон бакалея и пончики!

Слабое сопряжение проблемы.

Слабое сопряжение привносит нам следующий перечень проблем:

  • Трудность понимания
  • Сложность при повторном использовании
  • Сложность поддержки
  • Ненадежность, постоянная подверженность изменениям

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

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


Выдохнули. Немного котиков, чашку чая, отвлекитесь. 

Сейчас было тяжело. Не так конечно, как мне вчера в 23 часа вечера, но тоже не просто) Вопросы? Передохнули? Продолжаем?

Как вы думаете к чему приведет использование антирекомендаций – сильное связывание и слабое сопряжение? Смотрите ниже, чтобы знать ответ.

III) Спагетти код и распутывание

Спагетти код и макаронная архитектура.

Ага это спагетти код и макаронная архитектура - «bone appétit».

Рецепт

И так вот вам рецепт хороших макарон, но плохого кода. 

Распутываем. Иерархическая декомпозиция.

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

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


 
Распутываем. Модульность.

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

 
Распутываем. Дао хорошей разработки.

И так переходим к заключительной части. Это некоторые правила хорошего тона, которые вы должны помнить и всегда вспомнить при разработке кода. Я специально нашел картинки и придумал/нашел ассоциации чтобы они вам запомнились.


 

Поехали… 

1) Будь скромным

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

К примеру, мы сделали экспортную в модуле формы или глобальную переменную. Теперь ее начали использовать в коде и что получаем? Если мы захотим ее переименовать, то придется менять ее вызовы и использование во всех точках кода!

Правильно сделать экспортную функцию, которую вызвать. В ООП – это запрет использовать public везде, у нас это экспорт и непосредственное обращение к регистрам и т.д.

 

Будь скромным. Пример плохой

Вот так делать нельзя. Пример с усилением акцента, но так тоже пишут.


Будь скромным. Пример правильно

Вот так делать правильнее! Используем шаблон наблюдатель.


2) Принцип минимальности.
 

Идеальная функция, процедура обладает следующими свойствами:

  • Один вход и один выход;
  • Одна решаемая задача

 

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


3) Закон Деметры.

Если «А» знает «Б», а «Б» знает «С», то «А» не должна знать про «С».

Это один из принципов противодействия запутыванию кода.

 
Закон Деметры. Пример

 

Если модуль «Заказ клиента» вызывает модуль «Продажи», а «Продажи» вызывает модуль «Лимиты», то «Заказ клиента» не должен вызывать функции модуля «Лимиты».

 

4) Не смотри на медузу Горгону
 

Смотри на объекты через «зеркало» интерфейсов

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

 

Не смотри на медузу Горгону. Пример плохой код

Плохо непосредственно обращаться к данным. Т.е. этим образом вы сразу нарушаете принцип слабого связывания.


Не смотри на медузу Горгону. Пример хороший код

Правильно работать через интерфейсы.

 
5) Разделяй и властвуй.

 

Используй декомпозицию - разделяй сложные/огромные функции монстры на части

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

 

6) Гусь свинье не товарищ.

 

Процедуры и функции должны группироваться или объединяться по некоторой общности.

Тут думаю понятно свалка и бардак всегда плохо. Высокое сопряжение нам тут поможет.

 

7) Принцип открытости и закрытости.
 

Будьте открыты для всего нового в будущем, но не переписывайте прошлое.

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

 

8) Мысли паттернами.

 

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

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

 

Заключение. Инь и Янь.
 

Связывание и зацепление — это «Инь» и «Янь» проектирования ПО.

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

Про качество кода я рассказывал в этих статьях:


 

Специальные предложения

Автор запретил комментарии

См. также

Как контролировать качество внешних обработок, отчетов, правил обмена, расширений 1С и поставить это на поток

Рефакторинг и качество кода Бесплатно (free)

Если код написан качественно, его легче развивать и дешевле поддерживать. О том, как организовать контроль качества кода в ручном и автоматическом режиме, и какие инструменты могут в этом помочь, на INFOSTART MEETUP Новосибирск.Online рассказал Олег Тымко.

09.04.2021    2608    olegtymko    25    

Ускорение расчета себестоимости УПП 1.3 в несколько раз

Закрытие периода Рефакторинг и качество кода v8 УПП1 БУ УУ Бесплатно (free)

Как определить причину медленного расчёта себестоимости в УПП 1.3, один из вариантов поиска проблем производительности с помощью инструментов 1С и ускорения расчёта средствами встроенного языка

02.02.2021    2432    RPGrigorev    19    

Реальный кейс по внедрению CodeReview

Рефакторинг и качество кода v8 1cv8.cf Бесплатно (free)

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

20.01.2021    1200    Alexsandr_Retunskiy    3    

Операторы перехода в программном коде: использовать или нет?

Рефакторинг и качество кода v8 1cv8.cf Бесплатно (free)

Рассмотрим ситуации использования операторов перехода Перейти (GoTo), Возврат (Return), Прервать (Break), Продолжить (Continue). Как вы считаете - это дурной тон, нормальная практика или зависит от ситуации?

16.11.2020    2165    ivanov660    22    

Чистый кот (Clean cat)

Рефакторинг и качество кода v8 1cv8.cf Бесплатно (free)

От автора легендарного бестселлера "Совершенный кот".

04.11.2020    1641    vasilev2015    25    

Доработайте это "немедленно", или как уменьшить доработки конфигурации

Рефакторинг и качество кода v8 Россия Бесплатно (free)

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

25.09.2020    3814    Богатырев Артур    20    

Метод борьбы с большим количеством комментариев в коде

Практика программирования Рефакторинг и качество кода v8 1cv8.cf Бесплатно (free)

Решил поделиться нашим способом борьбы с сильно закомментированным кодом.

08.09.2020    1353    tambu    9    

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

Рефакторинг и качество кода v8 Бесплатно (free)

Наличие в 1С-решениях некачественного кода мешает их поддержке и эффективному развитию. Как добиться соблюдения стандартов разработки при написании кода и внедрить бюджетный Code Review с помощью инструментария на основе АПК (Автоматизированной проверки конфигураций) на конференции Infostart Event 2019 Inception рассказал технический руководитель компании Бизнес Лоджик Иван Козлов.

22.06.2020    3508    kozlov.alians    1    

Молчание "best practices": тестовые и эталонные данные, структура и связность, падения и новая функциональность, и другие неудобные вопросы к сценарному тестированию

Рефакторинг и качество кода Сценарное тестирование v8 Бесплатно (free)

Непонимание некоторых базовых вопросов мешает программистам начать применять инструменты тестирования в процессе разработки для 1С. Как разобраться в терминологии и интегрировать процесс тестирования в разработку 1С-решений на конференции Infostart Event 2019 Inception рассказал руководитель отдела разработки компании C.T.Consultants Решитко Дмитрий.

29.05.2020    4627    grumagargler    14    

Рефакторинг в редакторе модулей

Рефакторинг и качество кода v8 1cv8.cf Бесплатно (free)

Для тех, кто не пользуется Ctrl+Alt+R. “Контролируемый процесс улучшения кода без написания новой функциональности”, “Равносильное преобразование алгоритмов” и т.п в данной статье НЕ рассматриваются. Тема статьи: замечательные команды из подменю Рефакторинг контекстного меню редактора модулей в конфигураторе. В статье описано, как команды из подменю Рефакторинг помогают при написании кода

10.03.2020    4306    pparshin    5    

Качество кода: Поведенческие паттерны проектирования

Рефакторинг и качество кода v8 Бесплатно (free)

Поговорим про применение паттернов проектирования в разработке на 1С.

03.03.2020    7953    ivanov660    0    

Боремся с запросами в циклах. Мой опыт рефакторинга запросов

Рефакторинг и качество кода v8::Запросы 1cv8.cf Бесплатно (free)

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

02.03.2020    7743    aximo    55    

Как управлять качеством кода 1С, используя платформу SonarQube

Рефакторинг и качество кода Инструментарий разработчика Бесплатно (free)

При быстром росте функциональности проводить визуальный Code-Review для обнаружения некачественного кода проблематично. О том, как автоматизировать проверку качества кода 1С с помощью платформы SonarQube на конференции Infostart Event 2019 Inception рассказал ведущий разработчик компании «Командор» Олег Тымко.

30.12.2019    9842    olegtymko    10    

Стабильность превыше всего

Рефакторинг и качество кода v8 Бесплатно (free)

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

07.11.2019    9870    YPermitin    40    

Оценка скорости кода. Сложность алгоритма

Практика программирования Рефакторинг и качество кода v8 1cv8.cf Бесплатно (free)

Эта тема одной из первых всплывает на собеседовании программистов языков вроде Java и C, но она почти неизвестна в "мире 1С". Поговорим о вычислительной сложности алгоритмов.

07.10.2019    5820    m-rv    12    

Управление качеством кода

Математика и алгоритмы Рефакторинг и качество кода v8 Бесплатно (free)

О SonarQube, АПК, EDT. Какие преимущества дает их использование. Для каких команд подходит.

22.07.2019    18158    Stepa86    35    

Как завести у себя в команде код-ревью. Отвечаем на вопросы

Рефакторинг и качество кода Бесплатно (free)

Дадим советы как начать использовать у себя в команде код-ревью (code-review), а также ответим на вопросы читателей.

17.07.2019    10838    ivanov660    30    

По следам код-ревью

Рефакторинг и качество кода v8 Бесплатно (free)

Приведу примеры с картинками и небольшим пояснением по вопросам, связанным с код-ревью (обзором кода).

09.07.2019    13405    ivanov660    110    

Управляй качеством кода 1С с помощью SonarQube

Рефакторинг и качество кода SonarQube Россия Бесплатно (free)

Управляй техническом долгом проектов 1С с помощью SonarQube. В статье рассматривается пример применения SonarQube при разработке.

07.07.2019    48232    olegtymko    235    

Что такое рефакторинг и в чем его цели

Практика программирования Рефакторинг и качество кода v8 Бесплатно (free)

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

30.10.2018    12351    eu_genij    34    

Повышение качества разработки. Статья 3. Ошибки программы

Практика программирования Математика и алгоритмы Рефакторинг и качество кода Бесплатно (free)

Учебный курс по теории и практике программирования. Бесплатно. В виде структурированного текста. Статья 3. Эта статья посвящена ошибкам программ, их классификации и способам исправления.

10.07.2018    20924    Артано    92    

Как писать неподдерживаемый код

Практика программирования Рефакторинг и качество кода Бесплатно (free)

Вы хотите чтобы Вы были самым ценным сотрудником компании? Чтобы Вас носили на руках? Тогда эта статья для Вас. Эти знания передаются из поколения в поколение и представляют особую ценность в умелых руках.

25.08.2015    23278    vandalsvq    63    

Типичные ошибки, некоторые вопросы качества и эффективности работы при разработке в 1С

Практика программирования Рефакторинг и качество кода Бесплатно (free)

В этой статье мы приведем набор типичных и часто встречающихся ошибок при разработке в 1С (скорее всего особенно актуально для начинающих программистов). Предложим набор советов и рекомендаций по улучшению качества кода и работы при использовании типового инструментария. Это первая часть из 24 пунктов. Бонусом к каждому пункту мы привели разъяснения и комментарии.

15.02.2015    24285    ivanov660    40    

Как повысить качество разработки своих проектов под 1С?

Управление проектом Рефакторинг и качество кода Бесплатно (free)

Здравствуйте уважаемые коллеги. Мы – небольшое франчайзи (4 человека), которое занимается разработкой под 1С вот уже более 2х лет. После первого года работы возникли некоторые проблемы с качеством кода, поскольку начался стремительный рост сложности проектов и, соответственно, начало появляться большое количество неприятных ошибок. В статье я постараюсь рассказать о тех мерах, которые мы приняли для повышения производительности труда программиста и качества написанного им кода. Кому интересно прошу под кат.

11.03.2013    25934    akomar    80    

Мастер-класс от Poppy (практикум по рефакторингу)

Практика программирования Рефакторинг и качество кода v8 1cv8.cf Россия Бесплатно (free)

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

04.11.2008    18821    poppy    33    

Основы менеджмента кода в 1С

Математика и алгоритмы Практика программирования Рефакторинг и качество кода Россия Бесплатно (free)

Продолжаем тему рефакторинга, начатую на примере "Глокой Куздры" Итак, каковы основные принципы поддержания кода в рабочем состоянии?

17.10.2008    33097    keleg    194