プログラミングセオリーの価値と原則【3つの価値編】
この記事の目次
はじめに
プログラミングは、単なるコードを書く作業にとどまりません。その背後には、深い思想と価値観が存在します。その中で、プログラミングセオリーは、最高のコードを作り上げるための基本的な価値観と原則を提示しています。本記事では、プログラミングセオリーを支える三つの価値、「コミュニケーション」「シンプル」「柔軟性」について詳しく探求し、それがどのようにして実践的なプログラミングに影響を与えるかを解説します。
プログラミングセオリーとは
プログラミングセオリーは、最高のコードを作り上げるための指針となる価値観です。この価値観は、「拡張方法が多く存在し、余分な要素が存在せず、読みやすく、理解しやすい」コードを目指します。そして、そのために必要な3つの価値として「コミュニケーション」「シンプル」「柔軟性」が挙げられます。
価値観を技術の選択基準に
技術だけを学習しても、小手先のテクニックに過ぎず、本当の意味で使えるようにはなりません。プログラミングにおける問題解決は都度状況が異なるため、目的に沿った適応理由が見出せなければ、適切な技術を選択できません。ここでプログラミングセオリーが重要となり、セオリーで示される「価値」は、個別技術の適用理由となります。
価値観は原則を通じてコードに適用
価値観は抽象的すぎるため、その橋渡しの概念として「原則」を通じて実践に繋げます。プログラミングセオリーは6つの原則を提示しており、これらは「結果の局所化」「繰り返しの最小化」「ロジックとデータの一体化」「対称性」「宣言型の表現」「変更頻度」です。これらの原則については、次回の記事で個別に説明します。本記事ではまず3つの価値に焦点を当てます。
プログラミングセオリーを支える3つの価値
1. コミュニケーション (Communication)
コードはコミュニケーションの場である
コードは単なる指示の集合ではなく、開発者同士のコミュニケーションツールでもあります。コードは「文章」として考えるべきであり、その本質はコミュニケーションです。プログラミングにおいて、良好なコミュニケーションが成り立つコードとは、他の開発者が読んで理解し、修正し、利用できるコードです。
円滑な開発は円滑なコミュニケーションから
ソフトウェアの開発コストの大半は保守にかかると言われています。そのコストを節約するためには、コードを読みやすくする必要があります。保守だけでなく、新規のコードを書く際にも、自分自身とのコミュニケーションが求められます。少し前に書いたコードを理解するために、コードは常に他者(または過去の自分)に向けたものであることを意識することが重要です。
コードを読む側の視点に転回せよ
コードを書くときは、常に他の人のことを考えるようにします。コードには「コンパイラやインタプリタへの入力」という側面だけでなく、「人に見せる文章」という側面があります。この視点を持つことで、コードの読みやすさと理解しやすさが向上します。
TypeScriptの例:
// Good: 分かりやすく、コメントが充実している /** * ユーザーを表すインターフェース */ interface User { id: number; name: string; email: string; } /** * ユーザーを作成する関数 * @param name - ユーザーの名前 * @param email - ユーザーのメールアドレス * @returns 新しいユーザー */ function createUser(name: string, email: string): User { return { id: Date.now(), name, email }; }
この例では、コメントがコードの意図を明確にし、他の開発者が理解しやすいようにしています。
2. シンプル (Simplicity)
コードの複雑性は排除する
シンプルなコードとは、余計な複雑性が取り除かれた状態のコードです。「余計な複雑性」とは、コードを動かすために格闘した痕跡によるものです。
コードの複雑性は禍根となる
余計な複雑性は、コードの正しい動作の確率を減らし、将来の変更を困難にします。複雑性を排除することで、コードはシンプルになり、読みやすく、使いやすく、修正しやすくなります。シンプルなコードは障害の入り込む確率も格段に低くなります。
コードの玉石を仕分ける
本質的な部分(玉)を目立つようにし、余分な要素(石)が紛れ込まないように設計します。シンプルさはコミュニケーションと相互に好影響を与えます。ただし、シンプルにしすぎると情報が少なくなり、分かりにくくなるケースもあります。その場合は、冗長になってもコミュニケーションを優先します。
TypeScriptの例:
// Good: シンプルで明確 /** * 2つの数値を加算する関数 * @param a - 最初の数値 * @param b - 2番目の数値 * @returns aとbの合計 */ function add(a: number, b: number): number { return a + b; }
この例は、関数がシンプルで直感的であり、余計な複雑性がありません。
3. 柔軟性 (Flexibility)
コードの変更が容易である
コードにおける柔軟性とは、コードの変更が容易であることです。
コードは必ず変更される
ソフトウェアは進化し続けるものであり、コードの変更は必ず発生します。そのため、柔軟なコードを作成しておくことは必達事項です。柔軟なコードは保守作業を円滑に進めるために必要です。
コードの拡張性を上げる
柔軟性を持たせるために、コードを拡張しやすくし、その拡張が他に波及しないような設計を心がけます。ただし、柔軟性は諸刃の剣でもあります。柔軟性を言い訳に複雑なコードや設計が正当化されやすいため、複雑性を持たずに柔軟性を持つためのバランスが重要です。即効果のあるコード以外は書かないようにし、シンプルからスタートして、ユニットテストからボトムアップ的に得られる柔軟性の方が効果的です。
TypeScriptの例:
// Good: 拡張性を考慮した設計 interface Shape { area(): number; } class Circle implements Shape { constructor(private radius: number) {} area(): number { return Math.PI * this.radius * this.radius; } } class Rectangle implements Shape { constructor(private width: number, private height: number) {} area(): number { return this.width * this.height; } } // 新しい形状を追加する際にはShapeインターフェースを実装するだけでよい class Triangle implements Shape { constructor(private base: number, private height: number) {} area(): number { return 0.5 * this.base * this.height; } }
この例では、Shapeインターフェースを使うことで、将来的に新しい形状を追加する際の変更が容易になっています。クラスごとに独立したエリア計算の実装が可能であり、コードの柔軟性が高まっています。
まとめ
プログラミングセオリーの「価値」は、最高のコードを作り上げるための指針として、コミュニケーション、シンプル、柔軟性の3つに集約されます。これらの価値観は、個別技術の適用理由となり、実践的なプログラミングにおいて重要な役割を果たします。次回の記事では、これらの価値観を具体的にコードに適用するための「原則」について詳しく解説します。最高のコードを目指すためのセオリーを理解し、実践することで、プログラミングの質を大きく向上させることができるでしょう。
参考書籍:上田勲(2016). プリンシプルオブプログラミング 3年目までに身に着けたい一生役立つ101の原理原則 秀和システム
カテゴリー: