12月
30
2009
0

俺ルールだ!@JAVA

研究用にJavaのコーディングしてたら、疲れてきたのでブログにエントリでも書いてます。

前置きですが、自分、基本的にデザインパターン(正確には巷で使われているデザインパターンの中身)が嫌いです。
理屈っぽすぎて、理解しがたいしコードが汚くなるし・・・orz

というわけで、最近、俺ルールなデザインパターンを構築しつつありますw
あと、俺ルール支援クラスライブラリも構築していますw

イベント駆動のプログラミングをするために、デザインパターンではObserver パターンを用いることになります。
このパターン、あまり好きになれません(´・ω・`;)
なぜなら、イベント駆動中にハンドラの変更が行われることを想定した設計になると、クラス毎に複雑な設計が必要になるからです。
単純にリストにリスナ突っ込んで、for-each で回すだけなら簡単なんですけどね・・・これやるとバグの温床になるので。

正直、イベント処理は言語レベルで対応しておいて欲しいと思うのですが・・・まあ、ないものねだりをしてもしかたないので、C#の event 修飾子 を模倣した Event<T> クラスを作ってみました。

JAVA:
  1. package ncommon;
  2.  
  3. import java.util.LinkedList;
  4. import java.util.List;
  5.  
  6. /**
  7. * イベントを管理するクラス。
  8. * @author naou
  9. */
  10. public class Event<t> {
  11.     private List</t><t> handlers = new LinkedList</t><t>();
  12.     private List</t><t> copyHandlers = new LinkedList</t><t>();
  13.     private boolean changed = false;
  14.    
  15.     /**
  16.      * イベントハンドラを追加する。
  17.      * @param handler
  18.      */
  19.     public void addHandler(T handler){
  20.         handlers.add(handler);
  21.         changed = true;
  22.     }
  23.    
  24.     /**
  25.      * イベントハンドラを削除する。
  26.      * @param handler
  27.      */
  28.     public void removeHandler(T handler){
  29.         handlers.remove(handler);
  30.         changed = true;
  31.     }
  32.    
  33.     /**
  34.      * イベントコレクションを取得する。
  35.      * @return
  36.      */
  37.     public List</t><t> getHandlers(){
  38.         if( changed ){
  39.             copyHandlers = new LinkedList</t><t>(handlers);
  40.         }
  41.         return copyHandlers;
  42.     }
  43. }

handlers に対して、add/removeHander を行い、getHandlers を呼び出す際に、その複製を作るようにしています。
一見すると無駄な処理のようですが、コレは必要な処理なのです。

こうしないと、イベントハンドラ内でイベントを削除するとエラーが起きるんです^q^;
イベントハンドラリストに対して、ループ(for-each)してる祭に、イベントを追加及び削除すると、ループがおかしくなってしまうという罠です。

後は、イベントを実装したいクラスで、

JAVA:
  1. public interface IHogeHoge{
  2.     void onHogeHoge(Object sender, ...);
  3. }
  4.  
  5. Event event<IHogeHoge> = new ...
  6. public Event eventHogeHoge(){
  7.     return eventHogeHoge;
  8. }

こんな感じでイベント実装します。
ここでイベント発生元オブジェクトを sender として第一引数に指定するようにしています(C#の受け売り・・・w)

変数名は event・・・、イベント取得ゲッターは event ではじめるという、まさに俺ルールですwww

こうすれば、あとは任意の場所で、

JAVA:
  1. ...
  2. obj.eventHogeHoge().addHandler(new IHogeHoge(){
  3.     public onHogeHoge(Object sender, ...){
  4.         System.out.println("Called hogehoge");
  5.     }
  6. });
  7. ...

ってな感じで、イベントの内容を実装できます☆

あとついでに、Box<T>クラスを作ってみました。イメージとしてはポインタですね。
C# でいうところの out 修飾子代わりだったり、hoge == null ? default : hoge の代わりだったり、同期処理の支援のためだったりと、このクラス、何かと役立ちそうですw

JAVA:
  1. package ncommon;
  2.  
  3. /**
  4. *
  5. * @author naou
  6. */
  7. public class Box</t><t> {
  8.     private T object = null;
  9.  
  10.     public Box(){
  11.     }
  12.  
  13.     public Box(T object){
  14.         this.object = object;
  15.     }
  16.  
  17.     public void clear(){
  18.         set(null);
  19.     }
  20.  
  21.     public boolean isNull(){
  22.         return object == null;
  23.     }
  24.  
  25.     /**
  26.      * @return the object
  27.      */
  28.     public T get() {
  29.         return object;
  30.     }
  31.  
  32.     public T get(T defaultValue){
  33.         if( isNull() ){
  34.             return defaultValue;
  35.         }
  36.         else{
  37.             return get();
  38.         }
  39.     }
  40.  
  41.     /**
  42.      * @param object the object to set
  43.      */
  44.     public void set(T object) {
  45.         this.object = object;
  46.     }
  47.  
  48.     @Override
  49.     public boolean equals(Object obj) {
  50.         if(obj instanceof Box){
  51.             Box b = (Box)obj;
  52.  
  53.             if( object == null ){
  54.                 return b.isNull();
  55.             }
  56.             else{
  57.                 return object.equals(b.get());
  58.             }
  59.         }else{
  60.             return false;
  61.         }
  62.     }
  63.  
  64.     @Override
  65.     public int hashCode() {
  66.         int hash = 7;
  67.         hash = 89 * hash + (this.object != null ? this.object.hashCode() : 0);
  68.         return hash;
  69.     }
  70. }

あとは、変数の設定が行われるたびにイベントを発生する EventedBox( extends Box ) とか、一行ごとにReadLine/WriteLine イベントを発生する EventedReader/EventedWriter 等など・・・便利そうなクラスを色々作っています。
あとは、ロガーとかも、WriteLog イベントを実装して、任意のログ出力処理を容易に書けるようにしています。

前に日記に書いた XmlDataDocument クラスをフルスクラッチして、XData クラスも作りました。
バグもつぶして、前よりも簡潔にアノテーションを指定できるようにしました。
これで、任意のXMLとJavaクラスのマッピングができるようになりました☆
Webアプリケーションとかで、XMLでデータを受け取った時に、Javaのオブジェクトにマッピングするといった事ができるようになりました。
XDesirialized を実装することで、デシリアライズした際に、妥当性を検証することもできます。
このクラスについては、いつかまたエントリでも書きます(`・ω・´)b

