2012-01-25 1 views
1

Я пытаюсь выяснить, правильно ли я понимаю, что такое модульный код. Я знаю, что это очень мощный/полезный, поэтому я хочу убедиться, что я изучаю его правильно.Что такое модульное кодирование, и правильно ли я это делаю?

Чтобы начать обучение, я создал довольно простую систему, которая группирует объекты совместно на основе некоторых критериев. Первый пришел первый обслужен.

Я также хочу графически отображать группы и их участников, чтобы показать пользователю (мне), что происходит. Для этого я буду использовать библиотеку 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; 
} 
  1. Сущность может быть использована без всего остального.
  2. LFDGroups могут использоваться только с объектами.
  3. Очередь нуждается в обоим, но LFDGroups уже содержит указатель на Сущности. В конце концов, он не может функционировать без него.
  4. SDLMain использует все 3.

И достаточно уверенный;

group_example

Таким образом, это означает, что даже если я отключить графическое отображение групп, я все еще могу использовать реальную систему группирования для других вещей. А также функции, относящиеся к определенным объектам, находятся внутри этого объекта. Например, функция Entity* getEntity(unsigned int entityID); находится в классе Entities, а не в groupObject, хотя это единственный, который использует его в данный момент.

Это все, что модульное кодирование? Правильно ли я это делаю?

+1

Если люди голосуют, чтобы закрыть это, по крайней мере, любезность сообщить мне, почему ... это довольно специфическая проблема программирования, поэтому я чувствую, что она принадлежит к stackoverflow. – natli

ответ

2

Да, ваша программа похожа на модульные парадигмы программирования, такие как отдельные компоненты, которые собираются вместе для составления программы и написаны таким образом, что отдельные компоненты могут быть заменены.

Итак, вы разделили логику программы на отдельные классы, и вы также разделили классы на отдельные единицы компиляции (предположим, что на основе включений в вашем источнике SDLMain.h), поэтому для добавления новой функции сказать, что ваш групповой класс требует только изменения этого модуля (предполагая, что новая функция была вызвана только внутри этого класса), и, глядя на ваш источник, программа логически разделяется на отдельные части, которые легко идентифицируются.

Вы также можете легко заменить часть своего кода, например, интерфейс GUI можно заменить на Qt или wxwindows, например. Поскольку операции, вызываемые gui в данные, не изменяются, новый код gui можно записать и вызвать тот же набор операций, а компоненты данных будут не быть изменены.

+0

Так что вы говорите, что я делаю это правильно, и нет никакого риска привыкнуть к вредным привычкам, если я продолжу работать так? – natli

+0

Плохие привычки, всегда могут вкрадываться, но из того, что я видел в вашем примере, вы правильно применяете модульные методы программирования. Таким образом, вероятность вредных привычек или коротких сокращений намного меньше. Поскольку вы пишете код C++ с помощью классов, имеет смысл также искать методы OO, особенно сцепление и сцепление. – display101

+0

Спасибо, чтение на связности и сцеплении было очень полезным. – natli

Смежные вопросы