2010-02-03
The Catcher in the Exception
例外は何の為に存在するのか?
例外はクラスの操作方法を間違えた事をプログラマにお知らせするものです。コンパイルエラーみたいなもんだと思ってます。
例外の使い方
どのように例外を使用すべきか?
この問いに対して、ぼくは以下のようなコーディングルールを設ける事で例外の使用方法を明示する事にしました。
- 非チェック例外を使おう
- チェック例外は使用しないようにしよう
- チェックメソッドを導入しよう
- 出来うる限り例外の発生状況を書き出そう
非チェック例外を使おう
例外はクラスの操作を間違えた時に投げるべきです。
Iteratorを例にします。
Iteratorはnextメソッドで値を取得し、hasNextメソッドで次の値があるかどうかを確認するという使用方法があります。
これ以外の使用方法……例えば、hasNextメソッドで次の値があるかどうかを確認せずにnextメソッドを使う、という方法をとった場合、値が取得できなくなるとnextメソッドはNoSuchElementExceptionをスローします。
nextメソッドがNoSuchElementExceptionをスローするのは、クラスの使用方法を間違ったからです。決して値が取得できなくなった事をお知らせする為にスローされたのではありません。
例外はクラスの使い方を強制するものです。だから基本的に非チェック例外を使用し、クラスの使い方を間違ったら例外によりプログラムが強制的に停止するようにすべきです。
チェック例外は使用しないようにしよう
コンパイルエラーを無視するとプログラムが動かないように、例外が発生するとプログラムが動かないような処置をすべきです。
そうなると、チェック例外というのは邪魔な存在です。例外によってプログラムを停止させる事を前提とした場合、try〜catch構文をわざわざ書くのは面倒です。しかも場合によってはプログラムを停止させずに続行するようなコードを書く場合もあるでしょう。
例外が発生するならプログラムを停止させるなら、チェック例外は使用する必要はないと思います。
チェックメソッドを導入しよう
クラスの内部状態をお知らせするチェックメソッドを作りましょう。
IteratorでいうところのhasNextメソッド、コレクションのisEmptyメソッドなどが該当するでしょう。
例外に頼るコードは、チェックメソッドを使って置き換えましょう。
もちろん、クラスの実装がバレるようなチェックメソッドを作れというわけではありません。クラスを外側から見た時に必要となるチェックメソッドを実装すべきです。
出来うる限り例外の発生状況を書き出そう
例外をコンパイルエラーのように扱うのなら、例外が何故発生したのかをなるべく詳しくプログラマに知らせるべきです。
コンパイルエラーの状態が詳しく表示されないコンパイラが嫌がられるように、例外も発生状況が詳しく書かれていないのは不都合です。
具体的には、例外が発生した時のフィールドの値を例外のインスタンスに格納しておくと良いと思います。
もちろん、これも不用意に内部実装をさらけ出す必要はありません。
2010-01-28
こんぷーた
- スケジュールのないこんぷーたを作ろう
- かっこいいこんぷーたを作ろう
- 出来うる限り小さなこんぷーたを作ろう
- 成果を求めないこんぷーたを作ろう
顧客がいないこんぷーたを作ろう(2010/01/28)
ニホンのコンピュータ系がなんで重労働なのかを考えた時、「お客様第一主義」が思い浮かぶ。
お客様第一主義はこの国の商業の基本みたいなものになってて、どんなに低級なサービスにおいてもその主義を掲げようとする。
これが高級ホテルや高級百貨店なら、お客様第一主義を掲げるのは分かる。高級なものとは、高額である代わりに客が満足行くサービスを提供するから高級なのである。その前提があってこそのお客様第一主義であると私は考える。
しかしこの国では高級とも呼べないような場所でさえお客様第一主義を要求する。
例えば、コンビニ。店員の態度が悪い! と怒鳴ったりクレームを付ける輩がいる。たかが数百円の買い物で、店員を奴隷に出来ると勘違いしている。
ニホンは客の立場だと間違いなく天国といえる。お金がなくてもおもてなしの行き届いたサービスが受けられる。ところが、これが従業員の立場となると話は別だ。とたんに地獄になる。
ニホンジンの気質なのかどうかは知らないが、とにかく小さな小さな事で従業員にクレームを付ける。道理の通らない無理を通そうとするクレームを付ける。
この国のおもてなしの精神というのは善意で行われているはずなのに、今では強制的な義務にまで昇華し、道理やルールをねじ曲げてまで「お客さまは神さまだ!」と言わなければならない。
例えば、ソフトウェアの開発を依頼された場合、開発会社はソフトウェア開発の後に「テスト」を行なう。テストとはソフトウェアが仕様通りに動くかどうかをチェックする工程である。
テストは小さな単位のプログラムの場合、コンピュータを使って自動化できる(もちろん、自動化を行なう為のテストコードは自分で書かなければならない)。小さな単位と言っても、危惧すべき事は多い。
入力したデータが正しいものか、不正なものか。入力データが複数ある場合、いくつかのデータが入力されてなかったらどうなるか。入力データが不正だった場合のエラーの返し方はどうするか。入力データを元に出力するデータは、正しいものか。そもそもアルゴリズムが正しいか。
これ以外にも、もっと詳細を考えるとチェックしなければならない項目は増える。データの入力が一つ増えるだけで、この項目が倍になる可能性がある。
これはあくまで単独ではソフトウェアとも呼べないような小さなプログラムの話だ。
小さなプログラムが集まってソフトウェアとなった時、またテストを行なう。小さなプログラムと小さなプログラムを合体ささせた時、場合によってはバグが生まれる可能性があるからだ。今度のテストは完全なる力技だ。
ぼくが勤怠を入力するソフトウェアをテストした時の話だが、AM08:00〜AM08:30から入力を始め、AM05:00まで延々と手で入力を行なうのだ。そしてそれが終わったら、AM08:30からのテストを延々と入力し続ける。これを一日中やり続けるのだ。結果、三日間はこの作業を続けさせられた。これが納期のない、比較的緩やかな時間を設けられたから良かったものの、短納期でこの作業を行おうとした場合、ソフトウェア開発会社の従業員は、寝ずの作業を強いられる事になる。そして酒の席で自分の体験談をさも誇りであるかのように自慢するのだ。
何が問題か。
ソフトウェア開発を行なう会社は、お客様のクレームを恐れているから力技でもいいからテストを行おうとするのである。
お客様はバグのない完璧なソフトウェアを求めようとする。しかしそれは夢である。テストで発見できなかったバグは、バグとしてそのままお客様に納品されるのだ。
そして客はバグが発生した場合、それを「クレーム」としてソフトウェア開発会社に提出する。そして短納期でバグを発見し、抹消せよと命じるのだ。そしてまた、会社の窓から灯が消える事がなくなる。
お客様が無理を言う場合、その分何らかの見返り(それはお金だったり、次の開発に関する契約だったりする)を儲けるソフトウェア開発会社もある。ただ、次の開発の契約を見返りにしようとする会社をぼくは好かない。結局次の開発も契約を見返りに社員に無理をさせる可能性が高いからだ。お客様は前の開発で行った無理を普通であると勘違いして、次の開発スケジュールも無理を前提として作成している可能性は、とても高い。
そうしない限り、従業員に常に無理を強いる仕組みが出来てしまう。マネジメントが上手いヒトが権限を持っている会社なら無理を回避する事は十分に可能だが、そうでない場合、従業員は地獄を見る。これはきっとニホンジンである限り発生しつづけるだろうと、ぼくは思っている。
2010-01-19
言いたい事を言いまくるおれ
Twitter | |
思う事を二つも飲み込んでしまった。飲み込んでもお腹を壊さないとはいえ、胃の中に入って分解されて欲しいとも思う。
posted at 04:04:37
何がゆるい繋がりだ……全然ゆるくない。ばかみたいだ……
posted at 04:05:24
オモウコトを飲み込むぼくが、ばかか……
posted at 04:06:06
願わくばー。目が覚めたら一つ利口なニンゲンになれてますよーに。みんなおやすみ、今日は個別にリプライを投げないよ
posted at 04:07:09
そうだ、寝る前にはみがきしよう。
posted at 04:07:28
眠いと欝っぽいのさーのさー
posted at 04:11:35
この流速なら言える。ぼくの人生は25までと決めていると
posted at 04:12:06
思う事の一個は胃の中で消化されたようである。
posted at 04:13:31
むー? ぼくは二十歳になる前から、ぼくの人生は25の2/4までだと思ってたぞー
posted at 04:14:39
関東にいたときは、友達とか、彼女とか、欲しかった。だからオフ会とか色々参加してみた。でもさー。結局親しかったヒト達とは縁が薄くなるんだよ。ぼくがわがまま言うから。
posted at 04:21:04
それでも親しくしてくれる@zyamuirohiiroはいいやつさ……
posted at 04:21:51
専門の頃から死のうとは思ってた。思うだけだったけど。なんで死にたかったって言うと、めちゃくちゃ楽しかったから。一番楽しい時に死ねれば、幸せだと思う
posted at 04:23:24
……あんまり理解されないんだよなぁ。こういう死生観。
posted at 04:24:34
こーいう死生観を定期的に思い出して行動してるのが現状。専門の頃からそう。その前は……あぁ、いやだね、思い出したくもない
posted at 04:29:11
そうね、生きてればいいひとに会えるかも。そういう考えでオフ会に参加してた。Twitterに来た直後に中が拒絶されたヒト達に凹んだりしても、オフ会には参加した。東京には沢山ヒトがいるから、何人かは関係を崩さずに仲良くできるだろうと思ってた
posted at 04:32:26
思ってたけど、二度もネットで知り合ったヒト達に拒絶されたから、もう、オフ会に行くのも怖くなってきた。
posted at 04:33:58
電気ショックを与えられるお犬さんと同じですよ、えぇ
posted at 04:34:36
最後にオフ会(というか卒論のインタビュー)を受けた時なんか、震えが止まらなかったw 寒いからとかじゃない、あれは、恐怖とかそういう類のもの
posted at 04:35:49
出来うるなら、家族にはぼくの事を忘れてもらいたいものです……死ぬわけですから。世間一般的に親不孝って形をとるわけなので、忘れて貰った方がいい。うん
posted at 04:37:51
拒絶……具体的に言うと、急にマイミクを切られた、とかかな。信用してたヒトだったから、辛かった。
posted at 04:39:09
あの時Twitterにいなかったら確実に死んでたわね……ぼくがネット始めた頃からの友達にマイミク切られたからね
posted at 04:40:14
無条件にヒトを信用するし、無口だから思う事言えないし、でも何か喋らないと仲良くなれないし、でもヒトと会うとよっぽどでない限り喋れないし
posted at 04:43:29
あ……
posted at 04:46:08
また思う事をずらずら書いちゃった
posted at 04:47:06
うどんおもいだした。Twitterに思う事を書いてはいけない。
posted at 04:48:34
感情と論理は違うっていうのを、この前学んだ。論理ではこうだ! と分かってる事を、感情に任せて行動しちゃうから、ぼくはだめらしい
posted at 04:51:17
だから、感情なんていらない。論理が第一。という傾向に最近ある。なにそれ……
posted at 04:52:09
もうさ、何が何だか分からない。人付き合いだとかコミュニケーションだとかもう何をしていいのか分からなくなった。考えればそれなりの解決方法を思いつくけど、それを人前で実行できるかと言えばほぼ無理。人前だと、何も考えられなくなるんだよ……
posted at 04:55:55
@godzilla2k9 ごめんなさい、変な事ばかりpostして。おやすみなさい
posted at 04:58:42
終了、うん。おしまいおしまい。
posted at 05:00:26
書いてたらすっきりしてしまった。眠気も半分消えてしまった。うん、明らかに眠気のせいですね、欝は。
posted at 05:02:01
まぁ、こういう日があってもいいよね
posted at 05:02:53
ごめいわくをおかけしました @TL各位
posted at 05:04:25
@s_hiiragi ( ´;ω;)ウッ
posted at 05:10:27
ぼく、そんなに正体不明な類なのか……?w
posted at 05:10:59
お前らの優しさに全ぼくが泣く( ´;ω;)すまねぇな、すまねぇ
posted at 05:16:01
2010-01-13
データをJDOに格納・更新・削除する場合について
Insertは
Model model = new Model();
model.setXxx(...);
...
tx.begin();
pm.makePersistent(model);
tx.commit();
Updateは
tx.begin();
Model model = pm.getObjectById(Model.class, id);
model.setXxx(...);
tx.commit();
Deleteは
tx.begin();
Model model = pm.getObjectById(Model.class, id);
pm.deletePersistent(model);
tx.commit();
で処理するのは、JDOとして標準的なやり方です。
makePersistent()は、newしたモデルをpersistentするときか
detachedなモデルをpersistent状態にするときに使うもので、
それ以外で使うものではありません。
getObjectById()で取得したモデルはpersistentな状態です。
GAE/JavaのdeletePersistentで生じるエラーへの対処 - Google-App-Engine-Japan | Google グループ
