『実践的データモデリング入門』で紹介されているデータモデルパターン

実践的データモデリング入門』で紹介されているデータモデルパターンの一部を紹介します。

このようなパターンを知っていると上手に効率よくモデリングできるのでしょうね。

■履歴モデル

商品の属性内容(コード・単価)の変更が変更される時に、商品を購入した際の履歴を管理するパターンです。
「履歴管理の話の際にとっさにこの2つのパターンが思い浮かべば、業務担当者へのヒアリングも的確なものとなるでしょう。」とのこと。

商品の属性内容を転記する方法

商品自身に適用開始年月日と適用終了年月日を持たせて管理方法

■組織モデル

ピラミッド型の組織階層を表すモデルのパターンです。
「処理特性・データ量・トランザクション量・更新頻度などを見極め、物理モデルで再考すべき」とのこと。

現実の組織を写像したモデル

再帰的に表現したモデル

■ロールモデル

同一企業が、状況によって「顧客」だったり「購買先」だったりするときのパターンです。

■取引モデル

BtoB(企業間の商取引)を汎化したモデル。
販売管理や購買管理のモデルへの応用も可能。

Monostateパターン

もし全部のメソッドをクラスメソッドにしてしまえば、インスタンス間の区別がなくなります。つまり、インスタンスが1個しかないのと同じです。

Singletonパターン (2) – ぜ~んぶクラスメソッド

それはSingletonパターンではなくて、Monostateパターンですね。

Monostateパターンは『アジャイルソフトウェア開発の奥義』を読んで知りました。

オブジェクト指向における再利用のためのデザインパターン』に掲載されているGoFによる23のデザインパターン以外にも、デザインパターンはたくさんあります。

デザインパターン紹介のページがよくまとまっていて、勉強になります。

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』は、
Javaに限らず、他の言語においても、
マルチスレッドプログラミングを学ぶ上で非常に役に立つ本です。

この本の著者が結城浩氏であると聞けば、
この本の読みやすさ、わかりやすさは容易に想像できると思います。

この本のすごいところは、練習問題の解答の充実です。
練習問題の解答は150ページを超え、丁寧に解説されています。
練習問題もしっかりと挑戦する価値があります。

J2SE5.0では、マルチスレッドプログラミングに便利なクラスライブラリが、新たに追加されました。
増補改訂版では、このJ2SE5.0で新たに追加されたクラスライブラリについての解説も掲載されています。

新しく追加されたクラスライブラリも含めて、
Javaのマルチスレッド関連のクラスライブラリの充実ぶりを、
他の言語を使っていると羨ましく思いました。

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』で紹介されているパターンをC++Builder2009で実装してみました。

Two-Phase Terminationパターン

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』にある
「Two-Phase Terminationパターン」をC++ Builder 2009で実装してみました。

プログラムの意味は『増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』をご覧下さい。

C++Builder2009には、スレッドを終了するためのTThread.TerminateメソッドとTThread.Terminatedプロパティが用意されています。
増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』のshutdownRequestメソッドは、Terminateメソッドに該当します。

//スレッドセーフな出力
std::unique_ptr<TCriticalSection> CriticalSection(new TCriticalSection);
void Print(const std::string& S)
{
  CriticalSection->Acquire();
  std::cout << S << std::endl;
  CriticalSection->Release();
}

class TCountupThread : public TThread
{
public:
  __fastcall TCountupThread() : TThread(false), FCounter(0) {};
protected:
  //動作
  void __fastcall Execute()
  {
    while (!this->Terminated)
    {
      DoWork();
    }
    DoShutdown();
  }
private:
  long FCounter;
  //作業
  void DoWork()
  {
    FCounter++;
    boost::format fmt("DoWork: counter = %d");
    Print((fmt % FCounter).str());
    Sleep(500);
  }
  //終了処理
  void DoShutdown()
  {
    boost::format fmt("DoShutdown: counter = %d");
    Print((fmt % FCounter).str());
  }
};

int _tmain(int argc, _TCHAR* argv[])
{
  Print("main BEGIN");

  //スレッドの起動
  TCountupThread* t = new TCountupThread();

  //少し時間を空ける
  Sleep(10000);

  //スレッドの終了要求
  Print("main shutdownRequest");
  t->Terminate();

  Print("main join");

  //スレッドの終了を待つ
  t->WaitFor();

  Print("main END");

  return 0;
}