Я пытаюсь выяснить, правильно ли я понимаю, что такое модульный код. Я знаю, что это очень мощный/полезный, поэтому я хочу убедиться, что я изучаю его правильно.Что такое модульное кодирование, и правильно ли я это делаю?
Чтобы начать обучение, я создал довольно простую систему, которая группирует объекты совместно на основе некоторых критериев. Первый пришел первый обслужен.
Я также хочу графически отображать группы и их участников, чтобы показать пользователю (мне), что происходит. Для этого я буду использовать библиотеку SDL.
Итак, давайте разделим это на некоторые классы;
Сущность
В «Сущности» главный класса будет иметь подталкивание :: мьютекс для безопасности потоков, а также карта держат указатели на реальные сущности. Давайте также создадим функцию, которая извлекает указатель на фактический объект с указанной карты при наличии идентификатора объекта.
class Entities
{
public:
boost::mutex access_entitymap; //Thread safety
std::map<unsigned int, Entity*> entitymap;
Entity* getEntity(unsigned int entityID);
};
Entity
Содержит информацию о фактической сущности, например, как это uniqueue ID. И указатель на родительский «Сущности».
LFDGroups
группировка системы. Включает карту с указателями на фактические группы, - карта с положением группы в очереди (сначала на первом месте, все группы удалены с этой карты, чтобы ускорить итерацию), и карту с позицией объекта в группа (5 пятен, какая организация взяла то место?). Кроме того, он также включает некоторые функции для работы на указанных картах. Такие, как добавление и удаление элементов. Функция addmember()
, в качестве примера, должна убедиться, что объект добавлен в группу с наибольшим приоритетом или если при необходимости будет создана новая группа.
groupObject
Содержит информацию о фактической группе, например, как это uniqueue ID и это идентификаторы обитателем сущностей. Но также имеет некоторые функции, такие как;
LFDGroups *lfdgroup; //Parent LFDGroups;
bool isEmpty(); //is this group empty?
bool isFull(); //is this group full?
unsigned int getPosition(); //Position in queue?
bool addMember(unsigned int entityID,bool snatchIt);
/*Add a member. Calls removeMember() on the entities' groupObject
first if the entityID is already in another group.*/
bool removeMember(unsigned int entityID,bool snatchIt);
/*Remove a member from this group, and snatch a member from another
group further up in the queue. This ensures groups are always full
if enough people are queued.*/
bool hasMember(unsigned int entityID); //Is this entity ID in our group?
/*etc. etc.*/
Queue
Предоставляет некоторые функции, простые в использовании, чтобы облегчить тестирование. Такие как;
void addFakeEntity(bool queuenow); //Create an all new entity and immediately queue it.
void removeFakeEntity(); //Remove a random entity from a random group
void removeFakeEntity(unsigned int entityID); //Remove a given entity from it's corresponding group.
SDLMain
Графически отображает то, что происходит с группами LFDGroups. Сколько членов у него есть, какие пятна взяты, а какие нет.
Также показаны кнопки для работы с функциями Queue.Например, кнопка «Добавить» вызовет «queue-> addFakeEntity (true)»
Итак, теперь я могу просто легко начать все это;
#include "SDL_main.h" //gfx
#include "class_LFDGroups.h" //group system
#include "queue.h" //ease of use for testing
#include "class_entities.h" //entities
int main(int argc, char* args[])
{
Entities * entities = new Entities;
LFDGroups * lfdgroups = new LFDGroups(entities);
Queue * queue = new Queue(lfdgroups);
SDLMain * sdlmain = new SDLMain(queue);
return 1;
}
- Сущность может быть использована без всего остального.
- LFDGroups могут использоваться только с объектами.
- Очередь нуждается в обоим, но LFDGroups уже содержит указатель на Сущности. В конце концов, он не может функционировать без него.
- SDLMain использует все 3.
И достаточно уверенный;
Таким образом, это означает, что даже если я отключить графическое отображение групп, я все еще могу использовать реальную систему группирования для других вещей. А также функции, относящиеся к определенным объектам, находятся внутри этого объекта. Например, функция Entity* getEntity(unsigned int entityID);
находится в классе Entities
, а не в groupObject
, хотя это единственный, который использует его в данный момент.
Это все, что модульное кодирование? Правильно ли я это делаю?
Если люди голосуют, чтобы закрыть это, по крайней мере, любезность сообщить мне, почему ... это довольно специфическая проблема программирования, поэтому я чувствую, что она принадлежит к stackoverflow. – natli