ルール
ドキュメント化されていない 匿名関数を過度に使用しない
ドキュメントのない大規模な 匿名関数は、 理解と再利用が困難です。
対応言語: 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);
});誤っている理由: filter関数には、複雑なビジネスロジック(サブスクリプション検証、検証チェック)が匿名関数内に埋め込まれています。このロジックは再利用できず、独立してテストすることも、すべての行を読まずに理解することもできません。フィルタリングロジックが失敗した場合、スタックトレースには匿名関数が表示されます。
✅ 準拠済み:
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行を超えるロジック、または再利用される可能性のあるロジックには、名前付き関数を使用してください。関数名が実装よりも長くなるような些細な操作には、匿名関数を予約してください。記述的な関数名は、インラインドキュメントとして機能します。

