やる夫がデザインパターンをやるようです 第10回

やる夫がデザインパターンをやるようです 第10回をはてなブックマークに追加 やる夫がデザインパターンをやるようです 第10回をdel.icio.usに追加 Yahoo!ブックマークに登録 やる夫がデザインパターンをやるようです 第10回をGoogle Bookmarksに追加

≪第9回
第11回≫

  なんだか開発が進むにつれてスタティックメンバ変数が
  ずいぶん汚れてきたお。
         ____    
       /      \  
      /  ─    ─\
    /    (●)  (●) \
    |       (__人__)    | ________
     \      ` ⌒´   ,/ .| |          |
    ノ           \ | |          |
  /´                 | |          |
 |    l                | |          |
 ヽ    -一ー_~、⌒)^),-、   | |_________|
  ヽ ____,ノγ⌒ヽ)ニニ- ̄   | |  |
  ス・スタティックメンバ変数が汚れてきただと?
   / ̄ ̄\  ( ;;;;(
 / _ノ  ヽ\ ) ;;;;)
 |  ( ○) (○)/;;/  
. |   (__人__) l;;,   
  |    ∩ ノ)━・'/  
.  |   /  ノ´ } 
.  ヽ  / /    } 
   ヽ/ /   ノ
  まぁいいお。汚しついでにもう2~3個変数追加だお
  みんな自由につかってくれお。
  変数名はtemp1、temp2、temp3だお
           ____
        /⌒  ⌒\
.      /( ●)  (●)\ 
     / ::::::⌒(__人__)⌒::::: \ 
    |      |r┬-|     |  
     \       `ー'´     /
    ノ            \
  /´               ヽ                 カ
 |    l   l||l 从人 l||l      l||l 从人 l||l   カ    タ
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.     タ
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))
     ┌┬┬┐┌┬┬┬┐┌┬┬┬┐┌┬┬┬┐
  ,. - ''"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ρ ̄`l
   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ノ ̄
      / ̄ ̄\   てめぇぜってぇわざとやってんだろ
    /ノ( _ノ  \  
    | ⌒(( ●)(●)
    .|     (__人__) /⌒l
     |     ` ⌒´ノ |`'''|
    / ⌒ヽ     }  |  |               ぺきょ
   /  へ  \   }__/ /             / ̄ ̄\
 / / |      ノ   ノ           / ●)) ((●\’, ・
( _ ノ    |      \´       _    (   (_人_)’∴ ),
       |       \_,, -‐ ''"   ̄ ゙̄''―---└'´ ̄`ヽ   て
       .|                  ______ ノ    (
       ヽ           _,, -‐ ''"  ノ       ヽ   r'
         \       , '´        し/..     | J
          \     (           /      |
            \    \         し-  '^`-J
CやC++などではグローバル変数を使ってはいけないというコーディング規約はよく目にするのですが、javaですとグローバルアクセスできる変数はクラススタティック変数になります。(乱暴にいろいろ切り捨てた言い方をしました)
開発をしていると、このスタティック変数やグローバル変数などのように、1元的なアクセスポイントが用意されていている領域というのはどうしても必要になってきたりします。
例えば、ロギングするオブジェクトや、レジストリの設定処理をするオブジェクトなどは1元管理されていることが(実装依存ですが)望ましいのですが、これらのオブジェクトがいろんな処理から自由に生成されて自由に使われたりした場合、つじつまの合わない結果になったりすることがあります。

今回紹介するのはシングルトンパターンと呼ばれるものです。このパターンは広く知られていて、わかり易く、クラス図もとても簡潔なものです。ですが、実装においては(一応)紆余曲折ありますので慎重に進めていきたいと思います。

   / ̄ ̄\    やる夫。グローバル変数(javaだとstatic変数)
 /   _ノ  \  ぱかぱか作ってもらっちゃこまるだろ
 |    ( ●)(●)               ____
. | U   (__人__)            /      \
  |     ` ⌒´|           /─    ─  \  ?
.  |        }  \      / (●) (●)    \
.  ヽ        }     \     |   (__人__)       |
   ヽ     ノ       \   \            _/
   /    く. \      \  ノ           \
   |     \  \    (⌒二              |
    |    |ヽ、二⌒)、      \         |  |
class yaruoGlobal {
public static int temp1 = 0;
public static int temp2 = 0;
public static int temp3 = 0;
public static int temp4 = 0;
public static int temp5 = 0;
};
  やりたいことはよくわかる。
  これらの変数はそれぞれアクセスポイントとして
  1元管理されていてほしいんだろう。
  だが、クラスデザインをちょっと変えれば、
  オブジェクトを1つだけしか生成させないようにできる。
  これをちょっと考えてみろ。
   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)
     ____       ヽ v /
   /⌒  ⌒\     -(m)-  
  /( ●)  (●)\       ≡
/::::::⌒(__人__)⌒:::::\   
|      `ー'´     |  わかりませんお。
/     ∩ノ ⊃  /   
(  \ / _ノ |  |    
.\ “  /__|  |  
  \ /___ /
   表情と言動があってねぇだろが。
   てか、「わからない」の即答はやめろ。
   / ̄ ̄\
 /   _ノ  \
 |    ( ○)(○)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)
  んー。むつかしいお。
  てか答え知ってるなら教えてほしいものだお。
  考える時間がむd
     ____
   /      \ ( ;;;;(
  /  _ノ  ヽ__\) ;;;;)
/    (─)  (─ /;;/
|       (__人__) l;;,´
/      ∩ ノ)━・'/
(  \ / _ノ´.|  |
.\  "  /__|  |
  \ /___
━━━━━━━━━━━━━━━━━━━━
  .キッ!   / \   / \  ぴきーん
___∧,、 /  (●)  (●)  \____
 ̄ ̄ ̄`'` |    (__人__)    | ̄ ̄ ̄ ̄
━━━━━━━━━━━━━━━━━━━━
class YaruoGlobal {
private int temp1 = 0;
public static YaruoGlobal inst = new YaruoGlobal();
public int get(){ return temp1; }
public void set(int param){ temp1 = param; }
};
   これでインスタンスは絶対1こだお。
   みんなYaruoGlobal.instを使ってくれれば
   temp1は1元管理されたアクセスポイントになるお
         ___
       / ⌒  ⌒\
      / (●)  (●) \
    /   ///(__人__)/// \
     |   u.   `Y⌒y'´    |
      \       ゙ー ′  ,/
      /⌒ヽ   ー‐    ィヽ
      / rー'ゝ       〆ヽ
    /,ノヾ ,>      ヾ_ノ,|
    | ヽ〆        |´ |
 「みんなYaruoGlobal.instを使ってくれれば」
 って自分で言っちゃってるじゃねぇか。
 どうやってほかのプログラマにこれを制限すんだ?
 そもそもおめぇがのっけから破りそうな規約じゃねぇか
   / ̄ ̄\  ( ;;;;(
 / _ノ  ヽ\ ) ;;;;)
 |  ( ○) (○)/;;/  
. |   (__人__) l;;,   
  |    ∩ ノ)━・'/  
.  |   /  ノ´ }
.  ヽ  / /    }
   ヽ/ /   ノ
     / ̄ ̄ ̄ \  ホジホジ
   / ―   ― \    ?
  /   (●)  (●)  \
  |     (__人__)      |
  \   mj |⌒´     /
     〈__ノ
    ノ   ノ
アーキテクトがいっているのは、どこかで

YaruoGlobal myInst = new YaruoGlobal();

をほかのプログラマによって行われたらどうするんだ?ということです。newされたインスタンスはメンバが保持しているスタティック変数とは違うインスタンスですので、変数temp1もYaruoGlobal.instが保持しているそれとは異なった領域で管理されます。つまり、1元管理されなければいけないというところを満たせなくなってしまいます。
確かにやる夫のいうYaruoGlobal.instをみんなが使えば1つのアクセスポイントとして利用できます。しかしここで考えるべきは1度しかインスタンス化してはならないクラスを紳士協定で実現するのではなく、デザインとして実現する方法です。
では、どうデザインすればよいのでしょうか。続きは次回にポストしたいと思います。

≪第9回
第11回≫

コメント / トラックバック4件

  1. 藤助 より:

    映像+という雑誌の人形アニメーションの現場という特集の号で、
    詳しく作り方が載っていて面白いですよ。
    ちょっとお高いですが。

  2. 藤助 より:

    あ、コマ撮りアニメのことについてです。

  3. ひげもじゃ より:

    藤助さん
    こんにちは!な、なんとワタシ映像+もっていますよ。コマ撮りアニメのやつですよね。人形の作り方も書いてあったので重宝しています!

  4. 藤助 より:

    (^_^)なんと奇遇な。
       応援しております。

コメントをどうぞ