Poprawa czytelności kodu i jego podział na komponenty

Poprawa czytelności kodu i jego podział na komponenty
Rafbeam
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 44
0

Witam, dzisiaj postanowiłem uporządkować mój kod.
Niestety nie mam pomysłu, jak powinien on wyglądać, więc proszę o pomoc.
Chcę żeby był czytelny i podzielony na komponenty. (dla mniejszych rozmiarów poszczególnych plików)
Na razie zrobiłem coś takiego:

Kopiuj
PROJECT:
   |
   |- PROJECT.cbp
   |- main.cpp
   |- game.cpp
   |- game.h
   |- components.h
   |- components:
          |
          |- display.cpp
          |- display.h
          |- camera.cpp
          |- camera.h
          |- tools:
               |
               |- VECTOR3.cpp
               |- VECTOR3.h
               |- FPS_COUNTER.cpp
               |- FPS_COUNTER.h

main() tworzy obiekt game i uruchamia go używając Game::RunGame().
Klasa Game ma enum *Game::GameState gameState" i konstruktor wywołujący funkcjię Game::Init() inicjalizującą GLFW, tworzącą okno, ustawiającą Game::gameState i wywołującą pierwszy raz funkcję Reshape(). (zawartą w pliku components\display.cpp [extern void Reshape(); w display.h])

Wszystkie Game:: są rozwinięte w pliku game.cpp.

Game::RunGame() ma pętlę while(gameState != END), która wywołuje odpowiednie funkcje w zależności od aktualnego stanu Game::gameState.

Kopiuj
switch(gameState)
{
     case GAME_MENU: //jeszcze nie zaimplementowane
          Menu();
     case SINGLEPLAYER: 
          SinglePlayer();
          break;
     default: 
          break;
}

Dalej Game::SinglePlayer tworzy obiekt engine i uruchamia go, używając Engine::RunEngine().

Klasa Engine jest zadeklarowana w game.h i rozwinięta w game.cpp.

Funkcje Game::Menu i Engine::RunEngine mają w sobie aktualnie wykonywane czynności.

Kopiuj
void Engine::RunEngine()
{
    glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); //ukrywa kursor
    glfwSetKeyCallback(window, CALLBACK_KEYBOARD_GAME); //ustawia CALLBACK_KEYBOARD_GAME jako keyboard callback (dla funkcji *Game::Menu()* będą oddzielne funkcje CALLBACK)
    glfwSetCursorPosCallback(window, CALLBACK_MOUSE_MOTION_GAME); //ruch kamery przy ruchu myszki (callback)
    DWORD updateTimer = GetTickCount(); //zegar dla pętli gry
    int skip = 0; /składnik pętli
    while(!glfwWindowShouldClose(window)) //początek pętli (trzeba jeszcze dodać odpowiedni warunek dla opuszczenia gry do menu)
    {
        skip = 0; //składnik pętli
        while(GetTickCount() > updateTimer && skip < MAX_FRAMESKIP) //składnik pętli
        {
            updateTimer += SKIP_TICKS; //składnik pętli
            skip++; //składnik pętli
        }
        Display(); //funkcja *Display()* zawarta w components\display.h i rozwinięta w .cpp (```extern void Display();``` w *components\display.h*)
        glfwSwapBuffers(window); //zamiana buforów
        glfwPollEvents(); //łapanie eventów przez GLFW
    }
}

Czy oddzielanie funkcji do oddzielnych plików z użyciem extern to dobra praktyka?
Czy powinienem pisać #include <...> w plikach .h?
Jak dodać do pliku .cpp za pomocą #include plik .h z nadrzędnego folderu pliku .cpp? Czy do tego przyda się .. ?

Załączam projekt. Nie mam czasu na wrzucanie go na github.

koszalek-opalek
  • Rejestracja: dni
  • Ostatnio: dni
0

Tak na pierwszy rzut oka, nie orbiłbym components.h -- raczej jestem za tym, żeby każdy plik .cpp (oprócz main.cpp) miał swój własny, używalny .h. Jaki jest cel takiego zgrupowania u Ciebie? Czy wszystkie komponenty zawsze muszą być dołączane razem? Jeśli tak, to dlaczego? Jeśli dlatego, że jeden zależy od drugiego, to ten jeden powinien dołączać .h tego drugiego...

Ale to tylko pierwsze wrażenie... I może się nie znam. :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.