プログラムを作る時の考え方

プログラミング

プログラムを作る上で「どこでメソッドの定義をするのかがわからない」と言われたことがあります。
僕の結論から言うと、「必要になった段階で使用している」が答えになります。

では、いつ必要になるのか?

答えは規模が大きくなるプログラムでは必要になります。
また、今後大きくなる予想があるのであればある程度の想定で定義してまとめておきます。

構想レベル

例えば料理をするプログラムを作るとします。

下記のようにある程度わかる範囲はコメントで書き出します。

スーパーに行く
肉を買う
玉ねぎを買う
カレールーを買う
ご飯を炊く
玉ねぎを切る
玉ねぎを炒める
肉を炒める
水を入れる
ルーを入れる
しばらく煮込む
皿にご飯を盛り付ける
カレーをご飯の上にかける
カレーを食べる
皿や鍋を洗う

僕の場合はこんな形になりました。

作業分類

# 食材の購入
スーパーに行く
肉を買う
玉ねぎを買う
カレールーを買う

# 調理
ご飯を炊く
玉ねぎを切る
玉ねぎを炒める
肉を炒める
水を入れる
ルーを入れる
しばらく煮込む

# 食べる
皿にご飯を盛り付ける
カレーをご飯の上にかける
カレーを食べる

# 片付け
皿や鍋を洗う

それぞれ分類することでかなり読みやすくなりました。

メソッド定義

食材の購入()
調理()
食べる()
片付け()

def 食材の購入
  スーパーに行く
  肉を買う
  玉ねぎを買う
end

def 調理
  ご飯を炊く
  玉ねぎを切る
  玉ねぎを炒める
  肉を炒める
  水を入れる
  ルーを入れる
  しばらく煮込む
end

def 食べる
  皿にご飯を盛り付ける
  カレーをご飯の上にかける
  カレーを食べる
end

def 片付け
  皿や鍋を洗う
end

実際に実行される作業は最初と同じですが、最初のダラダラしたプログラムとは異なり、
メソッドを定義することでプログラムの見通しをよくすることができました。

他にも重複したコードをなくすためにメソッドを定義するという考え方もあるのですが、
大きなプログラムではどうしてもコードが長くなってくると思うので、
まずはグルーピングをすることをお勧めします。

重複するコードを無くす

def 片付け
  スポンジに洗剤を付ける
  皿の汚れを水で軽く流す
  皿をスポンジでこする
  皿に付いている泡を水で流す
  布で皿の水気を取る

  スポンジに洗剤を付ける
  鍋の汚れを水で軽く流す
  鍋をスポンジでこする
  鍋に付いている泡を水で流す
  布で鍋の水気を取る
end

片付けがこのようになっていた場合では、鍋と皿の違いしかありません。

この範囲を綺麗に引数の考え方で整理していきます。

def 片付け
  洗う(皿)
  洗う(鍋)
end

def 洗う(何か)
  スポンジに洗剤を付ける
  何かの汚れを水で軽く流す
  何かをスポンジでこする
  何かに付いている泡を水で流す
  きれいな布巾で何かの水気を取る
end

以上のように変更することで、同じコードを何回も書く必要はなくなりました。
そしてお皿と鍋以外の調理器具が追加された場合でも対応できます。
例えば今回はカレーなので「スプーン」なんかも追加できちゃいます。
このように後から追加した場合でも対応できるので重複するコードをなくす考え方も大切になります。

まとめ

今回はプログラムを作る時のやり方や考え方について説明してみました。

僕はコメントを多用し、しばらくしてから見直した後でも分かりやすいように心がけています。

パッと見た時はあまりスマートではありませんが、コメントにより解読する必要も最小限で良く、全体を早く理解できるメリットがあります。