44
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

デクリメントおじさん 〜擬人化で表す関数設計〜

Last updated at Posted at 2020-07-06

あるところに数を渡すとひとつ引いた数を返す関数がありました。
関数だとイメージしづらいので擬人化してしまいましょう。
(伝わればいいなぁ)

デクリメントおじさん

「いつでも呼んでください」

擬人化できました。イメージにピッタリです。

呼び出し側も擬人化しちゃいます。

呼び出しJK

**「呼び出しちゃうぞ☆」**

かわいい感じに擬人化できました。自己主張が強そうです。

デクリメントおじさんの関数としてはこんな感じのコードです。
プログラム言語は javascript っぽい感じで書いておきます。

function decrement(number) {
  return number - 1;
}

これで一つ減らした数を返せますね。
おじさんも大喜びです。

でもこれだとまだ不親切なんです。

なにが不親切か

const number = 5
decrement(number)
// => 4

これはもちろんちゃんと返ってくるのですが、

const number = null
decrement(number)
// => 意図しない動作(例外など)

と意図しない結果が返ってきてしまいます。
つまりこんな感じです。

**「呼び出し方、考えてくれないかな!?」** おじさんはむっちゃ怒ってます。意図しないものを渡されたので、当然怒ります。

JKは泣きます。

「ごめんなさい。数字しか渡しちゃいけないならそう教えて欲しかった・・・ご飯、味しない・・・」

JKは、おじさんを呼び出す時に大変気を遣って呼び出す必要が出てきます。

これはプログラム的な言葉でいうと、
呼び出し側に大きな責任が存在している状態 ということになります。

こういう関数が増えていくと、事前に調べないといけないことが増え、
修正する際にも時間がかかるようになります。

やさしいおじさんになるには

・事前に渡せるものを明確にしておく
・JKが何を渡してもやんわり注意してあげる

**「どんな呼び出し方してもご安心を!間違えてたら何がおかしいかちゃんと言います」**

これにより、JK はおじさんに引数を渡す時に
気を遣わずに安心感を持って、渡すことができるようになります。

もし間違えたものを渡しても、おじさんの関数が何が悪かったか、
エラーメッセージなどで、ちゃんと教えてくれるため、すぐに気がつけるようになります。

image.png
「間違えることもあるけど、安心感を持って、関数を呼び出せます。梅干しおいしい!」

これでおじさんが増えても大丈夫です。

具体的には、どうすればよかったか

渡して欲しい引数の型を明確にする

数値しか渡せないならば、数値だけ渡せるよう、引数の型を明確にしておく。
JavaScript であれば、TypeScript化して、引数の型を使えるようにするなどの方法があります。

間違えたものを渡した場合でも適切な反応を返す

・渡されたものが無効である場合(警告不要レベル)
 ・return null や、 return number などで返す。
・渡されたものが無効である場合(警告必要レベル)
 ・エラーメッセージを戻り値として返す
・渡されたもので問題が起きる場合
 ・例外を発生させる。 throw new Exception("エラーメッセージ")

まとめ

呼び出される側の関数にて、どんなものが渡されても適切な対応を返すようにする

関数がたくさん増えても、どこで間違えたかわかりやすく、保守性が高くなります。

呼び出し側は気楽にその関数を呼べるようにする

例えば、マイナス値を渡されたら処理しない関数があった場合、
呼び出し側でマイナスになっているかどうかチェックして呼び出さないよりも、
呼び出された関数側で、マイナス値であれば、即時リターンしてあげると呼び出し側は気にすることが少なくなります。

before
if(num > 0){
  // 
  kansu(num);
}
kansu(num) {
  // なにか
}

after
kansu(num);

kansu(num) {
  if(num <= 0){
    // マイナス値のため、処理しない
    return;
  }
  // なにか
}

そのためには if文が増えたり、エラーチェックが増えても問題ありません。

擬人化

関数を擬人化して表すことで、
何を渡しても、いい塩梅で反応を返してくれる気のいいおじさんがイメージできたかと思います。
こういういい塩梅で反応が返ってくる関数、もしくはその上のレイヤーのクラスを作っていくことで、
複雑なシステムも安心感を持って、開発を続けていくことができます。

仕事をする相手にどんなファイルや文書を渡しても、適切な反応を返してくれる方が仕事がしやすいはずです。
それと同じように関数、クラスを設計してあげることが大事です。

44
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?