23,5 — Zależności

Do tej pory zbadaliśmy 3 typy relacji: kompozycję, agregację i powiązanie. Najprostszy zapis zachowaliśmy na koniec: zależności.

W zwykłej rozmowie używamy terminu zależność, aby wskazać, że dany obiekt jest zależny od innego obiektu w przypadku danego zadania. Na przykład, jeśli złamiesz stopę, poruszasz się o kulach (ale nie w inny sposób). Kwiaty są zależne od pszczół, które je zapylają, aby wyhodować owoce lub rozmnażać się (ale nie w inny sposób).

A zależności Występuje, gdy jeden obiekt odwołuje się do funkcjonalności innego obiektu w celu wykonania określonego zadania. Jest to słabsza relacja niż skojarzenie, ale mimo to każda zmiana obiektu, od którego zależy, może zepsuć funkcjonalność (zależnego) obiektu wywołującego. Zależność jest zawsze relacją jednokierunkową.

Dobrym przykładem zależności, którą widziałeś już wiele razy, jest std::ostream. Nasze klasy, które używają std::ostream, używają go, aby wykonać zadanie polegające na wydrukowaniu czegoś na konsoli, ale nie w inny sposób.

Na przykład:

#include <iostream>
 
class Point
{
private:
    double m_x{};
    double m_y{};
    double m_z{};
 
public:
    Point(double x=0.0, double y=0.0, double z=0.0): m_x{x}, m_y{y}, m_z{z}
    {
    }
 
    friend std::ostream& operator<< (std::ostream& out, const Point& point); // Point has a dependency on std::ostream here
};
 
std::ostream& operator<< (std::ostream& out, const Point& point)
{
    // Since operator<< is a friend of the Point class, we can access Point's members directly.
    out << "Point(" << point.m_x << ", " << point.m_y << ", " << point.m_z << ')';
 
    return out;
}
 
int main()
{
    Point point1 { 2.0, 3.0, 4.0 };
 
    std::cout << point1; // the program has a dependency on std::cout here
 
    return 0;
}

W powyższym kodzie Point nie jest bezpośrednio powiązany ze std::ostream, ale jest od niego zależny, ponieważ operator<< używa std::ostream do wydrukowania punktu na konsoli.

Zależności a skojarzenie w C++

Zazwyczaj jest kilka zamieszanie co do tego, co odróżnia zależność od skojarzenia.

W C++ skojarzenia to relacja, w której jedna klasa utrzymuje jako członek bezpośredni lub pośredni „link” do skojarzonej klasy. Na przykład klasa Lekarz jako członek zawiera tablicę wskaźników do swoich pacjentów. Zawsze możesz zapytać Doktora, kim są jego pacjenci. Klasa Driver przechowuje identyfikator samochodu, którego właścicielem jest obiekt kierowcy, jako element będący liczbą całkowitą. Kierowca zawsze wie, jaki Samochód jest z nim powiązany.

Zależności zazwyczaj nie są członkami. Zamiast tego obiekt, od którego zależy, jest zazwyczaj tworzony w razie potrzeby (np. otwieranie pliku, w którym można zapisać dane) lub przekazywany do funkcji jako parametr (np. std::ostream w przeciążonym operatorze<< powyżej).

Przerwa w humorze

Zależności (dzięki uprzejmości naszych przyjaciół z xkcd):

Oczywiście ty i ja wiemy, że tak jest właściwie skojarzenie zwrotne!

guest
Twój adres e-mail nie zostanie wyświetlony
Znalazłeś błąd? Zostaw komentarz powyżej!
Komentarze związane z poprawkami zostaną usunięte po przetworzeniu, aby pomóc zmniejszyć bałagan. Dziękujemy za pomoc w ulepszaniu witryny dla wszystkich!
Awatary z https://gravatar.com/ są połączone z podanym adresem e-mail.
Powiadamiaj mnie o odpowiedziach:  
42 Komentarze
Najnowsze
Najstarsze Najczęściej głosowane
Wbudowane opinie
Wyświetl wszystkie komentarze