shape1
shape2
shape3
shape4
shape7
shape8

Архитектура проекта


MYSTERYMAN

Новичок
Пользователь
17.01.2016
1
1
0
Доброго времени суток, в данной статье я хочу поговорить по поводу организации архитектуры проектов. За многолетнюю историю на поприще программирования игровых режимов сложилась тенденция писать всю логику в один файл, что в корне неверно и является дурным тоном и в современном мире является признаком некоторой бездарности программиста. Данная тенденция сложилась ешё в зародыше развития мультиплеера и связи с этим дожила до наших дней, но она является не практичной, так как при увеличении количества кода возрастает и сложность его чтения.
 
Для того чтобы в процессе изменения вашей программы не создавались накладные расходы, следует придерживаться грамотно спроектированной архитектуры вашего проекта, давайте определимся что же такое хорошая архитектура.
 
Хорошая архитектура — это архитектура, делающая процесс разработки и сопровождение программы более простым и эффективным. Программа с хорошей архитектурой легче поддаётся расширению и изменению, а также тестированию.
 
Так как большинство игровых режимов написано одним большим монолитом, то к ним данное определение никак не подходит. И решение этому есть, разбиение программы на ряд независимых программ, называемых модулями, сам процесс разбиения программы называется декомпозицией.
 
Декомпозиция программы — принцип разделения сложных систем и процессов на множество простых отдельных частей, которые согласованно взаимодействуют друг с другом.
 
Идея декомпозиции состоит в разбиении программы на такие части, как:

  • заголовочный файл модуля;
  • файл реализации модуля.
В заголовочный файл помещают определение данных используемые файлом реализации, а также прототипы используемых функции.
Файл реализации содержит в себе основную логику вашей программы.
 
Также, следует заметить, что если вашей программе разные модули используют единые функции, то такие функции следует выносить в общий модуль.
 
Ваш проект может быть организован подобным образом:

5h-SzIycUMw.jpg


В файле 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
 
Последнее редактирование модератором: