wildcatsの日記

赤羽在住でIT関係の会社の社長やってます。

僕がマジックナンバーが嫌いな理由

家に帰ったらエントリを書くつもりが、息子を寝かしつけると同時に自分も寝てしまっていたようです(^_^;
今はAM4:00です。変な時間に起きちゃったな。

自分がマジックナンバが嫌いな理由を書いておきます。
理由は簡単で
・コードを読んでもマジックナンバの意味が理解できない。
・1つの論理定数を変更する為に複数のコードを修正しなくてはならない。
ということです。

例えば銀行から初めてお金を借りるときの限度額が300万円としましょう。
融資希望額と限度額を比較するようなプログラムを書いたときに
マジックナンバを使ったケースでは


if (amountWishingLoan > 300) {
throw new ExcessAmountLoanExcepion();
}
amountWishingLoanは融資希望額でExcessAmountLoanExcepionは融資額超過例外だとしてください。
この300の意味を始めてこのコードを読んだ人が理解しづらいと思います。
理解してもらいやすくする為にはこのマジックナンバにコメントを書くことでしょうか?

// 初期融資超過額を超えた場合には融資額超過例外をthrowする。
if (amountWishingLoan > 300) {
throw new ExcessAmountLoanExcepion();
}
でもコメントを書くくらいだったら初めからprivateの定数にしておいたほうが一目で理解できます。

private static final int AMOUNT_INITIAL_LOAN_LIMIT = 300;

if (amountWishingLoan > AMOUNT_INITIAL_LOAN_LIMIT) {
throw new ExcessAmountLoanExcepion();
}

もちろん今日は定数であっても明日には変化するかもしれませんのでその場合には以下のコードを自分は書きます。

private static final int AMOUNT_INITIAL_LOAN_LIMIT = 300;

protected int getAmountInitialLoanLimit() {
return this.AMOUNT_INITIAL_LOAN_LIMIT;
}

if (amountWishingLoan > getAmountInitialLoanLimit()) {
throw new ExcessAmountLoanExcepion();
}

で。。このif文の条件があちこちに出てくるならこんな感じですかね。。。


private static final int AMOUNT_INITIAL_LOAN_LIMIT = 300;

protected int getAmountInitialLoanLimit() {
return this.AMOUNT_INITIAL_LOAN_LIMIT;
}

protected boolean isInitialLoanLimit(final int aAmountWishingLoan) {
return aAmountWishingLoan > getAmountInitialLoanLimit();
}

if (isInitialLoanLimit(amountWishingLoan)) {
throw new ExcessAmountLoanExcepion();
}

また一つの論理定数の変更の件は1クラス内の複数の箇所で300というマジックナンバを用いている場合に
300の値に修正が入った際に複数の箇所を変更しなくてはならず変更漏れが発生しやすいということです。
またEclipseなどのIDEを用いればprivateな定数を定義しておくことでコードを書いている段階での入力ミスを抑制できる利点があると思います。

ちなみにpublicな定数が嫌いだからと言って全てprivateな定数にするのかと言われると実はそうでもなく、プリミティヴ型以外はTypeSafeEnumにする場合も多いです。使い分けは今回のフィードバックがあり次第かな?

ただ元ネタのSaisseさんの日記を読むとマジックナンバをアクセサで隠蔽するということを書かれているので
上記の話はあんまり意味無いかなぁ〓?(^_^;

議事録


このごろ仕事で議事録係になっているのですが、確かに議事録を
送って、レスポンスを反映させてまた送って・・・という作業はとっても
うんざりします。

また、大規模になるとよくあるのが、下っ端に議事録を書かせて、
それをプロジェクトマネージャがチェックし、修正依頼をかけて、
O.Kになったら顧客に送って・・・ってな具合にワンクッションも
ツークッションも入ったりして。
なんだかとても非生産的だなと思います。

議事録を作ってリーダーに送ってチェックしてもらってからOKをもらい
次には参加者に送付してフィードバック期限を設けて
期限が過ぎたら公開ってタスクは非生産的なタスクですよね。
同意します。

また、後から思い返して議事録を起こすと、
「その時は結論が出た気がしたけどよく考えたら
 うやむやなまま終わったなぁ」
というような事柄があったりして、結局その内容については
触れなかったり玉虫色の文面にしたりしてしまうのですが、
そのような事もその場で解消できると思います。
大人数で議論しているときに多いのですが、目的を明確にしたとしても議論がその人の思いを語っているのか、それとも決定事項なのかはいつも判断に迷うことが多いです。
よく議事録を書くときに決定事項と質疑応答をまとめてから書けと言われますが
そういう会議をする場合には議論がどの方向で落ち着いたかを
会議の主催者が発言者に確認をせずに議事録作成者に任せる
風潮って何とかなら無いものでしょうか。。。。

川崎*付近*在住技術者OFF 2ndStage 〓えがぴ〓さんいらっしゃいOFF

そういや前のblogで「今月にやりますか?って話」のその後をすっかり忘れてました。すみません。ということで来月の第1週か第2週の金曜日くらいでど〓でしょうか?参加予定は僕とid:nasobemeさんとid:tpircsさんとえがぴ〓さんでOKですかね?

ぐはっ!(吐血)

9/26に「友人」から飲みのお誘いメールがあった模様。うう。。。今気がついたんですけどヽ(;´Д`)ノ
言い訳になりますが私のhotmailのメールボックスには現在、未読メールが9455通ある状態でして.......
そろそろ整理しろ > 自分