Aikido

Kodunuzda belgelenmemiş anonim işlevleri aşırı kullanmaktan neden kaçınmalısınız?

Okunabilirlik

Kural
Aşırı belgesiz belgelenmemiş anonim işlevleri
Büyük büyük fonksiyonlar belgeleri belgeleri 
zor zor anlaşılması anlaşması ve yeniden kullanılması

Desteklenen diller: 45+

Giriş

Geri çağırma işlevleri veya olay işleyicileri olarak aktarılan anonim işlevler, amaçlarını uygulama ayrıntılarının arkasına gizler. Bir .map() veya .filter() okuyucuları, hangi dönüşümün gerçekleştiğini anlamak için mantığın tamamını ayrıntılı olarak incelemek zorunda bırakır. Açıklayıcı isimlere sahip işlevler, amaçlarını hemen ortaya koyar ve karmaşık mantık, uygulamaya dalmadan önce işlev adını okuyarak anlaşılabilir.

Kod örnekleri

❌ Uygun değil:

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ış: Filtre işlevi, isimsiz bir işlevin içine gömülmüş karmaşık iş mantığı (abonelik doğrulaması, kontrol işlemleri) içeriyor. Bu mantık, her satırı okumadan yeniden kullanılamaz, bağımsız olarak test edilemez veya anlaşılamaz. Filtreleme mantığı başarısız olursa, yığın izleri isimsiz işlevleri gösterir.

✅ Uygunluk:

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);
});

Bunun önemi: Karmaşık iş mantığı, test edilebilir işlevlere ayrıştırılır. hasActiveSubscription() ve isVerifiedUser() birim testine tabi tutulabilir ve yeniden kullanılabilir. Yığın izleri işlev adlarını gösterir, bu da hata ayıklamayı hızlandırır. Uç nokta mantığı temiz ve kendi kendini açıklayıcıdır.

Sonuç

2-3 satırdan uzun olan veya tekrar kullanılabilecek herhangi bir mantık için adlandırılmış işlevler kullanın. İşlev adının uygulamanın kendisinden daha uzun olacağı basit işlemler için ise isimsiz işlevleri saklayın. Açıklayıcı işlev adları, satır içi dokümantasyon görevi görür.

Sık Sorulan Sorular

Sorularınız mı var?

Anonim fonksiyonlar ne zaman kabul edilebilir?

Adlandırmanın netlik sağlamadığı basit işlemler için: .map(x => x * 2) veya .filter(item => item.id === targetId). İşlev gövdesi tek bir ifadeyse ve amaç açıkça anlaşılıyorsa, isimsiz işlevler kullanılabilir. Mantık birden fazla satıra yayıldığında veya karmaşık hale geldiğinde, bunları adlandırılmış işlevlere ayırın.

Peki ya ok işlevleri ile işlev tanımlamaları arasındaki fark nedir?

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 tekrarlanan kod oluşturmaz mı?

Bu yöntem, birkaç satır daha kod yazmayı gerektirse de, kodun anlaşılması ve hata ayıklama süreçlerinde önemli ölçüde zaman tasarrufu sağlar. İşlevlere isim vermenin getirdiği ek yük, okunabilirlik, test edilebilirlik ve hata ayıklama kolaylığındaki artışla karşılaştırıldığında çok daha azdır. Doğru isimlendirilmiş işlevler kendi kendilerini açıklar ve açıklama ihtiyacını azaltır.

Eski kodlarda anonim işlevleri nasıl ele almalıyım?

Normal bakım çalışmaları sırasında büyük anonim işlevleri aşamalı olarak ayırın. Karmaşık anonim işlevler içeren kodda hataları giderirken veya yeni özellikler eklerken, bu işlevleri yapılan değişikliğin bir parçası olarak ayırın. İşlevleri otomatik olarak ayırmak ve adlandırmak için IDE’nin yeniden yapılandırma araçlarını kullanın.

Peki ya hemen çalıştırılan işlev ifadeleri (IIFE'ler)?

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.