Written by ナ王 in: Java | タグ: ,
12月
28
2009
0

プレゼント for me

20091228_1もう二日前になりますが、コレもらいました☆
中身は・・・

20091228_2

こんな感じでした☆

さらにあけると・・・

20091228_3財布でした☆

前の財布が4年くらいたってて、いい感じにぼろぼろだったので丁度良かったです(`・ω・´)b

12月
21
2009
0

我が家の老犬

20091221我が家の老犬がもうそろそろヤバイって事で撮ってみました。
見事にそっぽむかれました(・ω・`;)

ちょっとアンシャープマスクかけてみたのですが・・・
凄くくっきりして逆に気持ち悪い写真になりましたw

Written by ナ王 in: その他, 写真 | タグ: , ,
12月
17
2009
0

近況

先月末から入院をしておりました。
耳の病気で、真珠種性中耳炎という病気です。
そして、今日、退院という運びになりました。

鼓膜の回復に時間がかかるために、2週間以上の入院生活となりましたが・・・、
1週間もすぎると体感的には病気という感じがまったくしませんw

そこで・・・体がなまりすぎてもいけないということで、外出許可を頂き、近くの公園へ行きました。

20091217_1
ベンチだけでは寂しかったので、一つアクセントということでおいてみましたw

20091217_2
不思議な感じのする一枚が撮れました。
時間はまだ夕方前くらいの時間です。
リサイズ以外の加工は一切していません。

デジタルカメラのダイナミックレンジの低さ故の絵ですね。
フィルムだと、デジタルカメラの倍程度のレンジを持っているので、また違った絵になるんでしょうねぇ・・・(最近フィルムにも興味が・・・)

以上、RICHO GR2 の提供でした☆

Written by ナ王 in: 写真, 近況 | タグ: ,
12月
17
2009
0

ソフトウェア公開・転載

StoneFever.NET においていた自作プログラムをこちらに移動しました。

ページ右上の「ソフトウェア」タブからもいけます。

Written by ナ王 in: C#, C/C++, Windows, プログラミング |
12月
17
2009
0

ドメインを一つ廃止

大学時代に作成したHP用に取ったドメイン、 stonefever,net を持っているのですが・・・ちょうど更新の時期が来たので、もう廃止しようと思います。

ドメイン廃止に伴い、HPも潰します。
もう誰も見てないでしょう?w
もともとこのHP名前自体も意味があってつけられたわけでもないし、もうHP自身も更新するつもりもないのでw

一部のコンテンツは、こちらのブログ上に移転します☆
今までありがとうございました☆

BYEBYE STONEFEFVER.NET

Written by ナ王 in: サイト運営 | タグ:

Powered by WordPress | Aeros Theme | TheBuckmaker.com