2012-01-25 18 views
1

私はモジュラーコードが本当に何であるかを正しく理解しているかどうかを判断しようとしています。私はそれが非常に強力であることを知っています/有用なので、私はそれを正しく学んでいることを確認したい。正確にモジュラコーディングとは何ですか、そして私はそれを正しくしていますか?

学習を始めるにあたって、いくつかの基準に基づいてエンティティをグループ化する、かなりシンプルなシステムを作成しました。先に来て、最初に奉仕する。

私はグループとそのメンバーをグラフィカルに表示して、何が起こっているのかをユーザーに示したいと思っています。私はこのために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; 
} 
  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

関連する問題