俗に「詰め Java 」と謂われる、ある種のゲームがある。基本は以下の通り。
この「詰め Java 」、普通に「ただ動くコード」を書くのの三倍以上の時間ないし手間がかかります。そのかわり、日常的に「詰め Java 」レベルでコードを書いていて、その結果コードがある程度蓄積されてくると、全体の開発効率は三倍なんていうものではなく五倍十倍で効いてくるので、トータルの開発効率としてはかなりの向上が期待できます。
ただこれ、「不必要にハマる」っちゅーか、「煮詰まると長い」っちゅーか、このスタイルに慣れちゃうと、「とりあえず動かしたい」っつー時にはあんまりありがたくないっつーか瞬発力が落ちるっつーか、嬉しくない状況に陥ったりします。
以下はけっこう専門的な話なので、わかんない人は適当にパスしてください。
具体的には、今現在 RDBMS (俗に“データベース”っちゅー奴です)のコネクションを引っ張ってくる部分のコードで煮詰まっちゃってるのだな。複数のデータソースからコネクションを引っ張ってくる場合に、個々のデータソースをどこに持たせるかで激しく悩んでしまうわけです。
Java には「抽象クラス( Abstract Class )」っつーものがあります。具体的には「継承( extend )してからでないと使えない Class 」です。これ、 C 言語でいう「宣言」みたいなものかと思いきや、実は単に「継承してから使ってね」っていうだけの話であって、変数領域だのクラス実体だのがモロに取られてしまいます。
これって、どういう意味か。
そうなんですよ。「“抽象”クラス」っつーくらいだから、 static なメンバ変数の領域は、 extend して宣言したサブクラスごとに取られると思っちゃうじゃないですか。だけど、実際にはスーパークラスである Abstract なクラスの中の領域が共通して使用されるものだから、「こっちのサブクラスで static なメンバ変数を書き換えちゃうと、あっちのサブクラスで参照してる内容まで変わっちゃう」ってな事が起きるのね。
で、「そうじゃなくって、『あるクラスを継承したクラスの中で、各サブクラスごとに static な変数領域が自動的に(=明示的に書かなくても)確保される』みたいな形にできないか」とか考えだすと、「シングルトン実装」だとか「コンクリート・クラスとインタフェースの組合せによる抽象クラスの定義」だとか手法を組合せてあーだこーだと試しながら何日も悩む(そして、その結果として肝心の実装作業がまるっきり進まない)、ということになってしまうわけです。(T_T)
「面白いし勉強にもなるんだけど、必ずしも実戦で役立つとは限らない」っつーところも、「詰め Java 」の“詰め” Java たる所以(ゆえん)かもしれません。
プレイするには、 C 言語の素養が要求される。また、 Java のコンパイラや JVM の中身、 Java 言語の基本機能がどう実装されているかの理解が要求される……というか、「 Java というシステムの中身がどうなっているか」を C 言語っつーかハードウェアとアセンブラっつーか、そういう基本的なレベル(コンピュータの世界でいう「低水準」な世界。一般的な「低レベル」とは意味合いが違う)で理解するための、一種のお遊びである。
具体的には、「狙ったバイナリ・コードを吐かせるための、最も優れた Java のコードを競う」ゲームである。
「優れた」の評価は、「再利用性」によって決まる。すなわち、「直裁・簡潔で理解しやすいため、コピーして再利用しやすい」「改造に対してタフである。つまり、『誤った書換えをおこなおうとすると、すぐエラーないし警告が出る』とか、『ある機能を変更しようと思ったときに、どこを直せばよいかがはっきりしている』」「ライブラリの一部として利用しやすいような、汎用的なインタフェースが備わっている」などの特性を持っているものが、「優れた」コードである。
この「詰め Java 」、普通に「ただ動くコード」を書くのの三倍以上の時間ないし手間がかかります。そのかわり、日常的に「詰め Java 」レベルでコードを書いていて、その結果コードがある程度蓄積されてくると、全体の開発効率は三倍なんていうものではなく五倍十倍で効いてくるので、トータルの開発効率としてはかなりの向上が期待できます。
ただこれ、「不必要にハマる」っちゅーか、「煮詰まると長い」っちゅーか、このスタイルに慣れちゃうと、「とりあえず動かしたい」っつー時にはあんまりありがたくないっつーか瞬発力が落ちるっつーか、嬉しくない状況に陥ったりします。
以下はけっこう専門的な話なので、わかんない人は適当にパスしてください。
具体的には、今現在 RDBMS (俗に“データベース”っちゅー奴です)のコネクションを引っ張ってくる部分のコードで煮詰まっちゃってるのだな。複数のデータソースからコネクションを引っ張ってくる場合に、個々のデータソースをどこに持たせるかで激しく悩んでしまうわけです。
Java には「抽象クラス( Abstract Class )」っつーものがあります。具体的には「継承( extend )してからでないと使えない Class 」です。これ、 C 言語でいう「宣言」みたいなものかと思いきや、実は単に「継承してから使ってね」っていうだけの話であって、変数領域だのクラス実体だのがモロに取られてしまいます。
これって、どういう意味か。
そうなんですよ。「“抽象”クラス」っつーくらいだから、 static なメンバ変数の領域は、 extend して宣言したサブクラスごとに取られると思っちゃうじゃないですか。だけど、実際にはスーパークラスである Abstract なクラスの中の領域が共通して使用されるものだから、「こっちのサブクラスで static なメンバ変数を書き換えちゃうと、あっちのサブクラスで参照してる内容まで変わっちゃう」ってな事が起きるのね。
で、「そうじゃなくって、『あるクラスを継承したクラスの中で、各サブクラスごとに static な変数領域が自動的に(=明示的に書かなくても)確保される』みたいな形にできないか」とか考えだすと、「シングルトン実装」だとか「コンクリート・クラスとインタフェースの組合せによる抽象クラスの定義」だとか手法を組合せてあーだこーだと試しながら何日も悩む(そして、その結果として肝心の実装作業がまるっきり進まない)、ということになってしまうわけです。(T_T)
「面白いし勉強にもなるんだけど、必ずしも実戦で役立つとは限らない」っつーところも、「詰め Java 」の“詰め” Java たる所以(ゆえん)かもしれません。
投稿:KILROY[KILROY]/2007年 04月 19日 08時 55分
/更新:2007年 04月 19日 09時 23分
RE:詰め Java
by 竹形 誠司[takegata]
曜日の文字を整数に変換しようと思って、次のようなコードを書いたのですが、イマイチというか、かなり格好悪い気がするのですが、こいつを詰めるとどうなりますかね。もし暇があればよろしく。
static int resolveWeek(String strWeek){
int intWeek=0;
if(strWeek.equals("日")){
intWeek=1;
}else if(strWeek.equals("月")){
intWeek=2;
}else if(strWeek.equals("火")){
intWeek=3;
}else if(strWeek.equals("水")){
intWeek=4;
}else if(strWeek.equals("木")){
intWeek=5;
}else if(strWeek.equals("金")){
intWeek=6;
}else if(strWeek.equals("土")){
intWeek=7;
}
return intWeek;
}
int intWeek=0;
if(strWeek.equals("日")){
intWeek=1;
}else if(strWeek.equals("月")){
intWeek=2;
}else if(strWeek.equals("火")){
intWeek=3;
}else if(strWeek.equals("水")){
intWeek=4;
}else if(strWeek.equals("木")){
intWeek=5;
}else if(strWeek.equals("金")){
intWeek=6;
}else if(strWeek.equals("土")){
intWeek=7;
}
return intWeek;
}
投稿:竹形 誠司[takegata]/2007年 04月 21日 01時 00分
/更新:2007年 04月 21日 01時 02分
これは仕様とか真面目に考えているとエラいコトになってしまうタイプの問題なので、「詰め Java 」の問題としてはかなり難問の部類だと思います。
手を抜くなら、
正式な回答は後日ということにしとうございます。m(_ _)m
手を抜くなら、
static int resolveWeek( String strWeek ){
final String days = "日月火水木金土";
return days.indexOf(strWeek);
}
といった方向性になる(これだと日曜日が 0 )と思いますが、たとえば「水木」さんとかいう人がいるとfinal String days = "日月火水木金土";
return days.indexOf(strWeek);
}
System.out.println(resolveWeek("水木"));
とかいったことをやりたくなったりするワケなんですな。(^_^;)正式な回答は後日ということにしとうございます。m(_ _)m
投稿:KILROY[KILROY]/2007年 04月 21日 07時 32分
/更新:2007年 04月 21日 07時 32分
おーっ、これは私のコードよりだいぶスマートですね。
使わせていただきます。
使わせていただきます。
投稿:竹形 誠司[takegata]/2007年 04月 21日 07時 35分
/更新:2007年 04月 21日 07時 35分