<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>設計技法</title><link>http://blogs.wankuma.com/nagise/category/1394.aspx</link><description>プログラムの設計にまつわる事項</description><managingEditor>凪瀬</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>凪瀬</dc:creator><title>複数通貨のMoneyをジェネリクスで作る</title><link>http://blogs.wankuma.com/nagise/archive/2009/05/19/173180.aspx</link><pubDate>Tue, 19 May 2009 00:54:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2009/05/19/173180.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/173180.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2009/05/19/173180.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/173180.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/173180.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://kanazawa-process.g.hatena.ne.jp/katzchang/20090517/1242513168"&gt;Kanazawa.process&lt;/a&gt;では&lt;a href="http://d.hatena.ne.jp/asin/4894717115"&gt;テスト駆動開発入門&lt;/a&gt;を読んで、テスト駆動開発を学びました。その本でのテスト駆動開発のサンプルとして挙がっていたテーマは複数通貨のMoneyを作るというものでした。&lt;/p&gt;

&lt;p&gt;Dollarという米ドルを表現するオブジェクトを作り、Francというスイス・フランを表すオブジェクトを作り、そしてMoneyというオブジェクトに統合していくというリファクタリングの過程を経ています。&lt;/p&gt;

&lt;p&gt;これをジェネリクスを使って設計したらどうなるでしょうか。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;abstract&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;T&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;T&amp;gt;&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;abstract&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;T&amp;nbsp;add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;?&amp;gt;&amp;nbsp;m&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Moneyオブジェクトに演算用のメソッドadd()を定義します。引き算や掛け算など要求に合わせて各種用意するといいでしょう。&lt;/p&gt;

&lt;p&gt;&lt;font color="#000000"&gt;Money&amp;lt;T&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;T&amp;gt;&amp;gt;
という型変数の宣言方法は&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/05/25/139308.aspx"&gt;自己言及するジェネリクス&lt;/a&gt;の稿で
取り上げた手法です。add()の戻り型をTとしておくことで具象型自身の型を返させることができます。&lt;/p&gt;

&lt;p&gt;これをDollarやFrancでオーバーライドして実装します。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Dollar&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;Dollar&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#646464"&gt;@Override&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Dollar&amp;nbsp;add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;?&amp;gt;&amp;nbsp;m&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;...&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;こうすることで、Dollarのadd()はDollar型で返るわけです。
しかし、これだけだとDollarやFrancといった通貨単位ごとにadd()の実装を施さねばなりません。
protectedなファクトリーメソッドを用意して、オブジェクトの生成を具象型に委譲することで
スーパークラスであるMoney型で統一的にadd()を記述することができます。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;abstract&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;T&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;T&amp;gt;&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;為替レート&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Map&amp;lt;Class&amp;lt;?&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;?&amp;gt;&amp;gt;,&amp;nbsp;Map&amp;lt;Class&amp;lt;?&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;?&amp;gt;&amp;gt;,&amp;nbsp;Double&amp;gt;&amp;gt;&amp;nbsp;rateMap;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;値&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;protected&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;double&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;value;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;加算メソッドの共通実装&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;T&amp;nbsp;add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;?&amp;gt;&amp;nbsp;m&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;double&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;rate&amp;nbsp;=&amp;nbsp;rateMap.get&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.getClass&lt;/font&gt;&lt;font color="#000000"&gt;())&lt;/font&gt;&lt;font color="#000000"&gt;.get&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;m.getClass&lt;/font&gt;&lt;font color="#000000"&gt;())&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;getInstance&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.value&amp;nbsp;+&amp;nbsp;m.value&amp;nbsp;*&amp;nbsp;rate&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;具象型の生成&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;protected&amp;nbsp;abstract&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;T&amp;nbsp;getInstance&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;double&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;value&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;コンストラクタ&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;protected&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Money&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;double&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;value&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.value&amp;nbsp;=&amp;nbsp;value;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;こうした手法で通貨単位ごとに型を作って何が嬉しいかと言えば、ドル建てである場所にスイス・フランの型が紛れ込んだ場合に
コンパイルエラーにすることができるという点です。&lt;/p&gt;

&lt;p&gt;設計にはいろんな手法がありますし、それぞれにメリット、デメリットがあるので要求に合わせて柔軟に選べるようにしたいものですね。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/173180.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>ソフトウェア品質の12の属性</title><link>http://blogs.wankuma.com/nagise/archive/2009/02/03/167335.aspx</link><pubDate>Tue, 03 Feb 2009 08:36:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2009/02/03/167335.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/167335.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2009/02/03/167335.aspx#Feedback</comments><slash:comments>582</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/167335.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/167335.aspx</trackback:ping><description>&lt;p&gt;システム開発において「品質の向上」という標語がしばしば掲げられますが、
「品質の属性」については無頓着なケースが多いのではないでしょうか。&lt;/p&gt;

&lt;p&gt;ひとくちに品質といっても多様な属性があります。
顧客と品質の話で揉めたことはありませんか？
品質には多様な属性があり、単一の軸で良しあしを決められないという側面があります。
そのため、単に「品質」と言ってしまうと認識に齟齬が生じるのです。&lt;/p&gt;

&lt;p&gt;Karl E. Wiegers氏が著書
「&lt;a href="http://www.amazon.co.jp/dp/4891003545"&gt;ソフトウェア要求&lt;/a&gt;」
で挙げた、すべてのプロジェクトが検討すべき12の属性は以下のとおりです。&lt;/p&gt;

&lt;table border="1"&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;可用性&lt;/td&gt;&lt;td&gt;availability&lt;/td&gt;
&lt;td&gt;動作可能時間の指標。システム故障までの平均時間MTTF(Mean Time To Failure)を
平均修復時間MTTR(Mean Time To Repair)とMTTFの合計で割った値。稼働率とも呼ばれる。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;効率性&lt;/td&gt;&lt;td&gt;efficiency&lt;/td&gt;
&lt;td&gt;同じ処理性能を出すのにどのぐらいのハードウェアのスペックが必要か。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;柔軟性&lt;/td&gt;&lt;td&gt;flexibility&lt;/td&gt;
&lt;td&gt;機能拡張への柔軟性。順次拡張していくアジャイル開発を可能にするためには
ある程度の柔軟性を備えた設計にする必要がある。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;完全性&lt;/td&gt;&lt;td&gt;integrity&lt;/td&gt;
&lt;td&gt;データが正確で完全であること。改ざんなどされておらず、正しく動作すること。
情報セキュリティの目標事項のひとつとして挙げられる。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;相互接続性&lt;/td&gt;&lt;td&gt;interoperability&lt;/td&gt;
&lt;td&gt;他システムとのデータ連携の容易さ。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;保守性&lt;/td&gt;&lt;td&gt;maintainability&lt;/td&gt;
&lt;td&gt;バグの修正や仕様変更の容易性。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;移植性&lt;/td&gt;&lt;td&gt;portability&lt;/td&gt;
&lt;td&gt;ある稼働環境から、別の稼働環境へ移行させるために要する工数など。
JavaなどにみられるVM方式など高レイヤでの稼働システムは移植性が高いとも言える。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;信頼性&lt;/td&gt;&lt;td&gt;reliability&lt;/td&gt;
&lt;td&gt;特定の期間、故障なしでソフトウェアを実行できる可能性。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;再利用性&lt;/td&gt;&lt;td&gt;reusability&lt;/td&gt;
&lt;td&gt;プログラムコードの再利用性。オブジェクト指向などによるモジュール化によって高めることができる。
もっとも、日本だとソースコードが納品先の所有になる契約となることが多くライセンスの問題で再利用性が低い。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;堅牢性&lt;/td&gt;&lt;td&gt;robustness&lt;/td&gt;
&lt;td&gt;耐障害性。異常データなどの入力に対する耐性。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;試験性&lt;/td&gt;&lt;td&gt;testability&lt;/td&gt;
&lt;td&gt;テストのしやすさ。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;使用性&lt;/td&gt;&lt;td&gt;usability&lt;/td&gt;
&lt;td&gt;ユーザビリティ。使いやすさ。&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;これらは多くのプロジェクトに共通する属性ですが、もちろんこれで全てと言うわけではなく
特定ジャンルではさらに追加の品質属性を考慮する必要が出てきます。同じ本から引用すると
「組み込みシステムに重要な品質属性としてはさらに安全性、導入容易性、サービス能力があります。
スケータビリティは、インターネットアプリケーションに重要なもう一つの属性です。」
ということになるでしょう。&lt;/p&gt;

