„Łączenie” to termin opisujący relacje między dwoma podmiotami w systemie oprogramowania (zwykle klasy).
Kiedy klasa korzysta z innej klasy lub komunikuje się z nią, mówi się, że „zależy” od tej innej klasy, a zatem klasy te są „sprzężone”. Co najmniej jeden z nich „wie” o drugim.
Chodzi o to, że powinniśmy starać się, aby sprzężenie między klasami w naszych systemach było jak najbardziej „luźne”: stąd „luźne sprzęganie” lub czasem „odsprzęganie” (chociaż w języku angielskim „odsprzęganie” oznaczałoby „brak sprzężenia”, ludzie często używają go do sugerowania „luźnego sprzężenia” między jednostkami).
A zatem: czym w praktyce jest luźne sprzężenie z silnym sprzężeniem i dlaczego powinniśmy tworzyć byty luźno sprzężone?
Sprzężenie opisuje stopień zależności między jednym bytem a drugim. Często klasy lub przedmioty.
Gdy klasa A zależy w dużej mierze od klasy B, szanse na zmianę klasy A przy zmianie klasy B są wysokie. To jest silne sprzężenie.
Jeśli jednak klasa A zależy w niewielkim stopniu od klasy B, to szanse na wpływ klasy A w jakikolwiek sposób na zmianę kodu klasy B są niewielkie. Jest to luźne sprzężenie lub relacja „oddzielona”.
Luźne sprzężenie jest dobre, ponieważ nie chcemy, aby elementy naszego systemu silnie od siebie zależały. Chcemy, aby nasz system był modułowy, dzięki czemu możemy bezpiecznie zmienić jedną część bez wpływu na drugą.
Kiedy dwie części są luźno połączone, są bardziej niezależne od siebie i rzadziej pękają, gdy inne się zmieniają.
Na przykład, budując samochód, nie chciałbyś, aby wewnętrzna zmiana silnika uszkodziła coś w kierownicy.
Chociaż nigdy nie zdarzyło się to przypadkiem przy budowie samochodu, podobne rzeczy przydarzyły się programistom przez cały czas. Luźne połączenie ma na celu zmniejszenie ryzyka takich zdarzeń.
Silne sprzęgło zwykle występuje, gdy jednostka A nie wie zbyt wiele na temat podmiotu B. Jeśli jednostka A sprawia, że zbyt wiele założeń dotyczących sposobu podmiot B działa i jak jest zbudowany, niż istnieje wysokie ryzyko, że zmiana podmiotu B wpłynie podmiot A. This jest dlatego, że jedno z jego założeń dotyczących bytu B jest teraz nieprawidłowe.
Wyobraź sobie na przykład, że jako kierowca przyjmujesz pewne założenia dotyczące działania silnika samochodu.
W dniu zakupu nowego samochodu z silnikiem, który działa inaczej (lub z jakiegoś powodu silnik został wymieniony), twoje wcześniejsze założenia byłyby błędne. Gdybyś był kodem na komputerze, byłby to teraz niepoprawny kod, który nie działa poprawnie.
Jeśli jednak wszystkie założenia, które kierowca poczynił na temat samochodów, brzmią następująco: A- mają koła kierownicy i B- mają pedały hamulca i gazu, to zmiany w samochodzie nie będą miały na ciebie wpływu, o ile twoje kilka założeń bądź poprawny. To luźne połączenie.
Ważną techniką uzyskania luźnego sprzężenia jest kapsułkowanie. Chodzi o to, że klasa ukrywa swoje wewnętrzne szczegóły przed innymi klasami i oferuje ściśle określony interfejs dla innych klas do komunikacji z nią.
Tak na przykład, jeśli zostały zdefiniowanie klasy samochodu, to interfejs (metody publiczne) będzie prawdopodobnie drive()
, stop()
, steerLeft()
, steerRight()
, getSpeed()
. Są to metody, które inne obiekty mogą wywoływać na obiektach Car.
Wszystkie inne szczegóły dotyczące klasy samochodu: sposób działania silnika, rodzaj zużytego paliwa itp. Są ukryte przed innymi klasami - aby zapobiec zbyt dużej wiedzy na temat samochodu.
W chwili, gdy klasa A wie zbyt wiele o klasie B: mamy silnie sprzężoną relację, w której klasa A jest zbyt zależna od klasy B, a zmiana w klasie B prawdopodobnie wpłynie na klasę A. Utrudnianie rozbudowy i utrzymania systemu.
Relacja między dwoma istotami, w której niewiele o sobie wiedzą (tylko to, co jest konieczne) - jest relacją luźno sprzężoną lub oddzieloną.