2013-03-04 13 views
5

Właśnie przeniosłem z java na C++. Niewiele brakowało mi na temat organizacji kodu źródłowego.Porządkowanie kodu w języku C++

W Javie mamy pakiety do zorganizowania między każdym modułem.

Jakie są niektóre popularne sposoby organizacji kodu źródłowego C++?

+0

Sposób, w jaki się to robi, to kwestia osobistych preferencji. Mam tendencję do umieszczania powiązanych plików w oddzielnych folderach. podobnie jak oddzielne pakiety. Widziałem projekty z setkami plików źródłowych w tym samym folderze i wszystkim pomiędzy. –

+0

Zazwyczaj widzę pojedynczy katalog 'src /', z tym podfolderem, który oznacza twój "pakiet". Tak więc pakiet 'com.mydomain.server.login' na przykład w Javie może się równać' src/server/login' w C++. To naprawdę kwestia preferencji. Widziałem też ludzi, którzy dzielili pliki nagłówkowe na ścieżkę 'include /', aby zachować je oddzielnie od plików źródłowych. – crush

+0

Podobne pytanie: http://stackoverflow.com/questions/718126/best-folder-structure-for-c-cross-platform-library-and-bindings –

Odpowiedz

2

Jeśli spojrzeć na dużych projektów open source w C lub C++, można znaleźć szeroką gamę sposobów organizowania źródła. Jednak kilka typowych scenariuszy polega na użyciu struktury katalogów module (lub component) z src i include w obrębie każdego module. Ewentualnie możesz mieć to na odwrót i używać src\module i include\module.

Jeśli masz kod testowy, który często przechodzi w module\test lub test\module.

Jednym z interesujących wyzwań przy większych projektach C++ jest "gdzie umieścić pliki nagłówkowe, które są współużytkowane między komponentami". Czasami jest include\public (lub public\include), czasami są one z ich odpowiednim składnikiem.

Może być całkiem użyteczne wyodrębnienie części komponentu, które są "dostępne do użycia przez innych" w porównaniu z komponentami, które są używane tylko wewnętrznie - ponieważ coś wewnętrznego można łatwo zmienić bez żadnego lub minimalnego wpływu na inne. komponenty, gdzie coś, co jest "widoczne" poza komponentem, będzie wymagało większej ostrożności - co się stanie, jeśli komponent zostanie opublikowany jako biblioteka DLL i zaktualizujesz bibliotekę DLL bez ponownej kompilacji źródła w częściach, które używają komponentu [jeśli masz stronę trzecią Klienci, którzy nie mają kodu źródłowego (lub przynajmniej nie będą go regularnie budować), niekoniecznie chcesz zmusić ich do odbudowy swoich projektów za każdym razem, gdy wprowadzisz jakąś zmianę.

W przypadku dużych projektów, namespaces służy do zapobiegania namoklasom.

0

Częściowa odpowiedź:

Można najpierw uporządkować swoje pliki w różnych folderach, podobnie jak w Javie. Kiedy #include plik nagłówkowy, wpisujesz relative/path/from/src zamiast path.of.the .package.

C++ obsługuje również namespace koncepcję: http://www.cplusplus.com/doc/tutorial/namespaces/

0

Pierwsza i oczywista zasada: jeśli pracujesz nad projektem zespołowym/współpracy, postępuj zgodnie z zasadami jawnymi (najlepsze praktyki napisane w twojej organizacji) lub niejawnymi (sprawdź, jak to zrobiono) regułami projektu.

Jeśli jesteś na projekt na własną rękę, trzeba dużo swobody w C++ z powodu różnych komplementarnych pojęć organizacyjnych:

  • nazw,
  • klas,
  • foldery systemu plików
  • pliki źródłowe

bacause masz dużo więcej swobody niż w Javie polecam foldery odwzorowań NAM espaces i pliki do klas gdzie jest to uzasadnione:

  • użyć parę .h/.cpp dla każdej klasy, ale można także zajęcia pomocnicze lub inne zajęcia związane jeśli wydaje się logiczne i unika konieczności dużo małych plików.
  • Grupuje klasy w przestrzeniach nazw i dotyczy plików w folderze o nazwie przestrzeni nazw.

W ten sposób klient może napisać coś takiego:

#include "groupA/subgroupB/classC.h" 
using namespace groupA; 
subgroupB::classC object;