Что такое разделение и к каким направлениям развития оно может быть применено? [закрыто]

21

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

Под «где это может применяться» я имею в виду:

Относится ли это только к таким компилируемым языкам, как C и Java?

Должен ли я знать о / изучить его как веб-разработчик?


источник
Было бы полезно, если бы вы провели небольшое исследование и задали вопрос, основанный на каких-то неясных частях определения.
Джеффо
2
@JeffO - Я думаю, что мир извлекает выгоду из полных концептуальных вопросов так же, как и из конкретных нюансов. "Почему небо голубое?" позволяет ответам охватить саму концепцию, не вдаваясь в подробности деталей. Вот почему я пошел дальше и задал свой вопрос без исследований.
Какова конкретная проблема у вас? Как она стоит сейчас, ваш вопрос гораздо слишком широк. В нынешней форме ответом по существу является весь текст « Структурное проектирование: основы дисциплины проектирования компьютерных программ и систем» Эдварда Юдона и Ларри Константина .
Йорг Миттаг
Я думаю, что ответы здесь отлично справляются с описанием концепции. Это все равно, что спросить: «Каково определение этого слова в отношении программирования?». Как же оно слишком широкое? @ GlenH7
1
@ jt0dd Я бы согласился. То, что вы можете что-то объяснить с помощью книги, не означает, что нет смысла в более кратком ответе. С литературой по программированию люди часто заваливают вас деталями, прежде чем дать достойный обзор более высокого уровня. "Что такое ООП?" было бы слишком широким. Но это достаточно конкретная тема ИМО.
Эрик Реппен

Ответы:

57

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

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

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

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


Связывание описывает степень зависимости между одним объектом другим объектом. Часто классы или объекты.

Когда ClassA сильно зависит от ClassB, вероятность того, что ClassA будет изменен при изменении ClassB, высока. Это сильная связь.

Однако если ClassA слегка зависит от ClassB, то вероятность того, что ClassA каким-либо образом изменится в коде ClassB, невелика. Это слабая связь или «разъединенные» отношения.

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

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

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

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

Сильная связь обычно происходит , когда компания А знает слишком много о сущности B. Если компания А делает слишком много предположений о том , как компания Б работает или как он построен, чем существует высокий риск того, что изменение объекта B будет влиять на объект A. This потому что одно из его предположений о сущности B теперь неверно.

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

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

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


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

Так, например, если вы определения класса автомобиля, его интерфейс (общие методы), вероятно , будет drive(), stop(), steerLeft(), steerRight(), getSpeed(). Это методы, которые другие объекты могут вызывать на объектах Car.

Все остальные детали класса Car: как работает двигатель, какое топливо он использует и т. Д. Скрыты от других классов - чтобы они не знали слишком много об Car.

В тот момент, когда класс A знает слишком много о классе B: у нас есть сильно связанные отношения, где класс A слишком зависит от класса B, и изменение класса B, вероятно, повлияет на класс A. Создание системы сложно расширять и поддерживать.

Отношения между двумя сущностями, где они мало знают друг о друге (только то, что необходимо) - это слабо связанные или разъединенные отношения.

Авив Кон
источник
3

Разъединение, как правило, сводится к тому, чтобы понять, нужно ли двум вещам тесно взаимодействовать друг с другом или же можно сделать их независимыми. Независимость велика, потому что она позволяет легко изменить или использовать эти вещи в другом месте. Разъединение может применяться во многих областях, не только в развитии, и это особенно верно для временного разъединения, которое может даже применяться в вашей повседневной жизни (в некоторой степени). Также следует отметить, что при разработке программного обеспечения необходимо учитывать много типов связей, и не все будут рассмотрены в ответе. Вы должны будете сделать свое исследование.

Две вещи, A и B , связаны, если между ними есть зависимость. Если A зависит от B, вы можете использовать B без учета A. Если вы хотите использовать A, вам также придется перенести B, так как A зависит от него.

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

Это, вероятно, самый распространенный тип связи в дикой природе:

//Inside a class meant to display info for a particular Facebook user.
void DisplayFriends(FacebookUser user, FacebookClient client)
{
     Friend[] = (Friend[])client.GetConnection().ExecuteCommandForResult("getFriends:" + user.Name);
     ...
}

Здесь DisplayFriends без необходимости вручную работает с подключением за клиентом Facebook, чтобы получить то, что ему нужно. DisplayFriendsКласс связан с обоими FacebookClientи Connection. Если FacebookClient внезапно изменит тип используемого подключения, приложение больше не сможет найти друзей на Facebook. Мы можем удалить связь между классом DisplayFriends и Connection, попросив FacebookClient предоставить нам то, что нам нужно.

//Inside a class meant to display info for a particular Facebook user.
void DisplayFriends(FacebookUser user, FacebookClient client)
{
     Friend[] = client.GetFriends(user);
     ...
}

Теперь нас не волнует, как FacebookClient получает наших друзей. Все, что нас действительно волнует, так это то, что они их получают. Любое изменение, внесенное в его внутреннее поведение, не повредит нашему классу.

Такого рода развязка может быть легко достигнута, следуя Закону Деметры для функций, который гласит (цитируя Википедию):

Закон Деметры для функций требует, чтобы метод m объекта O мог вызывать только методы следующих типов объектов:

  • О себе
  • параметры м
  • Любые объекты, созданные / созданные в течение м
  • Прямые составляющие объекты О
  • Глобальная переменная, доступная O, в области видимости m

Поскольку я упомянул о временной связи в начале ответа, я кратко опишу его.

Временная связь обычно учитывается при разработке приложений, которые выполняют алгоритмы параллельно. Рассмотрим два исполняемых модуля (будь то фактические инструкции, методы или все, что вы хотите считать модулем), A и B. Мы говорим, что A временно связан с B, если B должен быть выполнен до выполнения A. Если A временно не связан с B, A и B могут выполняться одновременно. Создайте свой собственный пример для этого: подумайте об обычных вещах, которые вы делаете в своей повседневной жизни. Есть ли две вещи, которые вы делаете один за другим, но вы могли бы сделать одновременно?

Наконец, чтобы ответить на ваш последний бит:

Должен ли я знать о / изучить его как веб-разработчик?

Да. Например, один из самых популярных шаблонов дизайна для веб-разработки (MVC) - это разделение.


источник
1

Другие ответы хорошо описывают, что такое разделение. Я хотел обсудить ваш последний вопрос.

Должен ли я знать о / изучить его как веб-разработчик?

Ответ решительный да. Неважно, какой вы разработчик. Вы можете быть веб-разработчиком или разработчиком встроенных систем.

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

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

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

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