星形パターン描画を題材に学ぶ ― コード改善ロードマップ (C#)

学習ゴール

  1. ループ・メソッド抽出・名前空間などの文法要素を実践的に理解する
  2. 「動くけれど雑なコード」→「再利用しやすい設計」へのリファクタリング手順を体験する
  3. 意味のあるネーミングと XML ドキュメンテーションコメントの効果を体感する

Step 0 : とりあえず動くベタ書きコード

// ── ★ 行数を指定して右上がり三角形を描画するだけ ──
System.Console.Write("何行表示しますか?: ");
int lines = int.Parse(System.Console.ReadLine()!);

for (int i = 1; i <= lines; i++)
{
    string stars = "";
    for (int j = 1; j <= i; j++)
    {
        stars += "*";
    }
    System.Console.WriteLine(stars);
}

改善ポイント

観点課題
再利用描画ロジックが Main にべた書きで“使い回し”不可
可読性ネストが深く、意図が一目で分かりにくい
テストループの内側を個別に検証できない

Step 1 : メソッド抽出 — 

PrintTriangle

static void PrintTriangle(int lineCount)
{
    for (int row = 1; row <= lineCount; row++)
    {
        System.Console.WriteLine(new string('*', row));
    }
}

System.Console.Write("何行表示しますか?: ");
int lineCount = int.Parse(System.Console.ReadLine()!);
PrintTriangle(lineCount);

変更点と効果

変更効果
描画処理を PrintTriangle へ分離処理を名前で要約 → 読みやすさ向上
文字列生成を new string('*’, row) に置換内部ループを排除してシンプルに

Step 2 : ユーティリティ化 — 

StarPrinter クラス

public static class StarPrinter
{
    public static void PrintTriangle(int lineCount)
    {
        for (int row = 1; row <= lineCount; row++)
        {
            System.Console.WriteLine(new string('*', row));
        }
    }
}
System.Console.Write("何行表示しますか?: ");
int lineCount = int.Parse(System.Console.ReadLine()!);
StarPrinter.PrintTriangle(lineCount);
効果
描画専用クラスに“責務”を集約 → API らしく再利用可能に
インスタンス不要の static で 状態を持たない関数群 を明示

Step 3 : 名前空間導入 — 

StarPatterns

namespace StarPatterns
{
    public static class StarPrinter
    {
        public static void PrintTriangle(int lineCount)
        {
            for (int row = 1; row <= lineCount; row++)
            {
                System.Console.WriteLine(new string('*', row));
            }
        }
    }
}
// 呼び出し例
StarPatterns.StarPrinter.PrintTriangle(lineCount);
効果
大規模プロジェクトでも型名衝突を防止
“機能モジュール”単位の整理でファイル構成が直感的に

Step 4 : XML ドキュメンテーションコメント追加

namespace StarPatterns
{
    /// <summary>
    /// 星(★)パターンをコンソールに描画するユーティリティ。
    /// </summary>
    public static class StarPrinter
    {
        /// <summary>
        /// 1 行目に 1 個、2 行目に 2 個 … と並ぶ右上がり三角形を描画する。
        /// </summary>
        /// <param name="lineCount">表示する行数(頂点から底辺までの高さ)</param>
        public static void PrintTriangle(int lineCount)
        {
            for (int row = 1; row <= lineCount; row++)
            {
                System.Console.WriteLine(new string('*', row));
            }
        }
    }
}
効果
IDE のツールチップで API 説明が即表示 → 他人/未来の自分が迷わない
ドキュメント生成ツール(DocFX など)にもそのまま利用可能

完成版ソース(Program.cs 全体)

using StarPatterns;

class Program
{
    static void Main()
    {
        System.Console.Write("何行表示しますか?: ");
        int lineCount = int.Parse(System.Console.ReadLine()!);

        // ★ 名前空間+静的クラス+適切メソッド名で呼び出し
        StarPrinter.PrintTriangle(lineCount);
    }
}

発展課題

  1. 逆三角形 を描く PrintInvertedTriangle を StarPrinter に追加
  2. ConsoleColor を使い 行ごとに色を変える バリエーションへ拡張
  3. 標準出力を StringWriter にリダイレクトし、NUnit/xUnit で単体テスト
  4. 描画結果をテキストファイルに保存する SaveTriangle(path, lineCount) を実装

まとめ

学んだことキーアイデア
コード分割小さなメソッドへ抽出して名前で要約
設計整理静的ユーティリティ+名前空間で責務と住所を明確化
ドキュメントXML コメントで自己説明的 APIを提供
学習効果Before → After を段階的に体験すると理解と定着が深まる

動くものを一歩ずつ磨く ― その過程こそが最大の教材です。

訪問数 9 回, 今日の訪問数 1回

C#,繰り返し

Posted by hidepon