Kural
Belgelendirilmemiş isimsiz fonksiyonları aşırı kullanmayın.
Belgesi olmayan büyük isimsiz fonksiyonların
anlaşılması ve yeniden kullanılması zordur.
Desteklenen diller: 45+Giriş
Geri çağrı (callback) veya olay işleyicisi (event handler) olarak iletilen isimsiz fonksiyonlar, amaçlarını uygulama detaylarının arkasında gizler. Şuradaki 20 satırlık ok fonksiyonu (arrow function) .map() veya .filter() okuyucuların hangi dönüşümün gerçekleştiğini anlamak için tüm mantığı incelemesini zorunlu kılar. Açıklayıcı adlara sahip named fonksiyonlar niyeti hemen belgeler ve uygulama detaylarına dalmadan önce fonksiyon adını okuyarak karmaşık mantık anlaşılabilir.
Kod örnekleri
❌ Kural dışı:
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);
});Neden yanlış: Filtreleme fonksiyonu, isimsiz bir fonksiyonun içine gizlenmiş karmaşık iş mantığı (abonelik doğrulama, onay kontrolleri) içerir. Bu mantık yeniden kullanılamaz, bağımsız olarak test edilemez veya her satır okunmadan anlaşılamaz. Filtreleme mantığı başarısız olursa yığın izlemeleri (stack traces) isimsiz fonksiyonları gösterir.
✅ Kurallara uygun:
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);
});Neden önemli: Karmaşık iş mantığı, test edilebilir fonksiyonlara ayrıştırılır. hasActiveSubscription() ve isVerifiedUser() birim testi yapılabilir ve yeniden kullanılabilir. Yığın izlemeleri (stack traces) fonksiyon adlarını göstererek hata ayıklamayı hızlandırır. Bitiş noktası (endpoint) mantığı temizdir ve kendi kendini belgelendirir.
Sonuç
2-3 satırdan uzun olan veya yeniden kullanılabilecek her türlü mantık için adlandırılmış fonksiyonlar kullanın. Fonksiyon adının uygulamanın kendisinden daha uzun olacağı önemsiz işlemler için anonim fonksiyonları saklı tutun. Açıklayıcı fonksiyon adları, satır içi (inline) belgelendirme işlevi görür.

