İşlevleri bunu yapmama izin veren dillere yerleştirmeli miyim yoksa bundan kaçınmalıyım?


12

JavaScript, PL / SQL ve diğer bazı dillerde, işlevler iç içe yerleştirilebilir, yani başka bir işlev içinde bildirilebilir. Bu, büyük bir işlevi daha küçük parçalara ayırmak için kullanılabilir, ancak bu parçaları daha büyük işlev bağlamında tutmak.

function doTooMuch() {
    function doSomething () {
       ...
    }
    function doSomethingElse() {
       ...
    }
    function doYetAnotherThing() {
       ...
    }

    // doTooMuch body

    doSomething();
    doSomethingElse();
    doYetAnotherThing();
}

Bazı durumlarda, bu daha küçük işlevler daha büyük işlevin yerel değişkenlerini kullanmadığında, bu kolayca tüm işlevlerin dürüst olmadığı bir sürüme dönüştürülebilir.

function doSomething () {
   ...
}
function doSomethingElse() {
   ...
}
function doYetAnotherThing() {
   ...
}
function doTooMuch() {
    doSomething();
    doSomethingElse();
    doYetAnotherThing();
}

Bu iç içe geçmiş işlevlerin başka hiçbir yerde kullanılmayacağını varsayarsak, onları büyük işlev bağlamında tutmak daha mı iyidir yoksa kötü mü, çünkü büyük işlevi tam olarak yapan şey budur, iyi, büyük mü?

Yanıtlar:


8

Bu bir fikir meselesidir, ancak aslında tasarımınızın gerekli ve kasıtlı bir parçası olmadıkça yuvalama işlevlerinden kaçınırım.

İşlevleri yerleştirdiğinizde, çoğu dilde bir tür mekanik efekt elde edersiniz. En yaygın ve ilginç olan, vücudun içinde kullanılabilen bir değişkenin sözcüksel kapsamını kapatmaktır, ancak diğerleri (örneğin: fonksiyonun görünürlüğü) de zaman zaman ortaya çıkar.

Bunlar genellikle doğru kullanıldıklarında harika araçlardır - ancak karmaşık araçlardır, çünkü koda ilk bakışta yerel veya açık olmayan etkilere neden olabilirler.

Onları kullanmazsanız, birçok kişi kodu okuyacak ve bunu yapan hiçbir şey görmeyecektir - bu yüzden onu kaçırdıklarını varsayacak ve tekrar bakacak, ayrı bir kapsamda değil, neden bu şekilde yaptığınızı anlamaya çalışacaktır.

Ayrıca, gelecekteki programcıların, burada riskleri fark etmeyerek, niyet etmedikleri bir şey üzerinde kasıtlı olarak veya hatta yanlışlıkla kapanma riskini de göze alırsınız.

Son olarak, işlev bildiriminiz ekli işlevin kapsamı dışında adlandırılmış bir işlev bildirirse, bundan kaçının. Bu herkes için süper kafa karıştırıcı.

Son bir not gelince: Bireysel fonksiyonlar yardım sınırlandırmaktadır kodu, yuvalama fonksiyonları tek dev işlevinden daha az zahmetli, ama sonuçta çünkü yapar anlamak için çok daha fazla kod okuma ortalama doTooMuch()- iç içe geçmiş işlev bildirimleri arasındaki kod gizleyebilirsiniz özellikle ya kimsenin yapmadığını kontrol etmeliyim.


-1: Javascript "çoğu dil" değildir. Javascript'te iç içe yerleştirme işlevleri normal bir uygulamadır.
kevin cline

2
JavaScript'teki @kevincline yuvalama işlevleri yaygın bir kötü uygulamadır
Raynos

@Raynos: Eğer onları yuvalamazsan, nereye koyacaksın? Onları içerecek sınıflar yok. İşte bazı tipik kod:jquery(function($){ $('#id').click(function(){...}); }
kevin cline

@kevincline ... Noobs için tipik kod, derin bir yuvalanmış işlevlere ihtiyacınız var. Javascript'in modül kapsamı olmadığından, bu anonim kapatmaya ihtiyacınız vardır.
Raynos

Ve bu tıklama bir tamamlama geri çağırma ile bir Ajax çağrısı yürütürse? Artık iki seviyeye yerleştirilmiş fonksiyonlara sahipsiniz. Elbette, değişkenlere anonim kapaklar atayarak iç içe geçirmeyi sınırlandırabilirsiniz. Gerçekten daha mı iyi?
kevin cline

2

Bu doğru cevabı olmayan sorulardan biridir ve "kişisel tercih", "ekip çalışması" gibi kelimeler akla gelir. Bana göre, hiçbir yerde kullanılmayan küçük işlevler (şimdi burada başka bir öznel şey) ana işlevlerinin içinde, özellikle adsız olduklarında.


0

Bu sorunun doğru cevabı yoktur, çünkü her iki seçim de kapsüllemeyi en üst düzeye çıkarmaz. Onları iç içe yerleştirirseniz, değiştirmemeleri gereken değişkenlere hala erişimleri vardır. Bunu yapmazsanız, diğer işlevler yapmamaları gereken işlevlere erişebilir. Her iki durumda da kaybedersiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.