the difference between How and What

いつもの読書会で扱っている「リファクタリング」で、こんな文がでてきた。

メソッド名は、どのように処理をするかではなく、なにを行うかを書く

これは、私にはすごく曖昧な言い方に思える。

じつは要求定義の本を読めばこのようなことがよく書いてある。つまり、実現手段よりも、顧客が本当は何をしたいのか?を書くべきだと。つまり、実現手段にこだわってしまうと、要求を狭めてしまい、本来の要求が得られないのでは?と考えるからだ。
しかし、「成功する要求仕様、失敗する要求仕様」(アラン・M・デービス)の具体的な例はこの問題の難しさを指摘している。

私たちがアナリストのグループで、あるホテルのマネジャーが協力を求めてきたとしよう。そこで、何を求めているかと尋ねると、マネジャーは「電話システムがほしい」と答える。(略)しかし、なぜそのような電話システムがほしいのか?と聞いたら、こう答えるだろう。「うーん、実際にほしいのはすべての宿泊客のための通信手段なんだ。電話システム自体がほしいわけじゃない」。(略)さらに、「どうして通信手段がほしいのか?」と尋ねるとこう答えるだろう。「宿泊客を満足させたいからだ」。(略)「どうして宿泊客を満足させたいのか?」と質問すれば、「宿泊客にまた利用してほしいから」(略)すでにおわかりの通り、新たに「なぜ」と聞くたびに、その前の「なぜ」に対する答えが「何」になり、要求のように思えていたものが、実は要求ではなくて「どうやって」に思えてくる。

何を行うかとどのように処理するかは実は表裏一体なのではないだろうか?
実現手段がとても大切なときは、やはりそれは場合によって書くべきだと思う。というのが私の主張だった。

しかし、違う意見もあった。
つまり、どのように処理するというのは具体的な内容であり、何を行うかというのはもっと抽象的な内容であるということだ。この意見に従うと、「標準出力に明細を出力する」よりは、「明細を出力する」のほうが、あるいは、さらにいえば「出力する」のほうが、メソッド名として優れているとなる。より具体性がなくなっていくからだ。メソッド名にどのような手順で処理をするかといった冗長な内容を記述するのではなく、できる限り必要な部分を抽出して、少なく記述することを言っているのだと思う。
また、どのようにというのは方法であるが、何を行うかというのは出力を重視しているという考えもあると思う。WhatがOutputだというのは少し強引かもしれないけれど。

メソッドは名前なのだから、すでにある程度の抽象化は行われているはずである。メソッド名に延々と処理の仕様を記述できるわけがないからだ。ただ、抽象化が行われれば行われるほどいいということではなくて、メソッドが正しく識別できる限りにおいて、つまり、他のメソッドと区別がつき、かつそこから導き出される具体的な内容が命名者と使用者で大きく外れることなく共有できるものであれば、問題はないといえるかもしれない。*1
だから、私は、手段がメソッド名になることはある。と思う。つまり、その手段がまさに問題の中心になっているときに、それを抽象化してはならないからだ。

リファクタリング―プログラムの体質改善テクニック (Object Technology Series)

リファクタリング―プログラムの体質改善テクニック (Object Technology Series)

  • 作者: マーチンファウラー,Martin Fowler,児玉公信,平澤章,友野晶夫,梅沢真史
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/05
  • メディア: 単行本
  • 購入: 94人 クリック: 3,091回
  • この商品を含むブログ (312件) を見る

成功する要求仕様 失敗する要求仕様

成功する要求仕様 失敗する要求仕様

*1:そうなると、ある一定のルールに従った省略語などは歓迎されることになるだろう。たとえば、CheckをCHKとか、DetailをDTLとか、CodeをCDとか。