Niedawno zauważyłem odsprzęganie jako temat w pytaniu i chcę wiedzieć, co to jest i gdzie może mieć zastosowanie.
Przez „gdzie to może mieć zastosowanie” mam na myśli:
Czy ma to znaczenie tylko wtedy, gdy dotyczą skompilowanych języków, takich jak C i Java?
Czy powinienem wiedzieć / studiować jako programista?
Odpowiedzi:
„Łą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ą.
źródło
Oddzielenie polega zasadniczo na sprawdzeniu, czy dwie rzeczy muszą ściśle ze sobą współpracować, czy też mogą zostać dodatkowo uniezależnione. Niezależność jest świetna, ponieważ sprawia, że te rzeczy można łatwo zmienić lub użyć gdzie indziej. Oddzielenie można zastosować w wielu obszarach, nie tylko rozwojowych, a dotyczy to zwłaszcza oddzielania czasowego, które można zastosować nawet w życiu codziennym (do pewnego stopnia). Należy również zauważyć, że istnieje wiele rodzajów sprzężeń w rozwoju oprogramowania, które należy wziąć pod uwagę, i nie wszystkie zostaną uwzględnione w odpowiedzi. Będziesz musiał przeprowadzić badania.
Dwie rzeczy, A i B , są sprzężone, jeśli istnieje między nimi zależność. Jeśli A zależy od B, możesz użyć B bez uwzględnienia A. Jeśli chcesz użyć A, musisz również przenieść B, ponieważ A zależy od tego.
Podczas tworzenia oprogramowania zwykle nie można całkowicie usunąć sprzężenia między komponentami. Odsprzężenie w tym kontekście zwykle oznacza rozluźnienie istniejącego sprzężenia. To znaczy upewniając się, że każdy komponent wie jak najmniej o innych komponentach wokół niego.
Jest to prawdopodobnie najczęstszy rodzaj sprzężenia występujący na wolności:
DisplayFriends niepotrzebnie ręcznie obsługuje połączenie za klientem Facebooka, aby uzyskać to, czego potrzebuje.
DisplayFriends
klasa jest sprzężona zarówno z, jakFacebookClient
iConnection
. Jeśli FacebookClient nagle zmieni rodzaj używanego połączenia, aplikacja nie będzie już mogła uzyskać znajomych na Facebooku. Możemy usunąć sprzężenie między klasą DisplayFriends a połączeniem, prosząc FacebookClient o dostarczenie tego, czego potrzebujemy.Teraz nie obchodzi nas, w jaki sposób FacebookClient zdobywa naszych przyjaciół. Wszystko, na czym nam zależy, to fakt, że je dostanie. Wszelkie zmiany w jej wewnętrznym zachowaniu nie zaszkodzą naszej klasie.
Tego rodzaju oddzielenie można łatwo osiągnąć, przestrzegając Prawa Demetera dla funkcji, co mówi (cytując Wikipedię):
Ponieważ wspomniałem o sprzężeniu czasowym na początku odpowiedzi, krótko go opiszę.
Sprzężenie czasowe jest zwykle brane pod uwagę przy projektowaniu aplikacji wykonujących algorytmy równolegle. Rozważ dwie wykonywalne jednostki (rzeczywiste instrukcje, metody lub cokolwiek, co chcesz uznać za jednostkę), A i B. Mówimy, że A jest tymczasowo sprzężone z B, jeśli B musi zostać wykonane przed wykonaniem A. Jeśli A nie jest tymczasowo sprzężony z B, A i B można wykonać jednocześnie. Zbuduj swój własny przykład: pomyśl o zwykłych rzeczach, które robisz w życiu codziennym. Czy są jakieś dwie rzeczy, które robisz jedna po drugiej, ale możesz to robić jednocześnie?
Wreszcie, aby odpowiedzieć na ostatnią chwilę:
Tak. Na przykład jeden z najpopularniejszych wzorców projektowych do tworzenia stron internetowych (MVC) polega na rozdzielaniu.
źródło
Inne odpowiedzi dobrze opisują, co to jest oddzielenie. Chciałem przedyskutować twoje ostatnie pytanie.
Odpowiedź jest zdecydowanie tak. Nie ma znaczenia, jakim jesteś programistą. Możesz być programistą WWW lub programistą systemów wbudowanych.
Załóżmy, że masz klasę, która generuje niestandardowe adresy URL, które są umieszczane na Twojej stronie internetowej. Możesz mieć pokusę, aby klasa zapisała adresy URL bezpośrednio na stronie, umieszczając je w hrefie tagu. Na początku może się to wydawać prostsze. Ale co się dzieje, gdy trzeba wprowadzić zmiany, aby umieścić linki w wiadomości e-mail i wysłać je do użytkownika? Twój obecny kod nie działałby, ponieważ generator adresów URL jest ściśle powiązany z używaną strukturą internetową.
Lepszą opcją byłoby posiadanie klasy generatora adresów URL, która zwraca adres URL jako ciąg znaków. Może to być wykorzystane przez Twój kod internetowy i może być również wykorzystane przez Twój kod e-mail. Może się wydawać, że więcej pracy wymaga oddzielenie kodu, ale wysiłek zwraca się z czasem.
Posiadanie modularnego i oddzielonego kodu sprawi, że będzie on bardziej zrozumiały, testowalny i łatwiejszy w utrzymaniu, bez względu na domenę programistyczną, w której pracujesz.
źródło