プログラミングクイズ: 複雑なプログラムを綺麗にしよう

IT教育

こんにちは、みなさん!
ga子供プログラミング教室 高松 の ひろ です。

入会・無料体験 募集中!

現役エンジニアが基礎から楽しく教える教室です!
おトクな開校キャンペーン 実施中!
詳細・入会申込・無料体験申込・お問い合わせはコチラ

お問い合わせ・ご相談から気軽に!

今日は、プログラミングの世界でとても大切な「コードの整理整頓」についてお話しします。ちょっと趣向を凝らしてクイズにしてみました。楽しんでいただけたらと思います!

プログラミングって、ただ動くコードを書けばいいわけじゃないんです。きれいで分かりやすいコードを書くことが、実は超重要なんです!そうすることで、プロのように大きいプログラムを作れたり、バグが入りにくくできるようになります。

では、早速クイズに挑戦してみましょう!

クイズ:ボーリングスコア計算プログラムをスッキリさせよう!

今回のお題は、ボーリングのスコア計算プログラムです。最初に、ちょっと複雑なプログラムを見てみましょう。

Python
def calculate_bowling_score(frames):
    total_score = 0
    for i in range(len(frames)):
        if i < 9:  # 1フレームから9フレームまで
            if frames[i][0] == 10:  # ストライク
                total_score += 10
                if i + 1 < len(frames):
                    if frames[i+1][0] == 10:  # 次もストライク
                        total_score += 10
                        if i + 2 < len(frames):
                            total_score += frames[i+2][0]
                    else:  # 次がストライクじゃない
                        total_score += frames[i+1][0] + frames[i+1][1]
            elif frames[i][0] + frames[i][1] == 10:  # スペア
                total_score += 10
                if i + 1 < len(frames):
                    total_score += frames[i+1][0]
            else:  # オープンフレーム
                total_score += frames[i][0] + frames[i][1]
        else:  # 10フレーム目
            total_score += sum(frames[i])
    return total_score

# テスト実行
frames = [
    [10, 0], [7, 3], [9, 0], [10, 0], [0, 8],
    [8, 2], [0, 6], [10, 0], [10, 0], [10, 8, 1]
]

print(calculate_bowling_score(frames))  # スコアを計算して表示

うわぁ、なんだかゴチャゴチャしてますね。頭が痛くなっちゃいそう…。

でも大丈夫!このプログラムを、もっと分かりやすくする方法があるんです。一緒に考えてみましょう!

クイズの解き方:3つのポイント

1. 関数を小分けにしよう

大きな関数を、小さな役割ごとの関数に分けると、とっても分かりやすくなります。例えば、「ストライクかどうかを判断する関数」「スペアかどうかを判断する関数」なんてどうでしょう?

2. 条件文をシンプルに

if文がネストしてると、読むのが大変ですよね。条件をシンプルにして、早めにreturnするテクニックを使うと、ぐっと読みやすくなります。

3. 同じ処理はまとめよう

同じような処理が幾つかの場所にあるのは良くないサインです。プログラムの構造を見直すか関数にする等を検討しましょう。

同じ処理が複数箇所あって、修正のときに修正漏れが発生するのはプロとしてはメチャかっこ悪いあるあるです。

解答例

さて、これらのポイントを踏まえて、プログラムをキレイにしてみました。どうでしょう?

Python
def calculate_frame_score(frame, next_frame, next_next_frame):
    """1フレームのスコアを計算する"""
    score = sum(frame)
    if is_strike(frame):
        score += strike_bonus(next_frame, next_next_frame)
    elif is_spare(frame):
        score += spare_bonus(next_frame)
    return score

def is_strike(frame):
    """ストライクかどうかを判定"""
    return frame[0] == 10

def is_spare(frame):
    """スペアかどうかを判定"""
    return sum(frame) == 10

def strike_bonus(next_frame, next_next_frame):
    """ストライクのボーナスを計算"""
    bonus = sum(next_frame)
    if is_strike(next_frame) and next_next_frame:
        bonus += next_next_frame[0]
    return bonus

def spare_bonus(next_frame):
    """スペアのボーナスを計算"""
    return next_frame[0]

def calculate_bowling_score(frames):
    """全フレームのスコアを計算"""
    total_score = 0
    for i in range(len(frames) - 1):  # 最後のフレームは別処理
        total_score += calculate_frame_score(frames[i], frames[i+1], frames[i+2] if i+2 < len(frames) else None)
    total_score += sum(frames[-1])  # 最後のフレームは単純に合計
    return total_score

# テスト実行
frames = [
    [10, 0], [7, 3], [9, 0], [10, 0], [0, 8],
    [8, 2], [0, 6], [10, 0], [10, 0], [10, 8, 1]
]

print(calculate_bowling_score(frames))  # スコアを計算して表示

いかがでしょうか? シンプルな関数単位で切り分けられ、繰り返しや条件分岐も簡単になり、ずいぶんスッキリしましたね!

なぜコードをキレイにするの?

さて、ここで大切な質問。「どうしてこんなに頑張ってコードをキレイにするの?」って思いませんか?

「プログラムが動けばいいんでしょ?」って思う人もいるかもしれません。

実は、キレイなコードを書く能力は、プログラマーにとってとっても大切なんです。理由をいくつか挙げてみましょう:

  1. バグりにくい: シンプルなプログラムは、間違いを見つけやすく、修正もしやすいんです。
  2. 大きなプログラムを書ける: 小さなプログラムならともかく、大きなプログラムになると複雑さがどんどん増していきます。最初からきれいなコードを心がけていれば、大きくなってもまだ扱いやすいプログラムになります。
  3. 手早く機能追加できる: 読みやすいプログラムなら、新しい機能を追加するのもサクサク進みます。
  4. チームで協力しやすい: プログラミングって、一人で作業することもあれば、チームで協力することもあります。きれいなコードなら、他の人が読んでもすぐに理解できるので、チームでの開発がとってもスムーズになります。

まとめ

いかがでしたか?プログラミングって、ただ動くものを作るだけじゃないんです。キレイで分かりやすいコードを書くことで、もっと楽しく、もっと効率的にプログラミングができるようになります。

ぜひこの「コードをキレイにする」という視点も取り入れてみてください。きっと、プログラミングの新しい魅力に気づけるはずです。

みなさんも、ぜひチャレンジしてみてくださいね!プログラミングの世界で、素敵な冒険が待っていますよ!

コメント

タイトルとURLをコピーしました