読書会(リファクタリング - プログラミングの体質改善テクニック)第6回議事録
[ 戻る ]
2003年 4月12日 リファクタリングを読む会 第6回
議事録 第10章 P308 〜 第12章 P369
出席者 高橋(智) 根本 山本 村山 金井 中村 新井 村上 石黒
読み手 村山 中村
書記 高橋(智)
■ はじめに
朝10時15分の時点で集合した方が僅か3人という危機に陥りました。
最終的には9人での開催となりましたが、少し不安になりました。
皆さんいろいろとお忙しいのでしょう。
■第10章 - メソッド呼び出しの単純化
◆ダウンキャストのカプセル化
P308
JDK1.5ではテンプレート機能が追加される
-->Sun の Early Access版のコンパイラが公開されている
http://developer.java.sun.com/developer/earlyAccess/adding_generics/
-->Template機能と使ってコンパイルして生成された.classファイルを、JAD等の
逆コンパイラで.javaに戻すと、どのような仕組みになっているのか確認できる
テンプレート機能を持たない言語は真のオブジェクト指向言語ではないという意見
もある
-->条件を満たしているのは Eiffel のみだ
-->「メモリ管理機構もオブジェクト指向言語として必要な条件だ」という意見
もあるらしい
-->Delphi, C# にはテンプレート機能が無い
-->C#の次の仕様ではサポートされるらしい
P309
ページ下部の「ダウンキャストを避け」るソースコードの例の意味が良く分からない
-->突然現れる class Site... の意味って??
◆例外によるエラーコードの置き換え
P310
元のサンプルコードのように、エラーコードを返すのは、よく見かけるコードである
P311
「チェックされる例外」か「チェックされざるべき例外」かの判断基準は?
-->「Javaの格言」「Effective Java」「Design by Contract」の本でも解説され
ている
-->人の生命に関係するプログラムかどうかも影響するのでは?
-->ランタイム例外で飛行機が落ちても良いのか?
throwsキーワードで、コンパイル時に、catch節を強制できる言語はあるのか?
-->Javaだけ
-->C++,Delphi,C#もそのような機能は持っていない
-->C++では、メソッドに throwsキーワード を書ける!!
P312
「この場合、リターンコードをチェックすることがあってはいけません。」の意味が
良く分からない
-->呼び出し側が、失敗するかもしれない引数を渡しつつ、リターンコードもチェ
ックしていること自体が間違い、ということ?
P313
new IllegalArgumentException("出金額が多すぎる") というコードを、Assertによる
表明にまで変更しているのは、行き過ぎでは?
Assert.isTrueの引数に渡している「残高が足りている」というcommentはおかしい!!
-->「残高が足りている」では意味が逆になっているのでは?
-->「残高が足りているはず」というのが良いかも
JDK1.4の assert機能 を実際の開発で使っている人はいますか?
-->参加者で挙手によるアンケートを取った結果 7人中 0人
-->誰も使っていない(驚き)
-->JDK1.0.2の頃から用意されていれば使っていたかも
-->リリース用にビルドして出荷するけども assert を残したままにすることは
あり得るのか
-->運用時に assert機能 が効くので、使えるのではないか?
◆条件判定による例外の置き換え
P315
「Aventinusにはうんざりします」の意味は?
-->調べる。宿題
P316
try〜catch を使うとパフォーマンスが悪くなる?
-->try自体はそれほどでもないが、catchにジャンプするととてもパフォーマンス
が悪くなる
-->頻繁に catch に来るようであれば、対策が必要では?
P317
Assert.shouldNeverReachHere("使用可能な資源が無かった") を記述する意味・効果
はあるのか?
-->そもそも、元々、EmptyStackException が発生しても動作しているはず
-->一応のチェックのため
■第11章 - 継承の取り扱い
◆条件判定による例外の置き換え
P319
「スーパークラスの抽出」「インターフェースの抽出」が出来る開発ツールはある
のか?
-->Borland Together はできるようだ
◆フィールドの引き上げ
P321
interface に static定数 を定義して、implementsしたクラスでいきなり使う人が
いるそうです
-->良いことなのか?
interface MyInterface {
static int X;
}
class MyClass implements MyInterface {
void foo() {
...
int i = X;
...
}
}
◆メソッドの引き上げ
P324
void createBill(date Date) は、void createBill(Date date) の間違い
addBill(date, charge) は、addBill(date, chargeAmount) の間違い
◆コンストラクタ本体の引き上げ
P325
「コンストラクタは継承できません。嫌じゃありませんか?」の意味は?
-->Javaでどう書けたら嬉しいのか?
-->具体的にどういうこと? コードの例が欲しい。
-->誰か解説してください
-->以下のようなことか?
class Base {
int _x;
int _y;
public Base(int x, int y) {
_x = x;
_y = y;
}
}
class Derived extends Base {
}
class Test {
public static void main(String[] args) {
Derived obj = new Derived(1, 2);
}
}
◆フィールドの引き下げ
P329
UMLのクラス図で、フィールドとメソッドを分ける横線が一本足りないのではないか?
-->正しい書き方ではない
-->P260のクラス図もおかしい
◆サブクラスの抽出
P330
元のクラスがJobItemではなくLaborItemであったら「スーパークラスの抽出」と言え
るのか?
P334
サブクラスの抽出を実際に使うことはあるのか?
-->なさそう...
P335
「ポリモーフィズムによる条件記述の置き換え(255)」を使う必要・理由はあるのか?
-->サブクラスが作りやすいから
◆インタフェースの抽出
P341
「インタフェース」「 インターフェイス」「インターフェース」のどれか? (笑)
P343
Billable emp の引数名(emp)は、他の名前に変えたほうが良いのでは?
Billable または hasSpecialSkill のどちらかの名称が似つかわしくないのでは?
◆Template Methodの形成
P347
Method Objectパターン とは? --> P135を参照のこと
◆委譲による継承の置き換え
P352
VectorとStatckの話は、JDKのjava.util.Stackクラスも同じ
package java.util;
public class Stack extends Vector {
...
}
JDK1.1のころから、現在のJDK1.4でもなお、StackはVectorを継承している
-->直せなかったのか?
-->Stackの親クラスがVectorであることを期待している過去の資産があるから
P353
Vectorを使うべきでないときがある
-->synchronizedによるオーバーヘッドがある
-->最近のJVMでは無視できるほど少ないらしい
-->比較するBenchmarkは 宿題!!
P354
Vector, ArrayList, LinkedList, 配列 を比較した資料はあるのか?
-->どこかで見た覚えがある
-->Benchmarkは 宿題!!
java.util.Hashtable の t はなぜ小文字なのか?
-->しばしば HashTable と書き間違える
-->Hashtableという英単語は無い!!
■第12章 - 大きなリファクタリング
◆継承の分割
P367
図12.5から図12.6への変更は本当に必要なのか?
-->1行しかないTable(表)で代用する。大は小を兼ねるということ?
◆手続き的な設計からオブジェクトへの変換
P368
手続き的な設計(実装)とは、具体的にはどのようなものか?
-->どなたか、手続き的なソースコードの例を紹介してください。お願いします!!
■ さいごに
打ち上げは近くの鳥料理専門店で、お一人様\2700也。
MultiThreading と java.util.Vector との関係について、大いに議論が
盛り上がりました。それに関連して、SMPマシンやPentium4のHyperThreading
と Java との話も盛り上がりました。何か参考になる解説などあれば教えて
ください。m(_ _)m > 村山さん
[ 戻る ]