Aikido

Kodunuzda belgelendirilmemiş anonim fonksiyonları aşırı kullanmaktan neden kaçınmalısınız?

Okunabilirlik

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.

Sık Sorulan Sorular

Sorularınız mı var?

Anonim fonksiyonlar ne zaman kabul edilebilirdir?

İsimlendirmenin netlik katmadığı önemsiz işlemler için: .map(x => x * 2) veya .filter(item => item.id === targetId). Fonksiyon gövdesi tek bir ifadeden oluştuğunda ve niyet açık olduğunda anonim fonksiyonlar uygundur. Mantık birden fazla satıra yayıldığında veya karmaşıklaştuğunda, adlandırılmış fonksiyonlara aktarın.

Peki ok fonksiyonları (arrow functions) ve fonksiyon bildirimi (function declarations) karşılaştırması?

The issue is anonymity, not syntax. Both const double = x => x * 2 (named arrow function) and function double(x) { return x * 2; } (function declaration) are named and acceptable. Anonymous arrow functions array.map(x => x * 2) are fine for trivial operations but problematic for complex logic.

Adlandırılmış fonksiyonlar daha fazla ortak kod (boilerplate) oluşturmaz mı?

Birkaç satır daha fazla kod oluştururlar ancak anlama ve hata ayıklamada önemli ölçüde zaman kazandırırlar. Fonksiyonları adlandırmanın getirdiği yük, gelişmiş okunabilirlik, test edilebilirlik ve hata ayıklanabilirlik sayesinde fazlasıyla dengelenir. İyi adlandırılmış fonksiyonlar kendi kendini belgelendirir ve yorum satırı ihtiyacını azaltır.

Mevcut kod tabanındaki (legacy code) anonim fonksiyonları nasıl ele almalıyım?

Büyük anonim fonksiyonları normal bakım sırasında kademeli olarak ayıklayın. Karmaşık anonim fonksiyonlar içeren kodlarda hataları düzeltirken veya özellik eklerken, bunları değişikliğin bir parçası olarak dışarı aktarın. Fonksiyonları otomatik olarak ayıklamak ve adlandırmak için IDE yeniden yapılandırma (refactoring) araçlarını kullanın.

Hemen çağrılan fonksiyon ifadeleri (IIFE) hakkında ne düşünülmeli?

IIFEs can be named: (function initializeApp() { /* ... */ })(). The name helps in stack traces and documents purpose. Modern modules often eliminate the need for IIFEs, but when necessary, name them to aid debugging and comprehension.

Şimdi güvenliğinizi sağlayın

Kodunuzu, bulutunuzu ve çalışma zamanınızı tek bir merkezi sistemde güvenceye alın.
Güvenlik açıklarını otomatik olarak hızla bulun ve düzeltin.

Kredi kartı gerekmez | Tarama sonuçları 32 saniyede.