プログラムを作る上で「どこでメソッドの定義をするのかがわからない」と言われたことがあります。
僕の結論から言うと、「必要になった段階で使用している」が答えになります。
では、いつ必要になるのか?
答えは規模が大きくなるプログラムでは必要になります。
また、今後大きくなる予想があるのであればある程度の想定で定義してまとめておきます。
構想レベル
例えば料理をするプログラムを作るとします。
下記のようにある程度わかる範囲はコメントで書き出します。
スーパーに行く
肉を買う
玉ねぎを買う
カレールーを買う
ご飯を炊く
玉ねぎを切る
玉ねぎを炒める
肉を炒める
水を入れる
ルーを入れる
しばらく煮込む
皿にご飯を盛り付ける
カレーをご飯の上にかける
カレーを食べる
皿や鍋を洗う
僕の場合はこんな形になりました。
作業分類
# 食材の購入
スーパーに行く
肉を買う
玉ねぎを買う
カレールーを買う
# 調理
ご飯を炊く
玉ねぎを切る
玉ねぎを炒める
肉を炒める
水を入れる
ルーを入れる
しばらく煮込む
# 食べる
皿にご飯を盛り付ける
カレーをご飯の上にかける
カレーを食べる
# 片付け
皿や鍋を洗う
それぞれ分類することでかなり読みやすくなりました。
メソッド定義
食材の購入()
調理()
食べる()
片付け()
def 食材の購入
スーパーに行く
肉を買う
玉ねぎを買う
end
def 調理
ご飯を炊く
玉ねぎを切る
玉ねぎを炒める
肉を炒める
水を入れる
ルーを入れる
しばらく煮込む
end
def 食べる
皿にご飯を盛り付ける
カレーをご飯の上にかける
カレーを食べる
end
def 片付け
皿や鍋を洗う
end
実際に実行される作業は最初と同じですが、最初のダラダラしたプログラムとは異なり、
メソッドを定義することでプログラムの見通しをよくすることができました。
他にも重複したコードをなくすためにメソッドを定義するという考え方もあるのですが、
大きなプログラムではどうしてもコードが長くなってくると思うので、
まずはグルーピングをすることをお勧めします。
重複するコードを無くす
def 片付け
スポンジに洗剤を付ける
皿の汚れを水で軽く流す
皿をスポンジでこする
皿に付いている泡を水で流す
布で皿の水気を取る
スポンジに洗剤を付ける
鍋の汚れを水で軽く流す
鍋をスポンジでこする
鍋に付いている泡を水で流す
布で鍋の水気を取る
end
片付けがこのようになっていた場合では、鍋と皿の違いしかありません。
この範囲を綺麗に引数の考え方で整理していきます。
def 片付け
洗う(皿)
洗う(鍋)
end
def 洗う(何か)
スポンジに洗剤を付ける
何かの汚れを水で軽く流す
何かをスポンジでこする
何かに付いている泡を水で流す
きれいな布巾で何かの水気を取る
end
以上のように変更することで、同じコードを何回も書く必要はなくなりました。
そしてお皿と鍋以外の調理器具が追加された場合でも対応できます。
例えば今回はカレーなので「スプーン」なんかも追加できちゃいます。
このように後から追加した場合でも対応できるので重複するコードをなくす考え方も大切になります。
まとめ
今回はプログラムを作る時のやり方や考え方について説明してみました。
僕はコメントを多用し、しばらくしてから見直した後でも分かりやすいように心がけています。
パッと見た時はあまりスマートではありませんが、コメントにより解読する必要も最小限で良く、全体を早く理解できるメリットがあります。