Unikanie kolistych zależności plików nagłówkowych [duplikat]
To pytanie ma już odpowiedź tutaj:
Czy macie jakieś dobre rady jak unikać okrągłych zależności plików nagłówkowych?
Oczywiście od początku staram się zaprojektować projekt jak najbardziej przejrzysty. Jednak jako więcej i Dodano więcej funkcji i klas, a projekt staje się mniej przejrzysty, zaczynają się kołowe zależności.
Czy istnieją jakieś ogólne, zweryfikowane i działające Zasady?Dzięki.
8 answers
Jeśli masz Okrężną zależność, robisz coś złego.
Jak na przykład:
foo.h
-----
class foo {
public:
bar b;
};
bar.h
-----
class bar {
public:
foo f;
};
Jest nielegalne prawdopodobnie chcesz:
foo.h
-----
class bar; // forward declaration
class foo {
...
bar *b;
...
};
bar.h
-----
class foo; // forward declaration
class bar {
...
foo *f;
...
};
A to jest ok.
Zasady ogólne:
- upewnij się, że każdy nagłówek może być dołączony samodzielnie.
- jeśli możesz użyć deklaracji forward, użyj ich!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-27 13:13:35
- w miarę możliwości stosować deklaracje typu forward.
- Przenieś wszystkie nagłówki z pliku nagłówkowego i do odpowiedniego pliku cpp, jeśli są one potrzebne tylko przez plik cpp. Najprostszym sposobem na wymuszenie tego jest uczynienie
#include "myclass.h"
pierwszym include wmyclass.cpp
. - Wprowadzenie interfejsów w punkcie interakcji między oddzielnymi klasami może pomóc zmniejszyć zależności.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-27 13:41:19
Ogólnym podejściem jest uwzględnienie wspólnych cech w trzecim pliku nagłówkowym, który jest następnie odwoływany przez dwa oryginalne pliki nagłówkowe.
Zobacz także Okólna zależność najlepsza praktyka
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:35
Niektóre najlepsze praktyki stosuję, aby uniknąć kołowych zależności są,
-
Trzymaj się zasad OOAD. Nie dołączaj pliku nagłówkowego, chyba że dołączona klasa jest w relacji kompozycji z bieżącą klasą. Zamiast tego użyj deklaracji forward.
- Zaprojektuj abstrakcyjne klasy, aby działały jako interfejsy dla dwóch klas. Dokonaj interakcji klas poprzez ten interfejs.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-27 14:00:19
W zależności od możliwości preprocesora:
#pragma once
Lub
#ifndef MY_HEADER_H
#define MY_HEADER_H
your header file
#endif
Jeśli uważasz, że projektowanie plików nagłówkowych jest bardzo nudne, może makeheaders z Hwaci (projektanci SQLite i fossil DVC) mogą Cię zainteresować.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-27 13:10:18
Celujesz w podejście warstwowe. Można zdefiniować warstwy, w których moduły mogą zależeć od modułów niższych warstw, ale odwrotność powinna być wykonywana za pomocą obserwatorzy. Teraz możesz jeszcze określić, jak drobnoziarniste powinny być twoje warstwy i czy akceptujesz kołowe zależności w obrębie warstw, ale w tym przypadku użyłbym tego .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:36
Ogólnie pliki nagłówkowe powinny deklarować zamiast zawierać inne nagłówki, o ile to możliwe.
Upewnij się również, że trzymasz się jednej klasy na nagłówek.
Wtedy prawie na pewno się nie pomylisz.
Najgorsze sprzężenie zwykle pochodzi z nadętego kodu szablonu. Ponieważ musisz zawrzeć definicję wewnątrz nagłówka, często prowadzi to do tego, że wszystkie rodzaje nagłówków muszą być dołączone, a następnie klasa, która używa szablonu zawiera nagłówek szablonu, w tym mnóstwo innych rzeczy.
Z tego powodu generalnie powiedziałbym: ostrożnie z szablonami! Idealnie szablon nie powinien zawierać niczego w swoim kodzie implementacyjnym.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-27 13:58:52
Altough Artyom dostarczył najlepszą odpowiedź ten tutorial jest również świetny i zapewnia kilka rozszerzeń http://www.cplusplus.com/forum/articles/10627/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-17 10:53:03