高品質なソフトウェア開発のための原則 Part1 ~ KISS・DRY・YAGNI・PIE ~
ソフトウェア開発において、高品質なコードを書くためにはいくつかの重要な原則があります。これらの原則は、コードの可読性、保守性、拡張性を向上させるために不可欠です。この記事では、以下の原則について簡潔に説明し、それぞれの実践方法と具体的なTypeScriptのコード例を交えて紹介します。
この記事の目次
KISS (Keep it Simple, Stupid)
What?
KISSは「シンプルにしておけ、愚か者よ」という意味で、コードを可能な限りシンプルに保つことを推奨します。複雑なコードはエラーが発生しやすく、理解や保守が難しくなります。
Why?
コードは修正を繰り返していくうちに複雑になりがちです。シンプルなコードは以下の利点があります。
- 読みやすい:コードを理解するための時間が短縮されます。
- 理解しやすい:新しいメンバーでも迅速に理解できるようになります。
- 修正が容易:バグ修正や機能追加が簡単になります。
- テストがしやすい:シンプルなコードはテストケースが少なくて済みます。
- コードを通じたコミュニケーションが取りやすい:開発チーム全体で一貫した理解を持つことができます。
How?
コードに余計なことをしないようにします。
- 新しい技術を無理に使わない:技術を試すことは重要ですが、無理に複雑なコードを書かないようにします。
- 将来必要になるかもと考え、過剰なコードを書かない:必要な時に必要な分だけ書きます。
- 勝手に要件を追加しない:要件を明確にし、必要な機能だけを実装します。
TypeScript例
// シンプルな関数の例
function calculateTotal(price: number, tax: number): number {
return price + tax;
}
この例では、商品の価格と税額を合計する非常にシンプルな関数を定義しています。このようなシンプルな関数は、読みやすく、理解しやすいです。
DRY (Don’t Repeat Yourself)
What?
DRYは「繰り返すな」という意味で、コードのコピペを避けることを推奨します。同じコードを何度も書くことは避けるべきです。
Why?
重複したコードは以下の問題を引き起こします。
- コードの可読性が低下する:同じロジックが複数箇所に存在するため、理解が難しくなります。
- 修正が難しくなる:一箇所の変更が他の箇所にも影響するため、修正が複雑になります。
- テストが不十分になる可能性が高い:重複するコードがテストされていない場合、バグが見逃される可能性があります。
How?
コードを抽象化します。「関数化」、「モジュール化」することで、以下のメリットがあります。
- コード量が減り、読む量が減る:重複を避けることで、コード全体が短くなります。
- ロジックやデータに名前が付き、コードが読みやすくなる:関数名や変数名で意図が明確になります。
- 同じコードが集約され、修正が容易になる:一箇所の修正で全体に反映されます。
- 再利用しやすくなる:抽象化した部分は他の場所でも再利用できます。
TypeScript例
// 重複を避けるための抽象化例
function calculateArea(width: number, height: number): number {
return width * height;
}
function printArea(shape: { width: number; height: number }) {
const area = calculateArea(shape.width, shape.height);
console.log(`The area is ${area}`);
}
この例では、面積を計算する関数を抽象化して再利用しています。これにより、コードの重複を避け、修正が容易になります。
YAGNI (You Aren’t Going to Need It)
What?
YAGNIは「それはきっと必要にならない」という意味で、コードは本当に必要になったときにだけ書くことを推奨します。
Why?
将来の予測はほとんど外れるため、先回りしてコードを追加しても無駄になる可能性が高いです。また、使われていないコードは保守しにくくなります。
How?
「今」必要なものだけを書きます。汎用性よりも単純性を重視します。単純な解の方が、実際には汎用性が高いことがよくあります。
TypeScript例
// 必要な機能だけを実装する例
function fetchUserData(userId: string): Promise<UserData> {
// 必要になったら他のデータも追加する
return fetch(`/api/users/${userId}`)
.then(response => response.json());
}
この例では、ユーザーデータを取得するための最低限の機能だけを実装しています。必要になったら他のデータを追加することを考えます。
PIE (Program Intently and Expressively)
What?
PIEは「意図を表現してプログラミングせよ」という意味で、コードを書くときは意図を明確に表現することを推奨します。
Why?
コードは人が読むためのものであり、コードからソフトウェアの動作を正確に理解するための唯一の手がかりです。資料もありますが、それらはコードの詳細な動作を説明するものではありません。
How?
コードは読みやすさを最優先します。読み手にストレートに伝わるように書きます。これには、適切な命名やコメントを活用することが含まれます。
TypeScript例
// 意図を明確にするための命名とコメント
/**
* ユーザーの合計支出を計算する関数
* @param user - 計算対象のユーザー
* @returns 合計支出
*/
function calculateTotalSpent(user: User): number {
return user.orders.reduce((total, order) => total + order.amount, 0);
}
この例では、関数名とコメントを用いて、関数の意図を明確にしています。これにより、コードを読む人が関数の目的をすぐに理解できるようになります。
まとめ
この記事では、ソフトウェア開発における4つの重要な原則、KISS、DRY、YAGNI、PIEについて詳しく説明しました。これらの原則を実践することで、コードの品質が向上し、保守性や拡張性が高まります。次回の記事では、さらに「SLAP」、「OCP」、「命名の重要性」といった原則について解説しますので、ぜひご覧ください。
参考書籍:上田勲(2016). プリンシプルオブプログラミング 3年目までに身に着けたい一生役立つ101の原理原則 秀和システム
カテゴリー: