関数
一連の処理をまとめて名前をつけ、引数を受け取り結果を返す再利用可能なコードの単位
プログラミング基礎
関数とは
関数 (Function) は、一連の処理をまとめて名前をつけたものである。引数 (入力) を受け取り、処理を行い、戻り値 (出力) を返す。同じ処理を何度も書く代わりに、関数として定義すれば 1 回書くだけで済む。
基本構文
function add(a: number, b: number): number {
return a + b;
}
const result = add(3, 5); // 8
function キーワードで宣言し、引数の型と戻り値の型を指定する。return で値を呼び出し元に返す。
アロー関数
短い関数はアロー関数で簡潔に書ける。
const add = (a: number, b: number): number => a + b;
const greet = (name: string): string => {
return `こんにちは、${name}さん`;
};
本体が 1 式だけなら {} と return を省略できる。
引数のパターン
// デフォルト引数
function greet(name: string, greeting = "こんにちは"): string {
return `${greeting}、${name}さん`;
}
// 残余引数
function sum(...numbers: number[]): number {
return numbers.reduce((a, b) => a + b, 0);
}
// オブジェクト引数 (分割代入)
function createUser({ name, age }: { name: string; age: number }) {
return { name, age, createdAt: new Date() };
}
引数が 3 つ以上になる場合は、オブジェクトで渡すと呼び出し側の可読性が上がる。
戻り値
関数は return で値を返す。return がない関数は undefined を返す。
// 値を返す関数
function square(n: number): number {
return n * n;
}
// 値を返さない関数 (副作用のみ)
function log(message: string): void {
console.log(message);
}
戻り値の型を void と明示すると、値を返さない意図が伝わる。
関数の設計原則
| 原則 | 説明 |
|---|---|
| 単一責任 | 1 つの関数は 1 つのことだけを行う |
| 短く保つ | 20〜30 行以内が目安 |
| 命名で意図を伝える | getData より fetchUserById |
| 副作用を最小化 | 外部状態の変更を避ける |
純粋関数と副作用
同じ引数に対して常に同じ結果を返し、外部に影響を与えない関数を純粋関数と呼ぶ。
// 純粋関数: 外部に依存しない
function double(n: number): number {
return n * 2;
}
// 非純粋関数: 外部状態を変更する
let count = 0;
function increment(): number {
count += 1; // 副作用
return count;
}
純粋関数はテストしやすく、バグが入りにくい。
コールバック関数
関数を別の関数の引数として渡すパターンをコールバックと呼ぶ。
const numbers = [1, 2, 3, 4, 5];
const even = numbers.filter(n => n % 2 === 0); // [2, 4]
filter に渡している n => n % 2 === 0 がコールバック関数である。
関数のオーバーロード
TypeScript では同じ名前で異なるシグネチャを定義できる。
function format(value: number): string;
function format(value: Date): string;
function format(value: number | Date): string {
if (typeof value === "number") return value.toFixed(2);
return value.toISOString();
}
よくある間違い
| 間違い | 問題 | 対策 |
|---|---|---|
| 関数が長すぎる | 可読性・テスト性の低下 | 小さな関数に分割 |
| 引数が多すぎる | 呼び出し側が混乱 | オブジェクト引数にまとめる |
| 戻り値の型が曖昧 | 呼び出し側でバグ | 型を明示する |
| 関数名と処理の不一致 | 誤解を招く | 名前を処理に合わせる |
関数設計の考え方は関連書籍に詳しい。
この記事は役に立ちましたか?