星形パターン描画を題材に学ぶ ― コード改善ロードマップ (C#)
学習ゴール
- ループ・メソッド抽出・名前空間などの文法要素を実践的に理解する
- 「動くけれど雑なコード」→「再利用しやすい設計」へのリファクタリング手順を体験する
- 意味のあるネーミングと 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);
}
}
発展課題
- 逆三角形 を描く PrintInvertedTriangle を StarPrinter に追加
- ConsoleColor を使い 行ごとに色を変える バリエーションへ拡張
- 標準出力を StringWriter にリダイレクトし、NUnit/xUnit で単体テスト
- 描画結果をテキストファイルに保存する SaveTriangle(path, lineCount) を実装
まとめ
学んだこと | キーアイデア |
---|
コード分割 | 小さなメソッドへ抽出して名前で要約 |
設計整理 | 静的ユーティリティ+名前空間で責務と住所を明確化 |
ドキュメント | XML コメントで自己説明的 APIを提供 |
学習効果 | Before → After を段階的に体験すると理解と定着が深まる |
動くものを一歩ずつ磨く ― その過程こそが最大の教材です。
訪問数 9 回, 今日の訪問数 1回
ディスカッション
コメント一覧
まだ、コメントがありません