&lt;p&gt;これらの品質属性は、すべてを同時に上げることができません。トレードオフが発生するのです。&lt;/p&gt;

&lt;h3&gt;品質属性のトレードオフ&lt;/h3&gt;

&lt;p&gt;これら品質の属性は、相互に作用し合っています。
ある属性を高めれば他の属性も高まる、あるいは低くなるということがおきます。
以下の表は左側の属性を上げた場合に上側のどの属性が高く、あるいは低くなるかを表しています。
（追記：引用元「ソフトウェア要求」228ページ）&lt;/p&gt;

&lt;table border="1"&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;可&lt;br&gt;用&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;効&lt;br&gt;率&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;柔&lt;br&gt;軟&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;完&lt;br&gt;全&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;相&lt;br&gt;互&lt;br&gt;接&lt;br&gt;続&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;保&lt;br&gt;守&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;移&lt;br&gt;植&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;信&lt;br&gt;頼&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;再&lt;br&gt;利&lt;br&gt;用&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;堅&lt;br&gt;牢&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;試&lt;br&gt;験&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;使&lt;br&gt;用&lt;br&gt;性&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;可用性&lt;/th&gt;    &lt;td&gt;&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;効率性&lt;/th&gt;    &lt;td&gt;　&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;柔軟性&lt;/th&gt;    &lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;完全性&lt;/th&gt;    &lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;相互接続性&lt;/th&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;保守性&lt;/th&gt;    &lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;移植性&lt;/th&gt;    &lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;信頼性&lt;/th&gt;    &lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;再利用性&lt;/th&gt;  &lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;堅牢性&lt;/th&gt;    &lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;試験性&lt;/th&gt;    &lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;使用性&lt;/th&gt;    &lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tr&gt;
&lt;/table&gt;


&lt;p&gt;まずは品質には属性があることを顧客に伝えましょう。
そして属性にトレードオフが発生することを理解してもらいましょう。&lt;/p&gt;

&lt;h3&gt;ソフトウェア工学と品質属性&lt;/h3&gt;

&lt;p&gt;ソフトウェア工学の数々の成果はこれらの品質属性にどう影響を与えたのでしょうか？&lt;/p&gt;

&lt;h4&gt;構造化プログラミング&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;試験性&lt;/strong&gt; - 適切なモジュール分割は試験性を高めます。より高めるにはステートレスな機能を意識的に分割することです。
	ステートレスな関数は引数と戻り値によって容易にテストでき、自動テストなどによる自動化も行いやすくなります。&lt;br&gt;
再利用性 - 構造化によりある程度、再利用性が高まりました。&lt;/p&gt;

&lt;h4&gt;契約に基づくプログラミング&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;完全性・堅牢性&lt;/strong&gt; - モジュール間での「契約に基づくプログラミング」のほつれに対して
	適切にエラー処理を施すことで完全性・堅牢性を高めることができます。&lt;/p&gt;

&lt;h4&gt;オブジェクト指向&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;柔軟性・保守性&lt;/strong&gt; - オブジェクト指向によって動的なフローチャートになるプログラムを容易に制御できるようになりました（ポリモフィズム）。
	これを活用することで、既存箇所に手を入れることなく追加のクラスを作成するだけでの拡張が可能になります。&lt;br&gt;
&lt;strong&gt;再利用性&lt;/strong&gt; - 構造化プログラミングよりさらに再利用性を高めることができます。
	ポリモフィズムを活用したプログラミングは再利用性の点でも優れています。&lt;/p&gt;

&lt;h4&gt;VM技術、仮想化技術&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;移植性&lt;/strong&gt; - Javaの標榜する"Write once, run anywhere"は究極の移植性と言えます。
	現在のJava開発は主にWindows機上で行われており、そのままUnix系のOSで稼働する本番機で動作させる
	ようなことが行われています。携帯電話におけるJavaMEの採用もこの点を活用してのことです。&lt;/p&gt;

&lt;h4&gt;O/Rマッピング&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;移植性&lt;/strong&gt; - O/RマッピングもDBを特定製品に縛らないという意味で移植性を高める効果があります。&lt;/p&gt;

&lt;h4&gt;DIコンテナ&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;柔軟性・保守性&lt;/strong&gt; - DIコンテナによる設計は柔軟性・保守性を高めます。&lt;br&gt;
&lt;strong&gt;試験性&lt;/strong&gt; - DIコンテナによる疎結合は試験性をより高めます。DBなどを伴うシステムですら、
	スタブによって自動テスト化することが容易になりました。&lt;/p&gt;

&lt;p&gt;ここでは目立つ特徴をピックアップしましたが、もちろん品質属性への影響はここに挙げただけにはとどまりません。
各種パラダイムを眺める際に、品質属性への影響と言う点でみつめるとまた違ったものが見えてくるかもしれません。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/167335.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>次世代のカプセル化手法</title><link>http://blogs.wankuma.com/nagise/archive/2009/01/07/165863.aspx</link><pubDate>Wed, 07 Jan 2009 21:48:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2009/01/07/165863.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/165863.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2009/01/07/165863.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/165863.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/165863.aspx</trackback:ping><description>&lt;p&gt;「interfaceに物申す」
(&lt;a href="http://blogs.wankuma.com/episteme/archive/2009/01/06/165674.aspx"&gt;1&lt;/a&gt;)
(&lt;a href="http://blogs.wankuma.com/episteme/archive/2009/01/06/165690.aspx"&gt;2&lt;/a&gt;)
(&lt;a href="http://blogs.wankuma.com/episteme/archive/2009/01/07/165775.aspx"&gt;3&lt;/a&gt;)
は、public, protected, privateといったアクセス制御の修飾子によるカプセル化の限界を憂いたものです。&lt;/p&gt;

&lt;p&gt;そもそもこれらの修飾子はクラスを境界としたカプセル化であるため、デザインパターンなどクラス群で表現されるモジュールの
内外の境界でのカプセル化には無力です。
Javaではパッケージプライベートというアクセス制御レベルも存在しますが、モジュール境界とパッケージ境界を一致させることが
現実的ではないことはご周知のとおりです。
こうしたクラス群で表現されるモジュールに対して、カプセル化を行うための新たな機能が求められているわけです。&lt;/p&gt;

