Что такое "слабая связь"? Пожалуйста, приведите примеры - PullRequest
164 голосов
/ 22 октября 2008

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

Кто-нибудь покажет какой-нибудь код "до" и "после" (или псевдокод), который иллюстрирует эту концепцию?

Ответы [ 20 ]

5 голосов
/ 03 октября 2016

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

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

Legos, игрушки, которые SNAP вместе, будут считаться слабо связанными, потому что вы можете просто соединить их вместе и построить любую систему, какую захотите. Тем не менее, головоломки имеют кусочки, которые тесно связаны между собой. Вы не можете взять кусок из одной головоломки (системы) и вставить его в другую головоломку, потому что система (головоломка) очень зависит от очень специфических частей, которые были построены специально для этого конкретного «дизайна». Legos построены более общим образом, так что их можно использовать в вашем Lego House или в моем Lego Alien Man.

Ссылка: https://megocode3.wordpress.com/2008/02/14/coupling-and-cohesion/

4 голосов
/ 23 октября 2008

Два компонента сильно связаны, когда они зависят от конкретной реализации друг друга.

Предположим, у меня есть этот код где-то в методе в моем классе:

this.some_object = new SomeObject();

Теперь мой класс зависит от SomeObject, и они сильно связаны. С другой стороны, допустим, у меня есть метод InjectSomeObject:

void InjectSomeObject(ISomeObject so) { // note we require an interface, not concrete implementation
  this.some_object = so;
}

Тогда в первом примере можно просто использовать введенный SomeObject. Это полезно во время тестирования. При нормальной работе вы можете использовать тяжелые классы, использующие базу данных, сетевые классы и т. Д., В то время как для тестов, проходящих легкую, фиктивную реализацию. С помощью тесно связанного кода вы не сможете этого сделать.

Некоторые части этой работы можно упростить, используя контейнеры для внедрения зависимостей. Вы можете прочитать больше о DI в Википедии: http://en.wikipedia.org/wiki/Dependency_injection.

Иногда легко зайти слишком далеко. В какой-то момент вы должны конкретизировать вещи, иначе ваша программа станет менее читаемой и понятной. Поэтому используйте эту технику в основном на границе компонентов и знайте, что вы делаете. Убедитесь, что вы используете слабую связь. Если нет, то вам, вероятно, не нужно это в этом месте. Я могу сделать вашу программу более сложной. Убедитесь, что вы делаете хороший компромисс. Другими словами, поддерживать хороший баланс. Как всегда при проектировании систем. Удачи!

3 голосов
/ 20 марта 2014

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

3 голосов
/ 23 октября 2008

В информатике есть еще одно значение для "слабой связи", о которой никто больше не писал здесь, так что ... Здесь - надеюсь, вы дадите мне несколько голосов, так что это не потеряно в нижней части куча! ОБЯЗАТЕЛЬНО, тема моего ответа относится к любому исчерпывающему ответу на вопрос ... К:

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

Термин «система» может сбивать с толку, поэтому, пожалуйста, внимательно проанализируйте ситуацию.

Обычно, но не всегда, несколько ЦП в аппаратной конфигурации, в которой они существуют в одной системе (как в отдельных блоках "ПК"), будут тесно связаны. За исключением некоторых сверхвысокопроизводительных систем, которые имеют подсистемы, которые на самом деле разделяют основную память между «системами», все делимые системы слабо связаны.

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

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

  • VaxClusters
  • Кластеры Linux

Напротив, некоторые примеры из тесно спаренных:

  • Semetrical-Multi-Processing (SMP) Операционные системы - например, Fedora 9
  • Многопоточные процессоры
  • многоядерные процессоры

В современных вычислениях примеры работы в одной общей системе не редкость. Например, возьмем современные двухъядерные или четырехъядерные процессоры Pentium, работающие под управлением Fedora 9 - это тесно связанные вычислительные системы. Затем объедините несколько из них в слабо связанный Linux Cluster, и теперь у вас есть и слабо и тесно связанные вычисления! О, разве современное оборудование не прекрасно!

3 голосов
/ 22 октября 2008

Рассмотрим приложение для Windows с FormA и FormB. FormA является основной формой и отображает FormB. Представьте себе, что FormB необходимо передать данные своему родителю.

Если вы сделали это:

class FormA 
{
    FormB fb = new FormB( this );

    ...
    fb.Show();
}

class FormB 
{
    FormA parent;

    public FormB( FormA parent )
    {
        this.parent = parent;
    }     
}

FormB тесно связан с FormA. У FormB не может быть другого родителя, кроме родительского типа FormA.

Если, с другой стороны, FormB опубликовал событие и подписал FormA на это событие, то FormB может отправить данные обратно через это событие любому подписчику, имеющему это событие. Тогда в этом случае FormB даже не знает, что говорит с родителем; через слабую связь событие обеспечивает просто общение с подписчиками. Любой тип теперь может быть родительским для FormA.

рп

2 голосов
/ 06 января 2015

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

--- A.java ---

package interface_package.loose_coupling;

public class A {

void display(InterfaceClass obji)
{
    obji.display();
    System.out.println(obji.getVar());
}
}

--- B.java ---

package interface_package.loose_coupling;

public class B implements InterfaceClass{

private String var="variable Interface";

public String getVar() {
    return var;
}

public void setVar(String var) {
    this.var = var;
}

@Override
public void display() {
    // TODO Auto-generated method stub
    System.out.println("Display Method Called");
}
}

--- InterfaceClass ---

package interface_package.loose_coupling;

public interface InterfaceClass {

void display();
String getVar();
}

--- MainClass ---

package interface_package.loose_coupling;

public class MainClass {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    A obja=new A();
    B objb=new B();
    obja.display(objb);     //Calling display of A class with object of B class 

}
}

Пояснение:

В приведенном выше примере у нас есть два класса A и B

Класс B реализует интерфейс, т.е. InterfaceClass.

InterfaceClass определяет Контракт для класса B, так как InterfaceClass имеет абстрактные методы класса B, к которым может обращаться любой другой класс, например A.

В классе A у нас есть метод отображения, который может исключать объект класса, который реализует InterfaceClass (в нашем случае это класс B). И на этом объекте метод класса A вызывает display () и getVar () класса B

В MainClass мы создали объект классов A и B. И вызвали метод отображения A, передав объект класса B, т.е. objb. Метод отображения A будет вызван с объектом класса B.

Теперь поговорим о слабой связи. Предположим, что в будущем вам придется изменить имя класса B на ABC, тогда вам не нужно менять его имя в методе отображения класса B, просто создайте объект new (класс ABC) и передайте его методу отображения в MailClass. Вам не нужно ничего менять в классе A

ref: http://p3lang.com/2013/06/loose-coupling-example-using-interface/

2 голосов
/ 15 ноября 2012

Я предлагаю очень простой Тест сцепления кода :

  1. Кусок А кода тесно связан с Куском В кода, если существует какая-либо возможная модификация Куска В, которая приведет к изменениям в Куске А для сохранения правильности.

  2. Кусок А кода не плотно связан с Куском В кода, если не существует возможной модификации Куска В, которая бы потребовала изменения к Куску А.

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

2 голосов
/ 31 декабря 2008

Несколько длинных ответов здесь. Принцип очень прост, хотя. Я отправляю вступительное заявление из Википедии :

"Слабая связь" описывает упругую связь между двумя или более системами или организациями с какими-то отношениями обмена.

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

0 голосов
/ 22 октября 2008

Вы можете узнать больше об общей концепции «слабая связь» .

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

0 голосов
/ 22 октября 2008

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

Надеюсь, это несколько полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...