publicフィールドのすすめ?
Javaにおいてはフィールドにアクセスする際に原則として
getter/setterのアクセッサを用意する習慣があります。
カプセル化や拡張性のことを考えるとこれは正しいと思うし
自分も普通はそういう風にコーディングしています。
でも、特定の状況下においてはpublicなフィールドを用意して直接値を取得、代入するのも
アリかなぁと最近は考えています。
特定の状況というのは、例えばSQLで取得した検索結果をフレームワークによって
指定したクラスへ自動マッピングするようなケースです。
マッピングされる側のEntityクラスにはテーブル項目に対応した各フィールドを
用意することが一般的ですが、これらのクラスにはアクセッサをご丁寧に
書く必要が特にないように思います。
フレームワーク側からすれば、リフレクションで命名規則に一致したフィールド、
またはsetterメソッドに値をセットするだけですし。
もちろん、アクセッサ内でデータ加工を行いたいケースもあると思いますが、
その場合は通常どおりprivateフィールドにしてアクセッサを用意すれば良いだけです。
そのまま利用できる値はpublicで、加工が必要な値はアクセッサで、という風に
分ける必要はありますが、逆に開発者がデータ構造を意識することでバグが
少なくなるメリットもあるかもしれません。
(publicでアクセスできない=アクセッサ内で加工している と気づける)
publicフィールドはSeasar2を参考にさせてもらいましたが実際に使ってみた感想としては、
といったメリットが大きかったですね。
まあ、上記のメリットに魅力を感じないのであれば普通にアクセッサを
書いてくださいというお話です(^^;
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の標準インストールになってくれれば開発が楽になっていいのですが・・・
JSONICが良さげ
こういう軽い(お手軽な)ライブラリが最近は好きですね。
ViewをJavaScriptで構築するケースが増えてきたので、画面遷移がないアプリであれば、
みたいな構成でさくっと作れるんじゃないだろうか・・・。
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の遅さなんですけども・・・。