私はモジュラーコードが本当に何であるかを正しく理解しているかどうかを判断しようとしています。私はそれが非常に強力であることを知っています/有用なので、私はそれを正しく学んでいることを確認したい。正確にモジュラコーディングとは何ですか、そして私はそれを正しくしていますか?
学習を始めるにあたって、いくつかの基準に基づいてエンティティをグループ化する、かなりシンプルなシステムを作成しました。先に来て、最初に奉仕する。
私はグループとそのメンバーをグラフィカルに表示して、何が起こっているのかをユーザーに示したいと思っています。私はこのためにSDLライブラリを使用します。
これをいくつかのクラスに分割しましょう。
エンティティ
メインクラス「エンティティ」は、スレッドの安全性のためのブースト::ミューテックス、実際の事業体へのポインタを保持するマップを持っています。また、エンティティIDが提供されているときに、前記マップから実際のエンティティへのポインタを取得する関数を作成しましょう。
class Entities
{
public:
boost::mutex access_entitymap; //Thread safety
std::map<unsigned int, Entity*> entitymap;
Entity* getEntity(unsigned int entityID);
};
エンティティ
は、そのようなことはuniqueueだIDとして実際のエンティティに関する情報を保持します。親の "Entities"へのポインタ。
LFDGroups
グルーピングシステム。 実際のグループへのポインタを持つマップを含む 待ち行列内のグループの位置を持つマップ(最初に最初に表示され、より速く反復するために完全なグループがこのマップから削除されます)、 グループ(5つの実体、どの実体がどの場所に集まったのか?)。 さらに、前記地図上で動作するいくつかの機能を含む。メンバーの追加や削除など。 addmember()
関数は、一例として、エンティティが最も優先度の高いグループに追加されていること、または必要に応じて新しいグループが作成されていることを確認します。
groupObject
、このようなことがuniqueue IDだとそれが住民エンティティの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.*/
キュー
は簡単にテストを行うために、いくつかの使いやすい機能を提供します。といった;
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'グループで何が起こっているか表示されます。メンバー数、撮影場所、撮影場所などはありません。
また、キューの機能で動作するボタンも用意されています。"Add"ボタンのように "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