- - PR -
ソフト開発を成功させる1つの方法の感想
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2001-10-24 14:38
ここでは、行数がすくない、ではなく、「要素」が少ないとさせて下さい。 ソースを見やすくするためにコメントを入れたり、改行を入れたりして、行数が増えるのは、短いプログラムとは必ずしも矛盾しないと思うのですよ。実行ファイルのサイズが変わるわけではないので。 それで本題ですが、単なる行数を減らすことは機械的な作業として行うこともできますが、「要素」を減らすためには、問題の本質を分析し、整理し、把握し、具体的なソースコードに展開する必要があります。問題を分析しないで適当に行き当たりばったりで書いても、(よほど幸運の女神に気に入られない限り)最小になりません。ですから、「短いプログラムであれ」というメッセージの裏側には、「問題の本質を把握して、それを無駄なく表現せよ」というメッセージが隠れていると思うわけです。つまり、「質の改善無くしてプログラムは短くならない」と私は思うわけです。
きっと言う奴が出てきますね。でも、そういう奴の相手を真面目にやってもしょうがないでしょう。そんな奴でも、現場で揉まれていれば、そのうちに分かるようになると思います。経験則っていうのは、そういうものだと思いますので。
他人を説得しやすいだけでなく、すぐ実践できて有意義ですね。 _________________ 川俣晶 [ メッセージ編集済み 編集者: autumn 編集日時 2001-10-24 14:40 ] | ||||||||||||||||||||
|
投稿日時: 2001-10-24 20:19
そういった、勘違い・思い違いが引き起こす場合もあるのですが、ミスタイプによる場合もありますよね。 記述した本人は仕様を間違って把握しているわけではありませんから、その分誤りの発見が遅れます。 もちろん短いプログラムの方が、短い分だけそういった間違いが入る確率が減りまし、発見しやすいので、そういった意味では「短いプログラムを作るのは正しい」と言えると思います。 | ||||||||||||||||||||
|
投稿日時: 2001-10-25 12:57
確かに、紛らわしいミスタイプを見落とすということはありますね。 バグが出にくい手法はあっても、バグを完全に無くする手法は無いと思います。 銀の弾丸は無いと言うことですね。
その通り。同じ機能を持ったプログラムなら、いろいろな意味で短い方が扱いが楽です。 _________________ | ||||||||||||||||||||
|
投稿日時: 2001-10-26 16:42
実は私の議論の展開には致命的な突っ込み所があるのですが、誰も突っ込まないんですね。
しょうがないので、自分で突っ込みます。(マゾ? ) まず、元記事から参照した記事に以下の記述があります。
それに対して、私が掲示板に書いた短さの定義は以下の通りです。
すると、プログラムの短さとは、「要素」の個数が少ないことを意味しますが、以下の2つの記述は、記述された「要素」の個数としては同じになります。
つまり、元記事で短いプログラムの方が読みやすいとして参照した記述そのものが、掲示板に書いた短さの定義を適用すると、短いとは言えなくなってしまうのですよ。 ね? 矛盾してるでしょ? さて、これはどう考えたものでしょうね? _________________ | ||||||||||||||||||||
|
投稿日時: 2001-10-29 16:50
と書いたんですが、誰も自分の意見を書いてくれませんね。ちょっとカナシイ。 基本的には……
ということだと思います。ソースを分かりやすくするために長くなるのは良いのですが、自明のことや、重複することを書いては、かえって読みやすさを損なうわけです。上記の例だと、i++と書いたことで、iに1を足すという機能は十分に曖昧さ無く表現されており、それと同じことを書く意味はまったくありません。 で、以下の場合に即して言うと。
右辺値として出てくるなら、somethingやhogeが値の取得のために呼ばれているのは当たり前です。それに全部get_なんて付けても、当たり前のことを重複説明することにしかなりません。get_やGetが何個も並んで、横スクロールしないと読めなかったりすると、「うるせ〜〜〜」と言いたくなります。 え? 誰が書いたソースを見てそう思ったのかって? 私に決まってるじゃありませんか 自分で書いていても嫌になっちゃいますね _________________ | ||||||||||||||||||||
|
投稿日時: 2001-10-30 00:54
う〜ん、「自明」「当たり前」かどうかが、人によるのでは。 function(i++); と書くのがいいか、i++; function(i); と書くのがいいのか… 演算子の優先順位を明示的に指定する()なんかも同様。 このコンテキストでは「i++」は「iに1を足す」という以上の意味はないのでしょうが、実際はもう少し暗黙の意味もあったりするでしょう。 知っている人にはやるまでもない「常識」なのでしょうが、それをあえて、というのはよくあることではないでしょうか。 右辺値に出てくる obj.getFoo() についても似たようなもんで、Foo が obj 内のメンバなのかそうじゃないのかを、obj の利用者が全く気にしなくてもよいようにしょうというカプセル化の方法のひとつ、ではないでしょうか。 もちろん、「右辺に現れる obj.foo」を「obj に foo という public readable なメンバがあればそれを返し、そうでない場合は public な getFoo() の結果を返す」と解釈するようなコンパイラ、プリコンパイラ、インタプリタ、言語仕様は書けるのでしょうが。 「読みやすさ」なんてものは、読み手の知識によるもんなので。 # ちょっと elisp 書いてて思った。 # 短くてエレガントで効率の良い elisp 式は、えてして読みにくい。 # きっと生粋の elisper にはすかすかと良みやすいに違いない… | ||||||||||||||||||||
|
投稿日時: 2001-10-30 13:10
まず、function(i++); と、i++; function(i);については、必ずしも同等とは言えないので、1つにまとめることは自明とは言い難いと思います。(それに、結果が違うような気がするのは私だけ? ) ()については、順番が紛らわしいケースでは、不要でも付けるのは当然でしょう。もともと「紛らわしい」なら「自明ではない」ので。
うーん、初めてソースを読む人に、暗黙の意味を解れといっても無理ですって。 暗黙の意味があるなら、コメントに「iに1を足す」と書くより、それを書くべきでは?
その通り。機能としてはカプセル化の1方法に過ぎないと思います。 でも、実際にC#を使い込んでみて、明らかにJavaよりソースが短くなり、コーディングやデバッグが楽になったと感じています。情報量を減らさずに文字数が減っていることの効能だと実感してます。まあ、このあたりは、個人的経験に立脚する話なので、当然異論はあるでしょうが。
XPでは、プログラマにとって重要な意図が述べられている、ということを条件に付けていますね。短くてエレガントな表現が、プログラマにとって重要な意図を表現することを省略することで実現するなら、XP的な意味での「シンプル」には外れるかもしれません。 _________________ | ||||||||||||||||||||
|
投稿日時: 2001-11-18 13:13
リファクタリングをやっと読み始めましたが、疑問がふつふつと出てきました。
1) ローカル変数の除去 ローカル変数を除去するためにメソッドを作ることを勧めているが、本当にそれでいいのか? ローカル変数は宣言されたスコープ内だけの存在だが、メソッドはprivateでもクラス内のどこからでも呼べるので、関係する可能性のある範囲がかえって広くなったりしないか? そもそも、メソッド数を最小にすることを求めるXPとの関係は? 2) switch文をポリモーフィズムで置き換える switch文をポリモーフィズムで置き換えることを勧めているが、本当に置き換えるべきか? あるいは置き換えられるのか? ポリモーフィズムで置き換えるメリットは、呼び出し側が処理内容の詳細を知る必要が無く、振る舞いを追加するのが極めて容易になることだと思います。しかし、実際に処理される内容がソースのあちこちに分散するため、何が処理されるかを把握するのは困難になります。振る舞いが追加される可能性が極めて低い場合は、無理にポリモーフィズムにしない方が分かりやすいソースになるような気がしますが、どうなんでしょう? また、XMLのDOMなどは、ノードの種類を値で持つので、ノードの種類ごとに処理を分けたい場合にswitch文で分類するのは定番ですが、これを無理にポリモーフィズムで置き換えると、かえって回りくどく、分かりにくくなるだけのような気がします。つまり、switch文のポリモーフィズムへの置き換えは、関連する箇所が全て自分の手で変更可能の場合は実現できるものの、変更できないインターフェースが値で扱うことを要求している場合は、必ずしも良い選択にならないのではないかと思うわけです。 それに、ポリモーフィズムを使うと場合分けのケースごとにクラスを作るので、あまり本質的でない処理で多用すると、XPの求めるクラス数を最小にするという原則に逆らってしまいそうな気もしますが、どうなんでしょうか? うーん、良く分からない。 この本の内容は、大筋では理解できるのですが、一部の方法で引っかかっています。 _________________ 川俣晶 [ メッセージ編集済み 編集者: autumn 編集日時 2001-11-18 13:13 ] |