publicフィールドのすすめ?

Javaにおいてはフィールドにアクセスする際に原則として
getter/setterのアクセッサを用意する習慣があります。


カプセル化や拡張性のことを考えるとこれは正しいと思うし
自分も普通はそういう風にコーディングしています。


でも、特定の状況下においてはpublicなフィールドを用意して直接値を取得、代入するのも
アリかなぁと最近は考えています。
特定の状況というのは、例えばSQLで取得した検索結果をフレームワークによって
指定したクラスへ自動マッピングするようなケースです。


マッピングされる側のEntityクラスにはテーブル項目に対応した各フィールドを
用意することが一般的ですが、これらのクラスにはアクセッサをご丁寧に
書く必要が特にないように思います。
フレームワーク側からすれば、リフレクションで命名規則に一致したフィールド、
またはsetterメソッドに値をセットするだけですし。


もちろん、アクセッサ内でデータ加工を行いたいケースもあると思いますが、
その場合は通常どおりprivateフィールドにしてアクセッサを用意すれば良いだけです。
そのまま利用できる値はpublicで、加工が必要な値はアクセッサで、という風に
分ける必要はありますが、逆に開発者がデータ構造を意識することでバグが
少なくなるメリットもあるかもしれません。
(publicでアクセスできない=アクセッサ内で加工している  と気づける)


publicフィールドはSeasar2を参考にさせてもらいましたが実際に使ってみた感想としては、

  1. ソースコードが見やすい
  2. Eclipseでのコード補完が直感的(いちいちgetXxx〜のように探す必要がない)

といったメリットが大きかったですね。


まあ、上記のメリットに魅力を感じないのであれば普通にアクセッサを
書いてくださいというお話です(^^;

WindowsPowerShell をバッチ実行したい

PowerShellのコンソールを経由せずに作成したスクリプトファイル(.ps1)を
直接実行する場合、ファイルの関連付けでスクリプトファイル(ps1)を
powershell.exe に関連付けていれば、ダブルクリックやファイル名実行で
起動可能だけど、そうでない場合はどうやるんだろう?
(例えば拡張子.ps1をテキストエディタに関連付けているなど)


って思ってたんですが、普通にスクリプトファイルを実行出来るんですね。(あたりまえですが・・・)

powershell C:\temp\test.ps1

さらに、次のようにするとMS-DOSからPowerShellのコマンドを直接実行可能です。

powershell "& { 実行したいコマンド または スクリプトファイルのパス } "

これでバッチ処理もガシガシ使っていけそうです。

WindowsPowerShell を入れてみた

なんとなく敬遠していたのですが、使ってみたら超便利〜!

UNIX/Linuxのシェルが使える人は活用しない手はないはずです。
C#の知識もあれば尚良し)
例えば、WindowsPowerShellでファイルの内容を表示するには

Get-Content C:\temp\test.txt

のように記述しますが、UNIX系シェルとの互換性を意識して

cat C:/temp/test.txt

のようにも記述でき、構文やエイリアスなどが工夫されています。

その他にもパイプ処理も使用可能となっていて、

ls | ? { $_.Length -le 100 }

のようにすると、ls で取得されたファイルオブジェクト一覧を次のコマンドに渡して
Lengthプロパティ(長さ)が100バイト以下のものを表示します。*1

UNIX系シェルの便利さには届かないものの、Cygwinを入れてないなら十分使えるはずです。
あと、C#のオブジェクトをシェルから利用できるのがメリットでしょうか。
これが早くWindowsの標準インストールになってくれれば開発が楽になっていいのですが・・・

*1:この例だとディレクトリも表示されてしまいますけど。

JSONICが良さげ

こういう軽い(お手軽な)ライブラリが最近は好きですね。

ViewをJavaScriptで構築するケースが増えてきたので、画面遷移がないアプリであれば、

  JSPJSONIC + 軽めのO/Rマッパ

みたいな構成でさくっと作れるんじゃないだろうか・・・。

Safari3.1 のパフォーマンス

Safari 3.1 が公開されたということで、インストールしてみました。
世界最速というだけあって、Webページの表示が速く快適です。
見た目も良いし、ついつい乗り換えたくなってしまいます。


そこで気になるのがJavaScriptやDOM操作のパフォーマンス。
JavaScriptについては、Firefox 2の最大4.5倍、Internet Explorer 7の最大7倍
というのは本当でしょうか?
適当なコードで試してみました。

<html>
    <head>
        <script>
            var count = 5000;
            /* CASE1 : 大量のspanタグを描画 */
            window.onload = function() {
                var start = new Date().getTime();
                // spanタグ一括埋め込み
                var html = '';
                for (var i = 0; i < count; i++) {
                    html += '<span>' + i + '</span><br/>';
                }
                document.getElementById('data').innerHTML = html;
                // 実行時間表示
                alert(new Date().getTime() - start + ' msec');
            }

            /* CASE2 : 大量のoptionタグ生成 */
            function setupOptions() {
                var start = new Date().getTime();
                // selectタグにオプションを代入
                var element = document.getElementById('target');
                for (var i = 0; i < count; i++) {
                    element.options[i] = new Option(i,i);
                }
                // 実行時間表示
                alert(new Date().getTime() - start + ' msec');
            }

            /* CASE3 : optionタグ全削除 */
            function clearOptions() {
                var start = new Date().getTime();
                // 全削除
                document.getElementById('target').options.length = 0;
                // 実行時間表示
                alert(new Date().getTime() - start + ' msec');
            }
        </script>
    </head>
    <body>
        <select id="target"></select>
        <br/><br/>
        <input type="button" value="セット" onclick="setupOptions()"/>
        <input type="button" value="クリア" onclick="clearOptions()"/>
        <br/>
        <div id="data"></div>
    </body>
</html>

コードや測定方法に問題があるかもしれませんが、以下のような結果になりました。
(CPU:Core2Duo 2GHz, メモリ:2GB のマシンで検証、IE7が手元になかったのでIE6を使用)

  • CASE1. spanタグ描画
件数    IE6     Firefox2   Safari3.1 
 1000件   15〜  30 msec   15〜  30 msec   0〜 15 msec
 5000件  450〜 600 msec  100〜 300 msec  30〜 50 msec
10000件 1800〜2000 msec  200〜 250 msec  60〜 80 msec
30000件 25秒 1000〜1250 msec 180〜230 msec

この結果だけ見れば、描画速度は他のブラウザと比較しても圧倒的に速いですね。

  • CASE2. optionタグ追加
件数    IE6     Firefox2   Safari3.1 
 1000件 550 msec   60〜  80 msec   15〜  30 msec
 5000件 12秒  300〜 400 msec  330〜 350 msec
10000件 45秒  700〜 900 msec 1100〜1250 msec
30000件 測定不能 2300〜2400 msec 11〜12秒
  • CASE3. optionタグ削除
件数    IE6     Firefox2   Safari3.1 
 1000件 450 msec   15〜  30 msec   0〜  15 msec
 5000件 10秒  250〜 300 msec 230〜 250 msec
10000件 40秒  870〜 930 msec 900〜1000 msec
30000件 測定不能 20〜 21秒 9〜10秒

optionタグの追加削除は、5000件ぐらいまではFirefox2よりも高速ですが、
件数が多くなってくるとFirefox2の追加の速さが目立ちます。
(コードの書き方にも依存すると思いますが)


Firefox3、IE7,8 などの最新ブラウザとは比較していないものの
パフォーマンスは現行ブラウザよりも十分優れていますね。
まあ、検証してて一番気になったのはIE6の遅さなんですけども・・・。