Upgrade to Pro — share decks privately, control downloads, hide ads and more …

C#未経験の僕がAIに読めるコードを書かせるまで

 C#未経験の僕がAIに読めるコードを書かせるまで

C#Kaigi2026の登壇資料です。
https://csharpkaigi.net/talks/lt-ai-readable-code

Avatar for マグロ隊長kinTV

マグロ隊長kinTV

September 19, 2026

More Decks by マグロ隊長kinTV

Other Decks in Technology

Transcript

  1. 読めるコードを書かせる わかったこと - 基本文法は問題なし。 public sealed class UserRepository : IUserRepository

    { private readonly IDbConnection _connection; public async Task<IReadOnlyList<User>> FindActiveAsync( CancellationToken cancellationToken = default) { ... } }
  2. 読めるコードを書かせる わかったこと - 基本文法は問題なし。 宣言が他言語より長いが中身 が簡潔 public sealed class UserRepository

    : IUserRepository { private readonly IDbConnection _connection; public async Task<IReadOnlyList<User>> FindActiveAsync( CancellationToken cancellationToken = default) { ... } }
  3. 読めるコードを書かせる ハマった点 - LINQによる遅延評価 - 画面外にいった敵を消して追加する var onScreen = enemies.Where(e

    => e.Y > bottomY); enemies.Add(new Enemy(...)) if (onScreen.Count() > 10) { ... } ここで追加した敵は onScreenに含まれな いと思ってた。
  4. 読めるコードを書かせる ハマった点 - LINQによる遅延評価 - 画面外にいった敵を消して追加する var onScreen = enemies.Where(e

    => e.Y > bottomY); enemies.Add(new Enemy(...)) if (onScreen.Count() > 10) { ... } 遅延評価が入るので 追加した敵も対象とな る
  5. 読めるコードを書かせる ハマった点 - 拡張メソッド - そもそもなんだこれ 既存クラスに新たにメソッドを追加できるもの public static class

    EnemyExtensions { public static bool IsThreatening(this Enemy enemy, Player player) { return enemy.IsAlive && enemy.DistanceTo(player) < 5f; } } Enemyを直接いじらず にIsThreateningを追加
  6. 読めるコードを書かせる ハマった点 - 拡張メソッド - 変に依存が増えて全体像が追いづらくなるため使用を避ける public static class EnemyExtensions

    { public static bool IsThreatening(this Enemy enemy, Player player) { return enemy.IsAlive && enemy.DistanceTo(player) < 5f; } }
  7. 読めるコードを書かせる LINQ private static bool IsLinqOperator(IMethodSymbol method) LINQ のメソッドか判定 {

    INamedTypeSymbol containing = method.ContainingType; if (containing == null || containing.ContainingNamespace == null) { return false; } if (containing.ContainingNamespace.ToDisplayString() != "System.Linq") { return false; } return containing.Name == "Enumerable" || containing.Name == "Queryable";
  8. 読めるコードを書かせる 遅延型かどうか LINQ if (definition.SpecialType == SpecialType.System_Collections_Generic_IEnumerable_T || definition.SpecialType ==

    SpecialType.System_Collections_IEnumerable) { return true; } if (definition.ContainingNamespace != null && definition.ContainingNamespace.ToDisplayString() == "System.Linq") { return definition.Name == "IOrderedEnumerable" || definition.Name == "IQueryable" || definition.Name == "IOrderedQueryable";
  9. 振る舞いの検証 ストーリー通り組めるのでわかりやすい public void GrowsWithSurvivedTime() { // Given ラウンドが始まり、スコアは 0

    Score score = new Score(); // When 2 秒生き残る score.Advance(2f); // Then スコアは 1 秒あたり 10 ずつ増え、20 になる Assert.AreEqual(20, score.Value); }