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.

Author: Bunkai.Satori, 2011-01-27

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:

  1. upewnij się, że każdy nagłówek może być dołączony samodzielnie.
  2. jeśli możesz użyć deklaracji forward, użyj ich!
 48
Author: Artyom,
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 w myclass.cpp.
  • Wprowadzenie interfejsów w punkcie interakcji między oddzielnymi klasami może pomóc zmniejszyć zależności.
 15
Author: jon-hanson,
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

 6
Author: Ed Guiness,
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.
  1. Zaprojektuj abstrakcyjne klasy, aby działały jako interfejsy dla dwóch klas. Dokonaj interakcji klas poprzez ten interfejs.
 6
Author: Sulla,
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ć.

 4
Author: Benoit,
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 .

 3
Author: stefaanv,
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.

 3
Author: CashCow,
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/

 2
Author: rank1,
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