<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Yukun&#039;s Blog &#187; UML</title>
	<atom:link href="http://www.yukun.info/blog/tag/uml/feed" rel="self" type="application/rss+xml" />
	<link>http://www.yukun.info</link>
	<description>難しいことは分かりやすく、簡単なことは面白く紹介</description>
	<lastBuildDate>Thu, 26 Jan 2012 03:33:59 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Java: イベント駆動によるModelとViewの分離 &#8211; Observer パターン</title>
		<link>http://www.yukun.info/blog/2009/03/java-observe-event-model-view.html</link>
		<comments>http://www.yukun.info/blog/2009/03/java-observe-event-model-view.html#comments</comments>
		<pubDate>Tue, 17 Mar 2009 11:30:38 +0000</pubDate>
		<dc:creator>yukun</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[Time]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://www.yukun.info/?p=1401</guid>
		<description><![CDATA[よくGUIやWebアプリの簡単なサンプルソースなどは、UIとアプリケーションのロジックが同じクラスまたはメソッドに書かれている場合が多いです。それはそのサンプルがある特定の機能や関数の紹介の為に簡潔に書いているのですが、 &#8230; <a href="http://www.yukun.info/blog/2009/03/java-observe-event-model-view.html">Continue reading <span class="meta-nav">&#8594;</span></a><p><a href="http://www.yukun.info/blog/2009/03/java-observe-event-model-view.html">Java: イベント駆動によるModelとViewの分離 &#8211; Observer パターン</a> is a post from: <a href="http://www.yukun.info">Yukun&#039;s Blog</a></p>
]]></description>
			<content:encoded><![CDATA[<p>よくGUIやWebアプリの簡単なサンプルソースなどは、UIとアプリケーションのロジックが同じクラスまたはメソッドに書かれている場合が多いです。それはそのサンプルがある特定の機能や関数の紹介の為に簡潔に書いているのですが、仮にいざそのソースを元にアプリを作りこんで機能の追加を行っていくとUIとアプリのロジックは分離したほうが保守・拡張と共に行いやすいです。</p>
<p>下記のプログラムは1秒毎に数値をカウントし、それを2進数と10進数でGUI上のラベルに出力する機能をモデルとビューに分けています。すなわち、数値のカウントをするモデルと数値をUIに表示するビューに。（いくつかの言語ではGUIの部品として<a href="http://www.yukun.info/blog/2008/02/csharp-timer.html">タイマーがある</a>ようですが。。）</p>
<h2>実行結果</h2>
<p><a href="http://www.yukun.info/wp-content/uploads/count_timer01.png"><img src="http://www.yukun.info/wp-content/uploads/count_timer01.png" alt="count_timer01" title="count_timer01" width="125" height="69" class="size-full wp-image-1485" /></a></p>
<h2>クラス図</h2>
<p><a href="http://www.yukun.info/wp-content/uploads/countmodel_view_class.png"><img src="http://www.yukun.info/wp-content/uploads/countmodel_view_class-e1271583675800.png" alt="countmodel_view_class" title="countmodel_view_class" width="400" height="236" class="size-full wp-image-1486" /></a></p>
<p>インスタンスの生成はコンストラクタで行うのがいいのですが、はしょっています。さて、これまでに何らかのフレームワークを使っていた方には上クラス図はMVCの説明図として見慣れているかもしれません。今回ModelとViewを繋ぐControllerの役割はCountListenerが担っています（下記コードではCountChangeEvent経由でModelインスタンスを渡すのみですが）。</p>
<h3>処理手順</h3>
<p>ビュー側で自身のインスタンスをモデルに登録し（モデル.addCountListener(ビュー)）、モデルのデータが更新された場合、モデル→ビューへイベントを送出。イベント内部にモデルのデータがあり、そのデータでビューがUIを更新します。イベントの発生順序等は下図のシーケンス図のようになります。</p>
<h2>シーケンス図</h2>
<p><a href="http://www.yukun.info/wp-content/uploads/countmodel_view_sequence.png"><img src="http://www.yukun.info/wp-content/uploads/countmodel_view_sequence.png" alt="countmodel_view_sequence" title="countmodel_view_sequence" width="372" height="312" class="size-full wp-image-1487" /></a></p>
<h3>無限ループに注意</h3>
<p>ビューを更新するイベントリスナーのメソッド（ここではcountChanged()）で再度モデルのプロパティ変更メソッド（ここではsetCount()）を用いると、再度イベント通知処理（notifyToListeners()）が発生することで、無限ループになるので注意が必要です。</p>
<h3>ビューの追加手順</h3>
<p>ビューを追加する際の手順は、ビューのインスタンスをモデルのリスナーに登録し（addCountListener()）、ビュー自身がリスナーのメソッドを実装することで（countChanged()）、モデルからのイベントを受け取ることが出来ます。</p>
<p>そういえば最近はIDEの方でバインド設定したり、ObservableList等があるのであまり意識することがなくなってきたなぁ。</p>
<h2>ソースコード</h2>
<pre>
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;

class CountView extends JFrame implements CountListener{

	private final JLabel binaryLabel = new JLabel("0");
	private final JLabel decimalLabel = new JLabel("0");
	private CountModel cModel = new CountModel(0);

	public static void main(String[] args) {
		new CountView();
	}

	public CountView() {
		super("Counter");
		Container c = getContentPane();
		c.setLayout(new GridLayout(2, 2));
		c.add(new JLabel(" 2進数:"));
		c.add(binaryLabel);
		c.add(new JLabel("10進数:"));
		c.add(decimalLabel);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		cModel.addCountListener(this); // ModelにViewを登録

		pack();
		setVisible(true);
	}

	public void countChanged(CountChangeEvent e) {
		if (e.getSource() == cModel) {
			binaryLabel.setText(Integer.toString(cModel.getCount(), 2));
			decimalLabel.setText(Integer.toString(cModel.getCount(), 10));
		}
	}
}
</pre>
<pre>
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

/**
 * カウントするModel
 */
public class CountModel {

	private int count;
	private final List&lt;CountListener&gt; listeners = new ArrayList&lt;CountListener&gt;();
	private Timer t = new Timer(&quot;Count Timer&quot;, false);

	CountModel(int i) {
		count = i;
		t.scheduleAtFixedRate(new CountTime(), 0, 1000);
	}

	// Viewを登録
	public void addCountListener(CountListener listener) {
		listeners.add(listener);
	}

	public int getCount() {
		return count;
	}

	public void setCount(int i) {
		count = i;
		notifyToListeners();
	}

	// Viewへの通知
	private void notifyToListeners() {
		for (CountListener listener : listeners) {
			listener.countChanged(new CountChangeEvent(this));
		}
	}

	class CountTime extends TimerTask {
		@Override
		public void run() {
			setCount(getCount() + 1);
		}
	}
}
</pre>
<pre>
/**
 * View側で実装する(Model側から呼び出し)
 */
public interface CountListener {
	public void countChanged(CountChangeEvent e);
}

/**
 * 通知内容を表すイベント(Modelが生成しViewが受け取る)
 */
public class CountChangeEvent {
	private final CountModel source;

	public CountChangeEvent(CountModel count) {
		this.source = count;
	}

	public CountModel getSource() {
		return source;
	}
}
</pre>
<h4>関連すると思われる記事：</h4>
<ul class="similar-posts">
<li><a href="http://www.yukun.info/blog/2008/10/android-integer-to-binary-string.html" rel="bookmark" title="2008年10月29日">Android: 10進数→2進数変換アプリ</a></li>
<li><a href="http://www.yukun.info/blog/2008/02/csharp-timer.html" rel="bookmark" title="2008年2月24日">C#でキッチンタイマーを作ろう</a></li>
<li><a href="http://www.yukun.info/blog/2008/11/actionscript-flash-load-server-image-file.html" rel="bookmark" title="2008年11月21日">ActionScript: 画像ファイルをダウンロードして表示 &#8211; Loaderクラス</a></li>
<li><a href="http://www.yukun.info/blog/2009/03/java-design-pattern-simple-factory.html" rel="bookmark" title="2009年3月15日">Java, デザインパターン: Simple Factory &#8211; インスタンスの生成方法を任せる</a></li>
<li><a href="http://www.yukun.info/blog/2010/05/java-networkinterface-ipv6-ipv4.html" rel="bookmark" title="2010年5月16日">Java: インターフェースとローカルのIPv6, IPv4アドレスの取得 &#8211; NetworkInterfaceクラス</a></li>
</ul>
<p><!-- Similar Posts took 12.861 ms --></p>
<p><a href="http://www.yukun.info/blog/2009/03/java-observe-event-model-view.html">Java: イベント駆動によるModelとViewの分離 &#8211; Observer パターン</a> is a post from: <a href="http://www.yukun.info">Yukun&#039;s Blog</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.yukun.info/blog/2009/03/java-observe-event-model-view.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java, デザインパターン: Simple Factory &#8211; インスタンスの生成方法を任せる</title>
		<link>http://www.yukun.info/blog/2009/03/java-design-pattern-simple-factory.html</link>
		<comments>http://www.yukun.info/blog/2009/03/java-design-pattern-simple-factory.html#comments</comments>
		<pubDate>Sun, 15 Mar 2009 09:10:00 +0000</pubDate>
		<dc:creator>yukun</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://www.yukun.info/?p=1338</guid>
		<description><![CDATA[以前デザインパターンの理解の確認がてら簡単なコードを書いていたので投稿してみます。リファクタリングの前後を省いているので初見ではパターンのメリットと適応基準が見えにくく、またサンプルのテーマ設定が良くなかったのでイマイチ &#8230; <a href="http://www.yukun.info/blog/2009/03/java-design-pattern-simple-factory.html">Continue reading <span class="meta-nav">&#8594;</span></a><p><a href="http://www.yukun.info/blog/2009/03/java-design-pattern-simple-factory.html">Java, デザインパターン: Simple Factory &#8211; インスタンスの生成方法を任せる</a> is a post from: <a href="http://www.yukun.info">Yukun&#039;s Blog</a></p>
]]></description>
			<content:encoded><![CDATA[<p>以前デザインパターンの理解の確認がてら簡単なコードを書いていたので投稿してみます。リファクタリングの前後を省いているので初見ではパターンのメリットと適応基準が見えにくく、またサンプルのテーマ設定が良くなかったのでイマイチ説明し難い（反省）。今回のようなToyコードみたいなのはたまに書くのですが、Blog記事としてまとめるのが手間で大抵HDDの片隅に眠ってしまうのですが、今後はとりあえず上げていこうかと思います。説明などは隙をみて書き足していく感じでまず投稿、みたいな。ただ、そればっかりだと後で自分が読んだときに分からなくなるので、ほどほどにしよう。</p>
<h2>クラス図</h2>
<p><a href="http://www.yukun.info/wp-content/uploads/simple_factory_classes.png"><img src="http://www.yukun.info/wp-content/uploads/simple_factory_classes-e1271583536302.png" alt="simple_factory_classes" title="simple_factory_classes" width="400" height="196" class="size-full wp-image-1483" /></a></p>
<p>文字列の分割プログラム。</p>
<p>入力: クラス名＋＜区切り文字＞＋メソッド名の文字列<br />
出力: その文字列の分割結果が格納されたインスタンス（Namerクラス）。</p>
<p>文字列の形式が&#8221;＜クラス名＞#＜メソッド名＞&#8221;か&#8221;＜クラス名＞.＜メソッド名＞&#8221;によって、すなわち区切り文字によって分割処理のメソッドの内容が変わるので、その違いを派生クラスでオーバーライドして定義したメソッドで吸収しようというもの。</p>
<p>これによる利点はMain側が分割対象の文字列の形式を意識しなくてよいこと。単にNameFactory#getNamer()に渡すだけ。文字列の形式が2つの内のどちらで、どのクラスに処理を任せるかの処理はgetNamer()が行う。これによって、仮に文字列の形式を増やす場合に修正するのはgetNamer()のifブロック、追加するのは新しい派生クラス。</p>
<h2>ソースコード</h2>
<pre>
public class Main {

    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        NameFactory nameFactory = new NameFactory();
        Namer namer;
        namer = nameFactory.getNamer("String#indexOf()");
        printName(namer);
        namer = nameFactory.getNamer("ArrayList.get()");
        printName(namer);
        namer = nameFactory.getNamer("Thread#run()");
        printName(namer);
    }

    private void printName(Namer namer) {
        System.out.println("Class  Name: " + namer.className);
        System.out.println("Method Name: " + namer.methodName);
    }

}

public class NameFactory {
    // 区切り文字の種類によって、処理する派生クラスを決める
    public Namer getNamer(String input) {
        if (input.indexOf(".") > 0)
            return new PeriodNamer(input);
        else if (input.indexOf("#") > 0)
            return new SharpNamer(input);
        return null;
    }
}

public class Namer {

    protected String className;
    protected String methodName;

    public String getClassName() {
        return className;
    }

    public String getMethodName() {
        return methodName;
    }
}

public class SharpNamer extends Namer {
    // 「#」で名前を区切る
    public SharpNamer(String str) {
        int i = str.lastIndexOf("#");
        if (i > 0) {
            className = str.substring(0, i); // (beginIndex, endIndex)
            methodName = str.substring(i + 1); // (beginIndex)
        } else {
            className = "";
            methodName = str;
        }
    }
}

public class PeriodNamer extends Namer {
    // 「.」で名前を区切る
    public PeriodNamer(String str) {
        int i = str.lastIndexOf(".");
        if (i > 0) {
            className = str.substring(0, i); // (beginIndex, endIndex)
            methodName = str.substring(i + 1); // (beginIndex)
        } else {
            className = "";
            methodName = str;
        }
    }
}
</pre>
<h2>実行結果</h2>
<pre>
Class  Name: String
Method Name: indexOf()
Class  Name: ArrayList
Method Name: get()
Class  Name: Thread
Method Name: run()
</pre>
<p>書いた後ふと考えたのですが、これ100形式だと100派生クラスで、if-elseブロックもえらいことになるなぁ。こういう時、現時点では思考停止してしまうので、今月の課題。</p>
<p>今後はなるべく制作中のアプリの中での問題かそれに関わるもの、絡められるものを取り上げていきたい。</p>
<h4>関連すると思われる記事：</h4>
<ul class="similar-posts">
<li><a href="http://www.yukun.info/blog/2009/03/java-observe-event-model-view.html" rel="bookmark" title="2009年3月17日">Java: イベント駆動によるModelとViewの分離 &#8211; Observer パターン</a></li>
<li><a href="http://www.yukun.info/blog/2008/01/amateras-uml.html" rel="bookmark" title="2008年1月4日">JavaのソースコードからUMLのクラス図を作成</a></li>
<li><a href="http://www.yukun.info/blog/2011/02/java-tcp-socket-echo.html" rel="bookmark" title="2011年2月12日">Java: TCP Socket Echo Server/Client サンプル</a></li>
<li><a href="http://www.yukun.info/blog/2008/11/java-user-system-in-inputstream-read.html" rel="bookmark" title="2008年11月2日">Java: ユーザからの(標準)入力を取得 &#8211; System.inとInputStreamReaderクラス</a></li>
<li><a href="http://www.yukun.info/blog/2008/11/implement-chatterbot-append-suffix.html" rel="bookmark" title="2008年11月3日">人工無脳を作ってみる (1)入力文の末尾に文字列を追加</a></li>
</ul>
<p><!-- Similar Posts took 9.070 ms --></p>
<p><a href="http://www.yukun.info/blog/2009/03/java-design-pattern-simple-factory.html">Java, デザインパターン: Simple Factory &#8211; インスタンスの生成方法を任せる</a> is a post from: <a href="http://www.yukun.info">Yukun&#039;s Blog</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.yukun.info/blog/2009/03/java-design-pattern-simple-factory.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JavaのソースコードからUMLのクラス図を作成</title>
		<link>http://www.yukun.info/blog/2008/01/amateras-uml.html</link>
		<comments>http://www.yukun.info/blog/2008/01/amateras-uml.html#comments</comments>
		<pubDate>Fri, 04 Jan 2008 10:53:39 +0000</pubDate>
		<dc:creator>yukun</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Setting]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://www.yukun.info/trump/20080104/java%e3%81%ae%e3%82%bd%e3%83%bc%e3%82%b9%e3%82%b3%e3%83%bc%e3%83%89%e3%81%8b%e3%82%89uml%e3%81%ae%e3%82%af%e3%83%a9%e3%82%b9%e5%9b%b3%e3%82%92%e4%bd%9c%e6%88%90</guid>
		<description><![CDATA[統合開発環境のEclipseでJavaのオセロプログラム(講義の課題)を制作中に一度クラス図を作成しようと試みました。使用プラグインはAmaterasUMLでこちらのサイト(軽量なUMLプラグインAmaterasUML  &#8230; <a href="http://www.yukun.info/blog/2008/01/amateras-uml.html">Continue reading <span class="meta-nav">&#8594;</span></a><p><a href="http://www.yukun.info/blog/2008/01/amateras-uml.html">JavaのソースコードからUMLのクラス図を作成</a> is a post from: <a href="http://www.yukun.info">Yukun&#039;s Blog</a></p>
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.yukun.info/wp-content/uploads/othello01.png"><img src="http://www.yukun.info/wp-content/uploads/othello01-e1273384016708.png" alt="オセロプログラムの実行画面" title="othello01" width="300" height="319" class="size-full wp-image-1554" /></a></p>
<p>統合開発環境のEclipseでJavaのオセロプログラム(講義の課題)を制作中に一度クラス図を作成しようと試みました。使用プラグインは<a href="http://amateras.sourceforge.jp/cgi-bin/fswiki/wiki.cgi?page=AmaterasUML">AmaterasUML</a>でこちらのサイト(<a href="http://www.atmarkit.co.jp/fjava/rensai3/eclipseplgn14/eclipseplgn14_1.html">軽量なUMLプラグインAmaterasUML (1/4) &#8211; @IT</a>)を参考にしながらインストールを進めました。</p>
<p>さて、数あるUMLデザイナの中でこのプラグインのアドバンテージの一つはJavaクラスの継承関係などを包含したクラス図をソースコードから生成できる点にあると私は考えます。<br />
その作り方は、まず「ファイル」→「新規」→「その他」から「AmaterasUML」→「クラス図」と選択してクラス図ファイルを作成し、そのファイルをダブルクリックしクラス図エディタを起動します。その上にクラスファイルをドラックアンドドロップすれば、そのクラスのクラス図が作成されます。また継承関係などを表したい場合は、その関係のクラスを選択した上でドラッグ＆ドロップすればOK。下図にその使用状況を示します。</p>
<p><a href="http://www.yukun.info/wp-content/uploads/eclipseOthUMLs.png"><img src="http://www.yukun.info/wp-content/uploads/eclipseOthUMLs-e1273384060843.png" alt="AmaterasUMLの使用画面" title="eclipseOthUMLs" width="400" height="312" class="size-full wp-image-1556" /></a></p>
<p>ちなみに、これによって作成された図は画像形式でエクスポートできます。<br />
人にプログラムの構造の説明する際に役立つので重宝しています。<br />
<h4>関連すると思われる記事：</h4>
<ul class="similar-posts">
<li><a href="http://www.yukun.info/blog/2010/04/setup-eclipse-64bit-android.html" rel="bookmark" title="2010年4月25日">Windows7 64bitにEclipseでAndroid開発環境をセットアップ</a></li>
<li><a href="http://www.yukun.info/blog/2008/01/eclipse-cdt.html" rel="bookmark" title="2008年1月11日">Eclipse+CDTを用いてプロジェクトを作成する際の注意点</a></li>
<li><a href="http://www.yukun.info/blog/2009/03/java-design-pattern-simple-factory.html" rel="bookmark" title="2009年3月15日">Java, デザインパターン: Simple Factory &#8211; インスタンスの生成方法を任せる</a></li>
<li><a href="http://www.yukun.info/blog/2009/03/java-observe-event-model-view.html" rel="bookmark" title="2009年3月17日">Java: イベント駆動によるModelとViewの分離 &#8211; Observer パターン</a></li>
<li><a href="http://www.yukun.info/blog/2010/03/java-no-suitable-driver-found.html" rel="bookmark" title="2010年3月24日">Java, Servlet: No suitable driver found for &#8220;～&#8221; の原因と解決法</a></li>
</ul>
<p><!-- Similar Posts took 13.040 ms --></p>
<p><a href="http://www.yukun.info/blog/2008/01/amateras-uml.html">JavaのソースコードからUMLのクラス図を作成</a> is a post from: <a href="http://www.yukun.info">Yukun&#039;s Blog</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.yukun.info/blog/2008/01/amateras-uml.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

