Доброго времени суток, в данной статье я хочу поговорить по поводу организации архитектуры проектов. За многолетнюю историю на поприще программирования игровых режимов сложилась тенденция писать всю логику в один файл, что в корне неверно и является дурным тоном и в современном мире является признаком некоторой бездарности программиста. Данная тенденция сложилась ешё в зародыше развития мультиплеера и связи с этим дожила до наших дней, но она является не практичной, так как при увеличении количества кода возрастает и сложность его чтения.
Для того чтобы в процессе изменения вашей программы не создавались накладные расходы, следует придерживаться грамотно спроектированной архитектуры вашего проекта, давайте определимся что же такое хорошая архитектура.
Хорошая архитектура — это архитектура, делающая процесс разработки и сопровождение программы более простым и эффективным. Программа с хорошей архитектурой легче поддаётся расширению и изменению, а также тестированию.
Так как большинство игровых режимов написано одним большим монолитом, то к ним данное определение никак не подходит. И решение этому есть, разбиение программы на ряд независимых программ, называемых модулями, сам процесс разбиения программы называется декомпозицией.
Декомпозиция программы — принцип разделения сложных систем и процессов на множество простых отдельных частей, которые согласованно взаимодействуют друг с другом.
Идея декомпозиции состоит в разбиении программы на такие части, как:
Файл реализации содержит в себе основную логику вашей программы.
Также, следует заметить, что если вашей программе разные модули используют единые функции, то такие функции следует выносить в общий модуль.
Ваш проект может быть организован подобным образом:
В файле main.pwn происходит подключение всех модулей, и он cодержит в себе следующий листинг:
//HEADER
#include "header/core/core_connection_db.inc"
#include "header/core/core_gamemode.inc"
#include "header/core/core_timer.inc"
//FUNCTION
#include "functions/core/core_connection_db.pwn"
#include "functions/core/core_gamemode.pwn"
//MODULE
#include "module/core/core_connection_db.pwn"
#include "module/core/core_gamemode.pwn"
#include "module/core/core_timer.pwn"
У вас наверное возник вопрос, а как же происходит взаимодействие с колбеками, а производится оно с помощью деректив препроцессора, пример данного взаимодействия представлен в листинге ниже:
public OnGameModeInit() {
#if defined GM_Settings_OnGameModeInit
return GM_Settings_OnGameModeInit();
#else
return 1;
#endif
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
#define OnGameModeInit GM_Settings_OnGameModeInit
#if defined GM_Settings_OnGameModeInit
forward GM_Settings_OnGameModeInit();
#endif
На этом всё, надеюсь вы стали более образованными и будете применять данную практику в разработке.
P.S: Возможно дополню данную статью в дальнейшем, т.к. некоторые моменты выглядят весьма дико и незакончено.
Автор материала: MYSTERYMAN
Для того чтобы в процессе изменения вашей программы не создавались накладные расходы, следует придерживаться грамотно спроектированной архитектуры вашего проекта, давайте определимся что же такое хорошая архитектура.
Хорошая архитектура — это архитектура, делающая процесс разработки и сопровождение программы более простым и эффективным. Программа с хорошей архитектурой легче поддаётся расширению и изменению, а также тестированию.
Так как большинство игровых режимов написано одним большим монолитом, то к ним данное определение никак не подходит. И решение этому есть, разбиение программы на ряд независимых программ, называемых модулями, сам процесс разбиения программы называется декомпозицией.
Декомпозиция программы — принцип разделения сложных систем и процессов на множество простых отдельных частей, которые согласованно взаимодействуют друг с другом.
Идея декомпозиции состоит в разбиении программы на такие части, как:
- заголовочный файл модуля;
- файл реализации модуля.
Файл реализации содержит в себе основную логику вашей программы.
Также, следует заметить, что если вашей программе разные модули используют единые функции, то такие функции следует выносить в общий модуль.
Ваш проект может быть организован подобным образом:
В файле main.pwn происходит подключение всех модулей, и он cодержит в себе следующий листинг:
//HEADER
#include "header/core/core_connection_db.inc"
#include "header/core/core_gamemode.inc"
#include "header/core/core_timer.inc"
//FUNCTION
#include "functions/core/core_connection_db.pwn"
#include "functions/core/core_gamemode.pwn"
//MODULE
#include "module/core/core_connection_db.pwn"
#include "module/core/core_gamemode.pwn"
#include "module/core/core_timer.pwn"
У вас наверное возник вопрос, а как же происходит взаимодействие с колбеками, а производится оно с помощью деректив препроцессора, пример данного взаимодействия представлен в листинге ниже:
public OnGameModeInit() {
#if defined GM_Settings_OnGameModeInit
return GM_Settings_OnGameModeInit();
#else
return 1;
#endif
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
#define OnGameModeInit GM_Settings_OnGameModeInit
#if defined GM_Settings_OnGameModeInit
forward GM_Settings_OnGameModeInit();
#endif
На этом всё, надеюсь вы стали более образованными и будете применять данную практику в разработке.
P.S: Возможно дополню данную статью в дальнейшем, т.к. некоторые моменты выглядят весьма дико и незакончено.
Автор материала: MYSTERYMAN
Последнее редактирование модератором: