ルール
過度な使用は避ける 過度に使用しないでください 文書化されていない 関数 関数。
大規模な 匿名 関数 ドキュメント ドキュメント
は 難しい 理解 理解 であり 再利用
サポート言語: 45+はじめに
コールバックやイベントハンドラとして渡される匿名関数は、その目的を実装の詳細の背後に隠す。20行の矢印関数が .map() または .filter() 読者に変換の全過程を理解させるために、論理全体を解析させる。説明的な名前を持つ関数は意図を即座に文書化し、複雑な論理も実装に深く入り込む前に関数名を読むだけで理解できる。
コード例
非準拠:
app.get('/users', async (req, res) => {
const users = await db.users.find({});
const processed = users.filter(u => {
const hasActiveSubscription = u.subscriptions?.some(s =>
s.status === 'active' && new Date(s.expiresAt) > new Date()
);
const isVerified = u.emailVerified && u.phoneVerified;
return hasActiveSubscription && isVerified && !u.deleted;
}).map(u => ({
id: u.id,
name: `${u.firstName} ${u.lastName}`,
email: u.email,
memberSince: new Date(u.created).getFullYear(),
tier: u.subscriptions[0]?.tier || 'free'
})).sort((a, b) => a.name.localeCompare(b.name));
res.json(processed);
});問題点:フィルター関数には複雑なビジネスロジック(購読の有効性検証、確認チェック)が匿名関数内に埋め込まれている。このロジックは再利用できず、個別にテストできず、一行一行読まなければ理解できない。フィルタリングロジックが失敗した場合、スタックトレースには匿名関数が表示される。
✅ 準拠:
function hasActiveSubscription(user) {
return user.subscriptions?.some(subscription =>
subscription.status === 'active' &&
new Date(subscription.expiresAt) > new Date()
);
}
function isVerifiedUser(user) {
return user.emailVerified && user.phoneVerified && !user.deleted;
}
function isEligibleUser(user) {
return hasActiveSubscription(user) && isVerifiedUser(user);
}
function formatUserResponse(user) {
return {
id: user.id,
name: `${user.firstName} ${user.lastName}`,
email: user.email,
memberSince: new Date(user.created).getFullYear(),
tier: user.subscriptions[0]?.tier || 'free'
};
}
function sortByName(a, b) {
return a.name.localeCompare(b.name);
}
app.get('/users', async (req, res) => {
const users = await db.users.find({});
const processed = users
.filter(isEligibleUser)
.map(formatUserResponse)
.sort(sortByName);
res.json(processed);
});なぜこれが重要なのか: 複雑なビジネスロジックはテスト可能な関数に抽出される。 hasActiveSubscription() そして isVerifiedUser() ユニットテストが可能で再利用できます。スタックトレースには関数名が表示されるため、デバッグが迅速化されます。エンドポイントロジックはクリーンで自己文書化されています。
結論
2~3行を超えるロジックや再利用が想定されるロジックには、名前付き関数を使用してください。関数名が実装よりも長くなるような単純な操作にのみ、無名関数を留保してください。説明的な関数名はインラインドキュメントとして機能します。
.avif)