&lt;p&gt;そこでスーパーパッケージ(superpackage)という概念が提唱されました。
これはJSR 294として仕様の策定が行われており、Java7で搭載される見込みです。
(&lt;a href="http://www.infoq.com/news/2009/01/java7-updated"&gt;http://www.infoq.com/news/2009/01/java7-updated&lt;/a&gt;参照)&lt;/p&gt;

&lt;p&gt;スーパーパッケージについては
&lt;a href="http://journal.mycom.co.jp/articles/2007/05/13/superpackage/"&gt;http://journal.mycom.co.jp/articles/2007/05/13/superpackage/&lt;/a&gt;
が比較的詳しいかと思います。&lt;/p&gt;




&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/165863.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>アーキテクチャ選定を考える</title><link>http://blogs.wankuma.com/nagise/archive/2008/09/28/157667.aspx</link><pubDate>Sun, 28 Sep 2008 14:15:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/09/28/157667.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/157667.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/09/28/157667.aspx#Feedback</comments><slash:comments>1040</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/157667.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/157667.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/09/25/157505.aspx"&gt;アーキテクチャ選定ではメリットとデメリットを考える&lt;/a&gt;
ではフレームワークやアーキテクチャの選定は合目的でなくてはならない、ということを言いましたが、
「システムの贅肉」という曖昧な概念を説明できていませんでした。&lt;/p&gt;

&lt;p&gt;なんとなくイメージはできるんだけど、論理的な定義をうまくあたえれていない…。&lt;/p&gt;

&lt;h4&gt;骨格 ＝ 要件の大きさ&lt;/h4&gt;

&lt;p&gt;まず、確認しておくことは、システムの規模そのものの大きさです。
要件定義・要件開発において、スマートになるように要件を決めよう、という話題ですね。&lt;/p&gt;

&lt;p&gt;お客さんに「ちょっとここはこうなるようにしてほしい」とか言われたときに気にするのがこの点。
今の設計に無理なく乗るなら軽く「いいですよ」と返せるところですが、その一見小さく見える事象に対応するために
骨格がいびつになるような場合は悩んでしまいますね。&lt;/p&gt;

&lt;p&gt;さて、そんな要件開発ですが、絶対値というか、要求される事象の大きさの下限は決まっていて、
目的を達成するために必要な最低限の骨格を作るだけでも、とても大きな骨格になってしまうものもあります。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/Nagise/20080915/1221462208"&gt;ネズミかゾウかではなくて、肥満か筋肉質かだろう&lt;/a&gt;が言っているのは
この骨格の大きさと、プログラミングのまずさからくる贅肉を混同するな、ということですね。&lt;/p&gt;

&lt;h4&gt;体の大きさ ＝ 実装の大きさ&lt;/h4&gt;

&lt;p&gt;要件を実装するにあたって、実装手段によってソースコード、つまるところ実装の大きさが異なります。
大雑把にいえばステップ数ですね。
(ステップ数という単位は誤差が酷いのであまり使いたくないですが、プログラムの大きさと正の相関を持つのは事実)&lt;/p&gt;

&lt;h4&gt;成長の早さ ＝ リリースまでの期間&lt;/h4&gt;

&lt;p&gt;システムを完成させるまでの期間、というのはゾウなりネズミなりが成人するまでの期間に相当するでしょう。&lt;/p&gt;

&lt;p&gt;ゆっくり時間をかけて成長（プログラミング）が進み、完成までに数年の歳月を費やすシステムもあれば、
非常に高速で成長しわずかに数か月で稼働にこぎつけるシステムもあることでしょう。&lt;/p&gt;

&lt;p&gt;一般には、小さなシステムの方が、リリースまでの期間は早く、大きなシステムほどリリース時期は遅い。&lt;/p&gt;

&lt;h4&gt;養育費用 ＝ 開発コスト&lt;/h4&gt;

&lt;p&gt;成人までの間にどれだけの費用を投入したのかという数値ですね。&lt;/p&gt;

&lt;h4&gt;成人後の成長 ＝ アジャイル性&lt;/h4&gt;

&lt;p&gt;アジャイルなシステムというのは成人が早い。割と未熟なうちにリリースしてしまう。
リリース後の成長も大きく、成人してからも代謝が高いのですね。&lt;/p&gt;

&lt;p&gt;対してウォーターフォール式のシステム開発などは、成人後にほとんど成長は止まってしまう。
下手をすると成長などまるでなくて、「老後の介護」にばかり手間がかかるということもありえるのです。&lt;/p&gt;

&lt;p&gt;代謝を高めるための設計手法と言うのもあります。こうした後の変更がある場合にそれは活きてくる。
でも、いざそのときが来ない限りはそうした設計の良さというのは日の目を見ない。
&lt;a href="http://blogs.wankuma.com/nagise/archive/2007/11/06/106319.aspx"&gt;ソフトウェアの保守性はアップサイドリスクである&lt;/a&gt;
で言ったのはそういう事情のことなのですね。&lt;/p&gt;

&lt;h4&gt;寿命 ＝ システムの寿命&lt;/h4&gt;

&lt;p&gt;システムは改修をしつつ、使われるわけですが、やがて寿命を迎えます。死因はさまざまですが、&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;
&lt;li&gt;土台となるOSやミドルウェアが死んだ
&lt;li&gt;要求の変更に対応できなくなった
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;というのが大きいかなと思います。&lt;/p&gt;

&lt;p&gt;システムというのは設計時に、いろんな前提条件を加味します。こういう部分は変更が容易なように、この辺は変えなくてもよい、とかいろいろ。
「全部対応できるように」だといくらカネがあっても足りません。&lt;/p&gt;

&lt;p&gt;それらの前提が覆ってしまったとき、それがシステムが死ぬべき時だと私は考えます。&lt;/p&gt;

&lt;h4&gt;贅肉・筋肉 ＝ ？？？&lt;/h4&gt;

&lt;p&gt;さて、問題となるのがここですね。「実装の質」と言いたいところですが、ひとことに「質」と言っても質にも種類があるので混乱しやすい。&lt;/p&gt;

&lt;p&gt;例えば、高い処理効率（パフォーマンス）をたたき出すようなカリカリにチューニングされたソースコードというのは、
変更に対してとても弱い。柔軟性に欠けるわけですね。&lt;/p&gt;

&lt;p&gt;逆に抽象化を施し、仕様変更などにも柔軟に対応できるようなコードというのはパフォーマンスで劣る。柔軟だけど速度は遅い。&lt;/p&gt;

&lt;p&gt;なので、これらのメリット・デメリットを考えた上で適度なところでバランスする必要があります。赤筋（反応が遅いが持続力がある）と白筋（反応が速いが持続力がない）みたいなもんですね。ハンマー投げの室伏広治氏は白筋が多く、マラソンは苦手だというエピソードもあります。状況を見て合致する「質」を選ばなくてはいけない。&lt;/p&gt;

&lt;p&gt;ただ、一見して贅肉と分かるものも中にはあって、&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;
&lt;li&gt;コードクローン。要するにコピー＆ペーストによって冗長なコードになっている状態
&lt;li&gt;構造化がうまくされていない
&lt;li&gt;データ構造が非効率
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;といったところはかなり目立つ贅肉ですね。データ構造が悪いと、それを処理するプログラムも煩雑になって贅肉が贅肉を呼ぶ状態。&lt;/p&gt;

&lt;p&gt;こうした、明らかな贅肉はそぎ落とすことでコードが数分の一になることがありますが、経験則からして1/10を超えない。
どんだけ贅肉で太らせようとても骨格が支えられないほどには大きくなる前にシステムが破たんするのではないかと思います。
人間の体重も世界記録では700kgぐらいらしく、限界までいっても10倍そこそこのようですね。&lt;/p&gt;

&lt;h4&gt;体脂肪を落とす効率&lt;/h4&gt;

&lt;p&gt;システムの贅肉を落とし、体脂肪率を10%にするためのコストと、体脂肪率10%から1%に落とすコスト、1%から0.1%に落とすコストが概ね等しいと思います。(&lt;a href="http://d.hatena.ne.jp/katzchang/20080925"&gt;無責任な社会、限定責任な社会&lt;/a&gt;から着想)&lt;/p&gt;

&lt;p&gt;まぁこれは概念的な話なので数字が正確かというと怪しいのだけども、指数関数的だよね、というのは理解いただきたい。
過度なダイエットは費用ばかりが嵩むので、ほどほどの贅肉は許容せざるをえないというわけです。&lt;/p&gt;

&lt;p&gt;とはいえ、このほどほどの贅肉はコードが数分の一に縮むほどの贅肉じゃない。人間だって体脂肪率が0%になることはないでしょう？多少の脂肪に病的に神経質になっても仕方がない。&lt;/p&gt;

&lt;h4&gt;合目的なアーキテクチャ選定&lt;/h4&gt;

&lt;p&gt;フレームワークやアーキテクチャの選定は合目的でなくてはならない。そこで取り上げられる評価軸は「小規模 - 大規模」なんて単純な1軸ではないわけです。&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;
&lt;li&gt;システムの骨格の大きさ ： 要求事項の絶対値
&lt;li&gt;システムの実装の大きさ ： ソースコードの量
&lt;li&gt;リリースまでの期間 ： 開発速度
&lt;li&gt;リリースまでのコスト ： 開発生産性
&lt;li&gt;リリース後のコスト ： 可変性
&lt;li&gt;システムの寿命
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;「時間、品質、料金」のうちから、2つを選択できる、なんてジョークがあるのですが、示唆深いと思いませんか？&lt;/p&gt;

&lt;p&gt;これらのうち、何を活かして何に目をつぶるのか、その比率はどの程度にするのかというのが、アーキテクチャ選定で悩む部分です。
小さなシステムは、使い捨てにすることもできる。リリースまでの期間が短くコストも小さいなら、定期的に使い捨てにするという方法論もアリでしょう。
過去のリソースを使いたいからCOBOLで開発というのもコスト・リスクが見合うならあるいはアリでしょう。&lt;/p&gt;

&lt;p&gt;コンセプトは前提条件の上に繰り広げられるものです。コンセプトだけ聞くと「ないわー」と思うようなことでも、特定のシチュエーション下では「そうせざるを得ないね」という合理的なものであったりするのです。&lt;/p&gt;

&lt;p&gt;目的があってその実現手段としてアーキテクチャを選ぶのですから、アーキテクチャ単体だけを取り上げて安易に良しあしと言ってはいけない。&lt;/p&gt;

&lt;p&gt;出来ることなら、技能あるチームで今風のアーキテクチャで今風の設計をするようなシステム開発をやりたいものですね。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/157667.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>アーキテクチャ選定ではメリットとデメリットを考える</title><link>http://blogs.wankuma.com/nagise/archive/2008/09/25/157505.aspx</link><pubDate>Thu, 25 Sep 2008 23:16:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/09/25/157505.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/157505.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/09/25/157505.aspx#Feedback</comments><slash:comments>56</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/157505.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/157505.aspx</trackback:ping><description>&lt;p&gt;アルゴリズムであるとか、アーキテクチャというのは、必ずメリットとデメリットがあります。&lt;/p&gt;

&lt;p&gt;プログラマは前提条件に合わせてメリットが活き、デメリットは表に出ないように考えアルゴリズムの選定します。アーキテクトがフレームワークやアーキテクチャを選定する時も同等です。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/kwatch/20080912/1221174865"&gt;「大規模プロジェクトではどうするか」を考えるより、「大規模にしないためにはどうするか」を考えよう&lt;/a&gt;というエントリに対し、私は&lt;a href="http://d.hatena.ne.jp/Nagise/20080915/1221462208"&gt;ネズミかゾウかではなくて、肥満か筋肉質かだろう&lt;/a&gt;と答えたわけですが、さて、では筋肉質なシステムとはどんなシステムか？という話になります。&lt;/p&gt;

&lt;p&gt;思うに、筋肉質なシステムというのは、選定したアーキテクチャなり、フレームワークなりのメリットが活き、デメリットが隠れるようになっている、そんなシステムのことではないでしょうか。&lt;/p&gt;

&lt;p&gt;だから、それが例えばCOBOLで新規開発という話だったとしても、「過去資産を活用する」というメリットが大きく、その過去資産の活用のための工数がデメリットにならず、過去資産を流用することで未来の保守の工数が嵩むといったデメリットもでない、というなら筋肉質と言えましょう。&lt;/p&gt;

&lt;p&gt;通常は、このメリット・デメリットを秤にかけて、相応にメリットが大きいという状況でないといけないわけで、&lt;a href="http://itpro.nikkeibp.co.jp/article/NEWS/20080906/314277/"&gt;東京海上の例&lt;/a&gt;では、本当にデメリットは小さいの？と疑問に思うわけです。&lt;/p&gt;

&lt;p&gt;さて、ではJavaのフレームワークの中ではすっかり枯れた技術という評判のStrutsはどうなのでしょうか？Strutsは初出が2001年と古く、近年のAJAXなどの対応を盛り込むにはマッチしないフレームワークだと私は評しています。非同期通信を伴わない、単純なWebシステムで工数を抑えて機能を量産するというなら、それなりにメリットは活きるでしょうし、デメリットは隠れるのではないかと思います。&lt;/p&gt;

&lt;p&gt;これはStrutsに限らず、PHPやRubyでの開発でも、状況によってはメリットは活きず、デメリットが表出することになります。そうしたミスマッチな選択をしたプロジェクトは、その無理から脂肪のような無駄なソースが膨らみ、デメリットだらけとなってしまうことでしょう。私が選定するならFlexなどのリッチクライアントとかかなぁ。ユーザ容貌的にそちらの方がマッチして贅肉が少なくなる気がしますね。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/157505.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>ソートをしないで並び替え</title><link>http://blogs.wankuma.com/nagise/archive/2008/07/15/148909.aspx</link><pubDate>Tue, 15 Jul 2008 09:22:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/07/15/148909.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/148909.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/07/15/148909.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/148909.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/148909.aspx</trackback:ping><description>&lt;p&gt;ゆの in Javaとかに嵌って放出が遅れましたが、ソート祭りの話題。&lt;/p&gt;

&lt;h4&gt;非破壊で順序を変更してとりだす&lt;/h4&gt;

&lt;p&gt;GoFデザインパターンのIteratorパターンを用いて元になるListには手を加えずに
ソートと同じような効果を得るサンプルです。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;SortIterator&amp;lt;T&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;implements&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Iterator&amp;lt;T&amp;gt;,&amp;nbsp;Iterable&amp;lt;T&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;ソート対象&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;private&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Iterable&amp;lt;T&amp;gt;&amp;nbsp;target;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;ソート用Comparator.この実装を変えることで並ばせ方を変えられる&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;private&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Comparator&amp;lt;T&amp;gt;&amp;nbsp;comparator;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;private&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;T&amp;nbsp;preElement;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;private&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;List&amp;lt;T&amp;gt;&amp;nbsp;equalValues;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;コンストラクタ&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;&lt;/font&gt;&lt;font color="#7f9fbf"&gt;@param&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;target&amp;nbsp;ソート対象。SetやListなどを渡すことができる&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;&lt;/font&gt;&lt;font color="#7f9fbf"&gt;@param&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;comparator&amp;nbsp;並ばせ方を決めるComparatorの実装&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;SortIterator&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Iterable&amp;lt;T&amp;gt;&amp;nbsp;target,&amp;nbsp;Comparator&amp;lt;T&amp;gt;&amp;nbsp;comparator&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.target&amp;nbsp;=&amp;nbsp;target;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.comparator&amp;nbsp;=&amp;nbsp;comparator;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.equalValues&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;ArrayList&amp;lt;T&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#646464"&gt;@Override&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;boolean&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;hasNext&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;T&amp;nbsp;min&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;targetLoop:&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;for&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;T&amp;nbsp;elem&amp;nbsp;:&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.target&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;前回までに返した値より小さいものは飛ばす&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.preElement&amp;nbsp;!=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;null&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;amp;&amp;amp;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.comparator.compare&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.preElement,&amp;nbsp;elem&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;&amp;nbsp;&lt;/font&gt;&lt;font color="#990000"&gt;0&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;continue&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;前回と同じ値のものは、重複を確認してすでに返した値なら飛ばす&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.preElement&amp;nbsp;!=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;null&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;amp;&amp;amp;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.comparator.compare&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.preElement,&amp;nbsp;elem&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;==&amp;nbsp;&lt;/font&gt;&lt;font color="#990000"&gt;0&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;参照の同値性で判断するために敢えてcontains()は使わない&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;contains()だとequals()による比較になるため&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;for&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;T&amp;nbsp;value&amp;nbsp;:&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.equalValues&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;value&amp;nbsp;==&amp;nbsp;elem&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;continue&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;targetLoop;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.preElement&amp;nbsp;=&amp;nbsp;elem;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.equalValues.add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;elem&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;true&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;前回までに返した値より大きいもののうち、最小のものを探す&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;min&amp;nbsp;==&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;min&amp;nbsp;=&amp;nbsp;elem;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;continue&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.comparator.compare&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;min,&amp;nbsp;elem&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;&amp;nbsp;&lt;/font&gt;&lt;font color="#990000"&gt;0&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;min&amp;nbsp;=&amp;nbsp;elem;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;min&amp;nbsp;==&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;false&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.equalValues.clear&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.equalValues.add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;min&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.preElement&amp;nbsp;=&amp;nbsp;min;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;true&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#646464"&gt;@Override&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;T&amp;nbsp;next&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.preElement;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#646464"&gt;@Override&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;void&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;remove&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;throw&amp;nbsp;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;UnsupportedOperationException&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#646464"&gt;@Override&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Iterator&amp;lt;T&amp;gt;&amp;nbsp;iterator&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;これを以下のように呼び出します。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;List&amp;lt;Integer&amp;gt;&amp;nbsp;list&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;ArrayList&amp;lt;Integer&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;list.add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Integer&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#990000"&gt;3&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;list.add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Integer&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#990000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;list.add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Integer&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#990000"&gt;4&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;list.add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Integer&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#990000"&gt;2&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;list.add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Integer&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#990000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;SortIterator&amp;lt;Integer&amp;gt;&amp;nbsp;ite&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;SortIterator&amp;lt;Integer&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;list,&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Comparator&amp;lt;Integer&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;(){&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#646464"&gt;@Override&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;int&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;compare&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Integer&amp;nbsp;o1,&amp;nbsp;Integer&amp;nbsp;o2&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;o2.compareTo&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;o1&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;})&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;for&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;int&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;i&amp;nbsp;:&amp;nbsp;ite&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;System.out.println&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;i&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;出力結果は&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
1
1
2
3
4
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;ちゃんと整列していますね。&lt;/p&gt;

&lt;h4&gt;解説&lt;/h4&gt;

&lt;p&gt;このクラスではソート対象のIterableと比較に用いるComparatorを保持して
hasNext()のたびに今までに返した値より大きいもののうち一番小さいもの、
つまり「次に小さい奴」を探してnext()でそのオブジェクトを返します。&lt;/p&gt;

&lt;p&gt;最初に「データをちょうだい」と言われた時に「一番小さい奴」を探して返し、
「次のデータをちょうだい」と言われたら「次に小さい奴」を探して返し、
…。&lt;/p&gt;

&lt;p&gt;でも、それで利用側から見ると並び変わったように見えるんですね。&lt;/p&gt;

&lt;h4&gt;設計に利用するヒント&lt;/h4&gt;

&lt;p&gt;Listの中身そのものを並び替えた方が効果的なシチュエーションの方が多いかもしれませんが、
一時的に他の並び方を使いたいという場合はIterator側に並び替えを仕込むのも一つの手です。&lt;/p&gt;

&lt;p&gt;これは非破壊であることがメリットで、複数のスレッドからオブジェクトの持ついろんな属性での
並び替えを並列に取得することもできます(その間に元のListが変更されると動きがおかしくなりますが…)。&lt;/p&gt;

&lt;p&gt;そういう意味ではImmutableパターン、つまりオブジェクトを変更不可能にすることで
並列時の安全性を確保するようなケースで有用です。&lt;/p&gt;

&lt;p&gt;データを利用する人が多岐にわたる場合、自分の都合だけで並び替えるわけにいかないかもしれません。
そのような場合に、外付けでデータの順番が変わったように見せる手法があることを知っておくと
うまい設計を起こすヒントになるかもしれません。&lt;/p&gt;

&lt;p&gt;外から利用する分には中のデータの表現方法なんて隠蔽されていて関心の外ですから、
必要になった時に自転車操業的に「次に小さい奴」を探して渡す、でも大丈夫なんですよね。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/148909.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>サニタイズとハンガリアンとヒューマンエラーとアスペクト指向</title><link>http://blogs.wankuma.com/nagise/archive/2008/07/06/147607.aspx</link><pubDate>Sun, 06 Jul 2008 18:34:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/07/06/147607.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/147607.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/07/06/147607.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/147607.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/147607.aspx</trackback:ping><description>&lt;p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/gallu/20080702/p2"&gt;なぜこうもレビューされてないコードを記事に書く？&lt;/a&gt;
&lt;li&gt;&lt;a href="http://blogs.wankuma.com/jitta/archive/2008/07/06/147596.aspx"&gt;「サニタイズいうな」と「ハンガリアン」&lt;/a&gt;
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;このあたりの話題は、個々のプログラマに対して「気をつけろ」と注意喚起してもなくならない話題なのですが、
その背景的な部分をば少し。&lt;/p&gt;

&lt;h4&gt;サニタイズは消毒足り得ない&lt;/h4&gt;

&lt;p&gt;sanitize = 「無害にする」、という英単語ですが、≒ sanitate 「消毒する」と紹介されることが多いですね。
でも、この消毒という比喩は&lt;strong&gt;文学的ではあるけども、技術的には問題のある比喩&lt;/strong&gt;に思います。
XSS(Cross Site Scripting、クロスサイトスクリプティング)への対処として言われることが多いですね。&lt;/p&gt;

&lt;p&gt;現実の消毒というのは、&lt;strong&gt;過剰に繰り返しても問題はなく&lt;/strong&gt;、
消毒済みのものをそのままもう一度消毒しても構わない。
なので、食品衛生的な現場では過剰なぐらいに「とりあえず消毒」というスタンスでやるわけです。&lt;/p&gt;

&lt;p&gt;これに対しプログラム上やりたいことというのは
「その場の文脈でメタ文字となる文字をエスケープすること」
(&lt;a href="http://takagi-hiromitsu.jp/diary/20060115.html"&gt;
続・「サニタイズ言うなキャンペーン」とは&lt;/a&gt;より)なわけで、
例えば対HTMLでのエスケープ処理として"&amp;"といった記号を"&amp;amp;amp;"と置き換えたりするような処理です。
これは何度でも行える「消毒」ではなく、
&lt;strong&gt;正しい場所で一度きりしか実行してはいけない「変換処理」&lt;/strong&gt;なんですよね。&lt;/p&gt;

&lt;p&gt;しかし、プログラムにおけるエスケープは消毒とは違ってあくまで「変換処理」ですから、
&lt;strong&gt;正しい場所で一度だけ、しかも漏れなく行う必要&lt;/strong&gt;がある。
そして、その場所というのが、「HTMLを出力する場所全て」という
どうやって網羅するんだよ、と言いたくなる広範な個所なのですね。&lt;/p&gt;

&lt;h4&gt;ハンガリアン記法&lt;/h4&gt;

&lt;p&gt;話は変わってハンガリアン記法。
Jittaさんの言う「型によるハンガリアン（システム ハンガリアン）使うな」の話です。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95"&gt;
Wikipedia&lt;/a&gt;でも見てもらうと掴めると思うのですが、"iWindowHeight"みたいに、変数名の頭に型を表現する情報を
付加すると言う記法です。&lt;/p&gt;

&lt;p&gt;この記法、Javaなどの強い型付けの言語の場合、プログラム上の「型」と変数名での「型」と冗長になるんですね。
そしてプログラムでの「型」はコンパイル動作で機械的にチェックされるので型の相違などは
検出・修正できるわけでバグとなっていつまでも残るようなことはないわけです。
そして、この冗長を常に保つことの難しさというのが欠点として挙げられていて、
メリットがないということが言われている。&lt;/p&gt;

&lt;p&gt;ハンガリアン記法を保つためには、「全ての変数を宣言する箇所で」網羅的に命名を確認する必要があります。
そしてソースコードを修正する際に「型を変更する全てのケース」で網羅的に変数の命名も直さなくてはならない。&lt;/p&gt;

&lt;h4&gt;ヒューマンエラー&lt;/h4&gt;

&lt;p&gt;例えば、小学生低学年向けの、算数のドリルをやるとしましょう。算数の足し算を延々とやるわけです。
算数の足し算ぐらいは誰でもできますね。では、&lt;strong&gt;1万問のドリルで全問正解してください&lt;/strong&gt;、と言われたら
「そんなの簡単だよ」と言えるでしょうか？&lt;/p&gt;

&lt;p&gt;これは単純で簡単な作業であっても、&lt;strong&gt;人間はなんらかの間違いを犯す&lt;/strong&gt;と言うことです。
「うっかりして」の「うっかり」なのです。&lt;/p&gt;

&lt;p&gt;あなたがチームリーダーだとしましょう。10人のメンバー全員に1万問のドリルで全問正解させるにはどうしたらいいでしょうか？
この「うっかり」に対して「気合いを入れて」とか「集中して」とか&lt;strong&gt;精神論を掲げても、
確実性が上がるわけではありません&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;俗にサニタイズと呼ばれる処理も、ハンガリアン記法も、原理を理解して対処することは難しくはない。
(いや、サニタイズ言うなキャンペーンはその原理の理解がされていないことを憂いてのキャンペーンだったか…)
算数ドリルのような話題です。ただし、その数がべらぼうで、「うっかり」間違えることもあるというものです。&lt;/p&gt;

&lt;p&gt;10人分の計算ドリルをあなたが検算することで全問正解を目指すとしましょう。
あなたは検算を間違えないでやりとおせるでしょうか？
「うっかり」検算を間違えたりしないでしょうか？
XSSの話題というのはこの&lt;strong&gt;個々は簡単な作業なのだけども、
漏れなく実施しそれを保証するのが難しい&lt;/strong&gt;というところが本題です。
そして一か所でも漏れがあるとそれでセキュリティホールになる可能性があるって言うんだから嫌になる。&lt;/p&gt;

&lt;p&gt;ハンガリアンでもやはりきっちりと網羅して行うことの難しさというのがあって&lt;strong&gt;運用に堪えない&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;こうした部分にはヒューマンエラーがするりと入り込んでくるので頭が痛い問題です。&lt;/p&gt;

&lt;h4&gt;アスペクト指向というパラダイム&lt;/h4&gt;

&lt;p&gt;拙稿&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/03/25/129472.aspx"&gt;アスペクト指向の概念&lt;/a&gt;
でおおむね解説しているわけですが、アスペクト指向では&lt;strong&gt;「全てのXXに全部YYをする」&lt;/strong&gt;という事象を扱います。
これをアスペクト、「横断的関心事」と呼ぶわけです。
上記、挙げてきた件を解決しようという試みなわけですね。&lt;/p&gt;

&lt;p&gt;このアスペクト指向というのはOOP(オブジェクト指向プログラミング)の
概念とぶつかるものではなく、相補的なものと言えます。&lt;/p&gt;

&lt;p&gt;AOP(アスペクト指向プログラミング)に対応した言語では、関数のようなものを作って、
この処理を「全てのXX」に差し挟む、ということが記述できます。
この「全てのXX」という部分にOOPでのオブジェクトなどが用いられたりするわけです。&lt;/p&gt;

&lt;p&gt;また、AOP対応言語でなくとも、設計のパラダイムとしてのアスペクト指向というのはあって、
OOPでのデザインパターンでProxyパターンというものがありますが、これは、
Proxyするオブジェクトで前後に処理を一律に差し挟むことを可能とする。
アスペクト指向的な概念に対してOOPの枠内でできる対処法のひとつなんですね。&lt;/p&gt;

&lt;p&gt;XSSに代表されるように、横断的関心事というのは人間の手作業では
ヒューマンエラーとも密接に関わって非常に対処しにくい。
AOPはプログラミングのパラダイムとしてだけではなく、開発体制をいかに構築するか
(私はこれをシステムを構築するプログラミングの仕事と類似する事項と思っています)
という部分にも応用することができる。&lt;/p&gt;

&lt;p&gt;日常の開発の中で、こうしたアスペクトを捉えて、それを一網打尽にするジョインポイントはどこか、
そう考えると見えてくるものがいろいろあるのです。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/147607.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>Seaserのホットデプロイとリフレクション</title><link>http://blogs.wankuma.com/nagise/archive/2008/06/17/144134.aspx</link><pubDate>Tue, 17 Jun 2008 15:39:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/06/17/144134.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/144134.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/06/17/144134.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/144134.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/144134.aspx</trackback:ping><description>&lt;p&gt;Seaserのホットデプロイは開発向けにはなかなか便利ですが、これを使えるようにフレームワークの構成を考えるのはかなりしんどいものがあります。今回はハマったポイントとしてリフレクションを取り上げます。&lt;/p&gt;

&lt;h4&gt;Seaserのホットデプロイ&lt;/h4&gt;

&lt;p&gt;Seaserの&lt;a href="http://s2container.seasar.org/2.4/ja/DIContainer.html#SMARTdeploy"&gt;ホットデプロイ&lt;/a&gt;は
実行時に特定箇所でクラスローダを毎回新しくするというシンプルなものです。&lt;/p&gt;

&lt;p&gt;結構、割り切った作りになっているなぁというのが感想ですが、そのシンプルさと原理からいろいろと制限事項も生まれてしまう。&lt;/p&gt;

&lt;p&gt;今回、私がハマったところはフレームワーク内でリフレクションをする際に、クラスローダの違いからClassCastExceptionを出したり、NoSuchMethodExceptionを出したりしたことでした。&lt;/p&gt;

&lt;h4&gt;クラスローダの基礎知識&lt;/h4&gt;

&lt;p&gt;まず、基礎知識としてクラスローダが違う場合、同じClassでも代入互換性がありません。Classの同一性は、Class自身とそのクラスローダによって定められます。&lt;/p&gt;

&lt;p&gt;次に、クラスローダは階層構造をなしていて、まず親クラスローダにロード処理が移譲されます。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/ClassLoader.html"&gt;ClassLoader&lt;/a&gt;
&lt;blockquote&gt;
ClassLoader クラスは、委譲モデルを使ってクラスとリソースを探します。ClassLoader の各インスタンスは、関連する親クラスローダーを持ちます。クラスまたはリソースを見つけるために呼び出されると、ClassLoader インスタンスはそれ自体でクラスまたはリソースの検索を試みる前に、その検索を親クラスに委譲します。「ブートストラップクラスローダー」と呼ばれる仮想マシンの組み込みクラスローダーはそれ自体では親を持たず、ClassLoader インスタンスの親として動作します。
&lt;/blockquote&gt;
&lt;/p&gt;

&lt;p&gt;このため、親が同じである場合は、同じクラスローダ(つまるところ親)で読み込まれることで代入互換を持つことがあります。&lt;/p&gt;

&lt;h4&gt;クラスローダを跨ぐ場合のClassCastException&lt;/h4&gt;

&lt;p&gt;Seaserのホットデプロイは&lt;a href="http://s2container.seasar.org/2.4/s2-framework/ja/apidocs/org/seasar/framework/container/hotdeploy/HotdeployUtil.html"&gt;
HotdeployUtil&lt;/a&gt;のstart()とstop()の間でクラスローダが変わることで実現しています。&lt;/p&gt;

&lt;p&gt;なので、この区間の中と外ではクラスローダが異なります。そのため、戻り値のClassCastExceptionが発生することがあります。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#000000"&gt;SingletonS2ContainerFactory.init&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;S2Container&amp;nbsp;container&amp;nbsp;=&amp;nbsp;SingletonS2ContainerFactory.getContainer&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;HotdeployUtil.start&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;Object&amp;nbsp;o&amp;nbsp;=&amp;nbsp;container.getComponent&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;testLogic&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;System.out.println&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;o.getClass&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;.getClassLoader&lt;/font&gt;&lt;font color="#000000"&gt;())&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;Hoge&amp;nbsp;hoge&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Hoge&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;o;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;HotdeployUtil.stop&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
log4j:WARN No appenders could be found for logger (org.seasar.framework.container.factory.S2ContainerFactory).&lt;br&gt;
log4j:WARN Please initialize the log4j system properly.&lt;br&gt;
org.seasar.framework.container.hotdeploy.HotdeployClassLoader@6e70c7&lt;br&gt;
Exception in thread "main" java.lang.ClassCastException: test.logic.impl.TestLogicImpl cannot be cast to test.Hoge&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at test.LoaderTest.main(LoaderTest.java:19)
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;こうした再読込をおこなうタイプのクラスローダは親クラスローダへの委譲を行わないことで実現できます。親へ委譲してしまうと読み込み済みのクラスをリフレッシュすることができません。&lt;/p&gt;

&lt;p&gt;しかし、この場合、クラスローダ越境ができなくなります。通常は、親への委譲を先に行うことで、共通して読み込まれるクラスには互換があったわけですが、クラスをロードしなおすために、親への委譲を行わないようにすると、上記例のようにClassCastExceptionとなってしまうのです。&lt;/p&gt;

&lt;h4&gt;リフレクションの際のメソッドシグネチャにも注意！&lt;/h4&gt;

&lt;p&gt;こうしたクラスローダを跨いだ箇所でリフレクションを行っていると、わかりにくいバグに遭遇することがあります。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#000000"&gt;SingletonS2ContainerFactory.init&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;S2Container&amp;nbsp;container&amp;nbsp;=&amp;nbsp;SingletonS2ContainerFactory.getContainer&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;HotdeployUtil.start&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;Object&amp;nbsp;o&amp;nbsp;=&amp;nbsp;container.getComponent&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;testLogic&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;Method&lt;/font&gt;&lt;font color="#000000"&gt;[]&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;ms&amp;nbsp;=&amp;nbsp;o.getClass&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;.getMethods&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;System.out.println&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Arrays.toString&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;ms&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;Method&amp;nbsp;m&amp;nbsp;=&amp;nbsp;o.getClass&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;.getMethod&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;setHoge&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;,&amp;nbsp;Hoge.&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;HotdeployUtil.stop&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
log4j:WARN No appenders could be found for logger (org.seasar.framework.container.factory.S2ContainerFactory).&lt;br&gt;
log4j:WARN Please initialize the log4j system properly.&lt;br&gt;
[&lt;strong&gt;public void test.logic.impl.TestLogicImpl.setHoge(test.Hoge)&lt;/strong&gt;, public test.Hoge test.logic.impl.TestLogicImpl.getHoge(), public native int java.lang.Object.hashCode(), public final native java.lang.Class java.lang.Object.getClass(), public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException, public final void java.lang.Object.wait() throws java.lang.InterruptedException, public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException, public boolean java.lang.Object.equals(java.lang.Object), public java.lang.String java.lang.Object.toString(), public final native void java.lang.Object.notify(), public final native void java.lang.Object.notifyAll()]&lt;br&gt;
Exception in thread "main" java.lang.NoSuchMethodException: test.logic.impl.TestLogicImpl.setHoge(test.Hoge)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at java.lang.Class.getMethod(Unknown Source)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at test.LoaderTest.main(LoaderTest.java:24)
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;ご覧のように、setHoge(Hoge)が存在しているにも関わらず、NoSuchMethodExceptionが投げられsetHoge(Hoge)はない！と言われてしまうのです。これは、getMethod()の引数に渡すHoge.classと、読み込まれたコンポーネントのHoge.classでクラスローダが異なるためです。&lt;/p&gt;

&lt;h4&gt;開発用と割り切って全体を囲ってしまう&lt;/h4&gt;

&lt;p&gt;クラスローダの越境は非常に厄介ですので、処理の頭からお尻までまるごとクラスローダを差し替えるように使うのが無難です。&lt;/p&gt;

&lt;p&gt;Servletであれば、ホットデプロイ用の
&lt;a href="http://s2container.seasar.org/2.4/s2-framework/ja/apidocs/org/seasar/framework/container/hotdeploy/HotdeployFilter.html"&gt;HotdeployFilter&lt;/a&gt;
が用意されていますのでそちらでリクエストの全体で差し替えるほうがよいでしょうね。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/144134.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>ジェネリクスを最大限活用するための設計技法 Stateパターン編</title><link>http://blogs.wankuma.com/nagise/archive/2008/06/05/141783.aspx</link><pubDate>Thu, 05 Jun 2008 21:17:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/06/05/141783.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/141783.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/06/05/141783.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/141783.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/141783.aspx</trackback:ping><description>&lt;p&gt;今回はStateパターン編です。
Stateパターンはオブジェクト指向のポリモフィズムで動きを切り替えるという点で前回の
&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/05/30/140375.aspx"&gt;Strategyパターン&lt;/a&gt;と同じです。&lt;/p&gt;

&lt;p&gt;ただし、Stateパターンはそのインスタンス自身が「状態」を表現するという点で異なります。&lt;/p&gt;

&lt;h4&gt;電卓のUIのStateを作る&lt;/h4&gt;

&lt;p&gt;まず、Stateの使いどころですが、ここでは以前にわんくま同盟で取り上げられた
&lt;a href="http://blogs.wankuma.com/aqua/archive/2007/06/27/82456.aspx"&gt;電卓&lt;/a&gt;を例にしてみましょう。&lt;/p&gt;

&lt;p&gt;επιστημηさんのところに
&lt;a href="http://blogs.wankuma.com/episteme/archive/2007/07/12/84809.aspx"&gt;電卓を状態遷移で捉える&lt;/a&gt;
話題がでていたのですが、この状態遷移というのがStateパターンの使いどころになります。&lt;/p&gt;

&lt;p&gt;&lt;blockquote&gt;
&lt;table border="1"&gt;
&lt;caption&gt;電卓基本動作の状態遷移表&lt;/caption&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;th&gt;&lt;font color="#ff0000"&gt;初期状態&lt;/font&gt;&lt;/th&gt;
&lt;th&gt;&lt;font color="#008000"&gt;数値入力状態&lt;/font&gt;&lt;/th&gt;
&lt;th&gt;&lt;font color="#ffa500"&gt;数式作成状態&lt;/font&gt;&lt;/th&gt;
&lt;th&gt;&lt;font color="#0000ff"&gt;計算結果表示状態&lt;/font&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;数字入力&lt;/th&gt;

&lt;td&gt;なにかする&lt;br&gt;→&lt;font color="#008000"&gt;数値入力状態&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;なにかする&lt;br&gt;→&lt;font color="#008000"&gt;数値入力状態&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;なにかする&lt;br&gt;→&lt;font color="#008000"&gt;数値入力状態&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;なにかする&lt;br&gt;→&lt;font color="#008000"&gt;数値入力状態&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;

&lt;th&gt;演算子入力&lt;/th&gt;
&lt;td&gt;なにかする&lt;br&gt;→&lt;font color="#ff0000"&gt;初期状態&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;なにかする&lt;br&gt;→&lt;font color="#ffa500"&gt;数式作成状態&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;なにかする&lt;br&gt;→&lt;font color="#ffa500"&gt;数式作成状態&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;なにかする&lt;br&gt;→&lt;font color="#ffa500"&gt;数式作成状態&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;
&lt;th&gt;'='入力&lt;/th&gt;
&lt;td&gt;なにかする&lt;br&gt;→&lt;font color="#ff0000"&gt;初期状態&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;なにかする&lt;br&gt;→&lt;font color="#0000ff"&gt;計算結果表示状態&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;なにかする&lt;br&gt;→&lt;font color="#0000ff"&gt;計算結果表示状態&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;なにかする&lt;br&gt;→&lt;font color="#0000ff"&gt;計算結果表示状態&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;
&lt;th&gt;'C'入力&lt;/th&gt;
&lt;td&gt;なにかする&lt;br&gt;→&lt;font color="#ff0000"&gt;初期状態&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;なにかする&lt;br&gt;→&lt;font color="#ff0000"&gt;初期状態&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;なにかする&lt;br&gt;→&lt;font color="#ff0000"&gt;初期状態&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;なにかする&lt;br&gt;→&lt;font color="#ff0000"&gt;初期状態&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;この、「初期状態」「数値入力状態」「数式作成状態」「計算結果表示状態」がStateパターンでは
オブジェクトのインスタンスで表現されます。
そして、そのクラスには「数字入力」「演算子入力」「'='入力」「'C'入力」の4つのメソッドが定義されます。&lt;/p&gt;

&lt;p&gt;Java&lt;code&gt;
&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;&lt;/font&gt;&lt;font color="#7f9fbf"&gt;@param&amp;nbsp;&lt;/font&gt;&lt;font color="#7f7f9f"&gt;&amp;lt;R&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;Stateの具象型&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;interface&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;State&amp;lt;R&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;State&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;数値の入力&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;&lt;/font&gt;&lt;font color="#7f9fbf"&gt;@return&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;遷移するState.&amp;nbsp;以下同じ&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;R&amp;nbsp;onInputNumber&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;int&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;num&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;演算子の入力&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;R&amp;nbsp;onInputOperation&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Operation&amp;nbsp;ope&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;'='の入力&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;R&amp;nbsp;onInputEquale&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;'C'の入力&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;R&amp;nbsp;onInputClear&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;C#&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;interface&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;State&amp;lt;R&amp;gt;&amp;nbsp;where&amp;nbsp;R&amp;nbsp;:&amp;nbsp;State&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;///&amp;nbsp;&amp;lt;summary&amp;gt;数値の入力&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;///&amp;nbsp;&amp;lt;returns&amp;gt;遷移するState.&amp;nbsp;以下同じ&amp;lt;/returns&amp;gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;R&amp;nbsp;onInputNumber&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;int&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;num&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;///&amp;nbsp;&amp;lt;summary&amp;gt;演算子の入力&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;R&amp;nbsp;onInputOperation&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Operation&amp;nbsp;ope&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;///&amp;nbsp;&amp;lt;summary&amp;gt;'='の入力&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;R&amp;nbsp;onInputEquale&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;///&amp;nbsp;&amp;lt;summary&amp;gt;'C'の入力&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;R&amp;nbsp;onInputClear&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;より抽象的にすることで再利用性を持たせる&lt;/h4&gt;

&lt;p&gt;通常のStateパターンだと、この時点で具象型を用いるのでジェネリクスの出番はないところですが、
&lt;strong&gt;電卓と同じユーザインターフェースを持つ別のアプリケーションを作れるように&lt;/strong&gt;ジェネリクスで
抽象化しておきます。&lt;/p&gt;

&lt;p&gt;ご覧の通り、各メソッドは処理をした上で次に遷移するべきStateを返すようになっています。
このときに自信の型を返したいので自己言及するジェネリクス(
&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/05/25/139308.aspx"&gt;Java版&lt;/a&gt;、
&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/05/26/139486.aspx"&gt;C#版&lt;/a&gt;)
で取り上げた手法を用います。&lt;/p&gt;

&lt;p&gt;これらの実装を作る際にはジェネリクス(サンプルソースのR)を具象化するわけですが、この型は
電卓用であれば電卓用、同一UIを用いた別の何かであればそれ用に独自に拡張します。
&lt;strong&gt;電卓用のStateと別の何かのStateは混同して利用されることはありません&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;つまり、このUIを共通に提供するような再利用性の高いフレームワークを設計する場合でないと、
このようなStateパターンの多様な拡張性を持たせると言う設計は活きてこないのです。&lt;/p&gt;

&lt;p&gt;逆に、このようなジェネリクスを活用することで、今まで再利用が不可能だと思っていたパーツを
再利用可能な形でライブラリとすることができます。&lt;/p&gt;

&lt;h4&gt;補足&lt;/h4&gt;

&lt;p&gt;Javaの場合はさらに
&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/05/20/138700.aspx"&gt;Strategyのインスタンスをenumで扱う&lt;/a&gt;
で取り上げたように、Stateのインスタンスをenum化することができます。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/141783.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>ジェネリクスを最大限活用するための設計技法 Strategyパターン編</title><link>http://blogs.wankuma.com/nagise/archive/2008/05/30/140375.aspx</link><pubDate>Fri, 30 May 2008 17:59:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/05/30/140375.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/140375.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/05/30/140375.aspx#Feedback</comments><slash:comments>33</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/140375.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/140375.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/05/28/139846.aspx"&gt;前回&lt;/a&gt;は振りだけでしたが、
今回からデザインパターンとの絡ませ方を紹介してきます。&lt;/p&gt;

&lt;h4&gt;Strategyパターンの実例&lt;/h4&gt;

&lt;p&gt;Strategyパターンの実例として
&lt;a href="http://java.sun.com/javase/ja/6/docs/ja/api/java/util/Comparator.html"&gt;java.lang.Comparator&lt;/a&gt;
および
&lt;a href="http://msdn.microsoft.com/ja-jp/library/8ehhxeaf.aspx"&gt;System.Collections.Generic.IComparer&lt;/a&gt;
によるソートを取り上げます。
&lt;/p&gt;

&lt;p&gt;Strategyパターンによって切り替わるのは、ソートのアルゴリズムではなく、二つのオブジェクトの比較方法です。
ここではUserというオブジェクトを想定してみます。&lt;/p&gt;

&lt;p&gt;Java&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;User&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;String&amp;nbsp;name;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;int&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;age;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;このUserのListがあるとして、これを名前(name)順にソートするのか、あるいは年齢(age)順に
ソートするのかといったことをStrategyパターンで切り替えるわけです。&lt;/p&gt;

&lt;p&gt;そのためのStrategyのインターフェースが先に挙げた
&lt;a href="http://java.sun.com/javase/ja/6/docs/ja/api/java/util/Comparator.html"&gt;java.lang.Comparator&lt;/a&gt;
および
&lt;a href="http://msdn.microsoft.com/ja-jp/library/8ehhxeaf.aspx"&gt;System.Collections.Generic.IComparer&lt;/a&gt;
となるわけです。&lt;/p&gt;

&lt;p&gt;これらの実装クラスをStrategyとしてソートのメソッドに渡すことで、ソート処理の動きを切り替えることが出来ているわけです。&lt;/p&gt;
&lt;p&gt;Java Strategyの実装&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;UserNameComparator&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;implements&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Comparator&amp;lt;&lt;strong&gt;User&lt;/strong&gt;&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;int&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;compare&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;&lt;strong&gt;User&amp;nbsp;user1,&amp;nbsp;User&amp;nbsp;user2&lt;/strong&gt;&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;user1.name.compareTo&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;user2.name&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Java ソート処理の呼び出し&lt;code&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;List&amp;lt;User&amp;gt;&amp;nbsp;list&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;ArrayList&amp;lt;User&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;list.add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;User&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;ABC&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;,&amp;nbsp;&lt;/font&gt;&lt;font color="#990000"&gt;10&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;list.add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;User&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;BCD&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;,&amp;nbsp;&lt;/font&gt;&lt;font color="#990000"&gt;12&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;list.add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;User&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;CDE&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;,&amp;nbsp;&lt;/font&gt;&lt;font color="#990000"&gt;8&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Collections.sort&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;list,&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;strong&gt;UserNameComparator&lt;/strong&gt;&lt;/font&gt;&lt;font color="#000000"&gt;())&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;C# Strategyの実装&lt;code&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;UserNameComparer&amp;nbsp;:&amp;nbsp;IComparer&amp;lt;&lt;strong&gt;User&lt;/strong&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;int&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Compare&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;&lt;strong&gt;User&amp;nbsp;user1,&amp;nbsp;User&amp;nbsp;user2&lt;/strong&gt;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;user1.name.CompareTo&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;user2&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;C# ソート処理の呼び出し&lt;code&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;List&amp;lt;User&amp;gt;&amp;nbsp;list&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;List&amp;lt;User&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;list.add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;User&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;ABC&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;,&amp;nbsp;&lt;/font&gt;&lt;font color="#990000"&gt;10&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;list.add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;User&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;BCD&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;,&amp;nbsp;&lt;/font&gt;&lt;font color="#990000"&gt;12&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;list.add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;User&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;CDE&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;,&amp;nbsp;&lt;/font&gt;&lt;font color="#990000"&gt;8&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;list.Sort&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;strong&gt;UserNameComparer&lt;/strong&gt;&lt;/font&gt;&lt;font color="#000000"&gt;())&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;ジェネリクスによる具象化&lt;/h4&gt;

&lt;p&gt;さて、ここでジェネリクスによる具象化がどこで行われるかを見てみましょう。&lt;/p&gt;

&lt;p&gt;まずはソート処理を呼び出す部分。こちらではListに入るオブジェクト型を明示しています。
ここのソースコード状ではジェネリクス型パラメータは具象化されているわけです。&lt;/p&gt;

&lt;p&gt;そして呼び出されたソート処理の中身、つまるところクラスライブラリ内では当然ながら
StrategyであるComparatorやIComparerのジェネリクス型は具象化されない状態で処理されます。
ですから、ソートのアルゴリズム中ではListのオブジェクトが何型かを意識してはいけません。
動的にinstanceofとかで調べることはできますが、覗き見はしてはダメ。&lt;/p&gt;

&lt;p&gt;そして、実際のStrategyの具象型部分。ここでは比較を行うオブジェクトは具体化されています。
型が具体化されているのでキャストなどは不要で、Listに格納される型に合わせた処理をそのまま記述できます。&lt;/p&gt;

&lt;h4&gt;キセルのような中抜きの抽象化&lt;/h4&gt;

&lt;p&gt;ジェネリクスがない場合、Strategyの実装クラスでキャストしなくてはなりません。
事実、ジェネリクス搭載前のJavaではそのようにコードを書かざるを得ませんでした。&lt;/p&gt;

&lt;p&gt;ソートのアルゴリズムを抽象化したら、比較のアルゴリズムの引数まで抽象型(Object型)に
なってしまっていたのです。これをジェネリクスによって具象化することができるようになりました。&lt;/p&gt;

&lt;p&gt;中間のソートのアルゴリズム中では型は抽象的に、呼び出し部分およびStrategyの実装部分では具体的に
というわがままな抽象化がジェネリクスによって可能となったのです。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/140375.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>