Yüksek mertebeden fonksiyonlar için adlandırma kuralı? [kapalı]


15

Üst düzey işlevler için bir adlandırma kuralı var mı? Yani, diğer işlevleri döndüren işlevler.

Javascript'te bir örnek:

function onlyDivisibleBy(div) { // <-- higher order function
  return function (n) {
    return n % div === 0;
  }
}

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

arr.filter(onlyDivisibleBy(3)); // [0, 3, 6, 9]
arr.filter(onlyDivisibleBy(5)); // [0, 5]

Ben yukarıdaki gibi yazmak eğiliminde: yani, invokasyon noktasında okunabilirlik için optimize (Ben tanım noktasında uzakta, ancak "sadece 5 ile bölünebilir öğeleri almak için dizi filtre" gibi yukarıdaki son satırları okudum) kullanıldığı bağlamda, bu işlevin adından ne yaptığını anlamak o kadar kolay değildir.


4
Bu şaşırtıcıdır, her zaman bir başka işlevi argüman olarak kabul eden bir işlev anlamına gelen "yüksek dereceli işlev" terimini anladım. Yanlış olduğunu söylemiyorum, sadece anlayışımızdaki farkı ilginç buluyorum.
Rakam

6
@ İşlevleri döndüren önbellek işlevleri de daha üst düzeydedir. Her ikisini de yapabilirler.
itsbruce

3
@Racheet bu iyi bir nokta ve bu örnekle oldukça ilgili: OP'nin gerçekte uyguladığı şey kısmi bir uygulamadır. İşlevlerin döndürüldüğü birçok (tümü? Emin değilim) kullanım yerine kısmi uygulama olarak görüntülenebilir. @ nickf: Örneğinizi uygulamak için daha temiz bir yol

Yanıtlar:


14

Hayır, bir işlevi döndürdüğünüzü belirtmek için özel bir adlandırma kuralına ihtiyacınız olduğunu düşünmüyorum. İşlevlerin curried olduğu dillerden görebileceğimiz gibi , bir işlev döndürmek temelde birden çok bağımsız değişkeni olan bir işleve sahip olmakla aynıdır. örneğin onlyDivisibleBy(3)(6)ve arasında çok az fark vardır.onlyDivisibleBy(3,6)

Ben adını değiştirecek onlyDivisibleBykadar isDivisibleByben düşünüyorum gerçi isbir yüklemi belirtmek için bir daha yaygın bir yoldur ve onlyDivisibleBy(3)(6)garip dönüş görünüyor true6 açıkça da 2 ile bölünebilir olduğu göz önüne alındığında


5

Güçlü yazılan işlevsel dillerde, fonksiyon imzasından, daha yüksek dereceli bir fonksiyonun ne olduğu ve ne olmadığı açıktır, bu yüzden basitçe gerek yoktur.

Diğer dillerde, böyle bir adlandırma kuralına hiç rastlamadım ve sadece hantal olmayacak birini düşünemiyorum. İsimlendirme işlevlerine daha iyi odaklanmak daha iyi, bu gibi isimleri aşırı yüklemekten daha iyi.


4

Hayır, hiç kullanmamalısınız.

Neden?

Çünkü bu bir tür Macar notasyonu olurdu . Fikir şu ki, üst düzey işlevlere aktarılan işlevler sadece bir tür değişkentir. Bu yüzden onlara böyle davranın.


1
Bunun anlamı, Macar gösteriminin her ne pahasına olursa olsun kaçınılmasıdır? Ben okumanızı öneririz Yanlış Kod Bak yanlış yapma
TehShrike

4
Bunu daha önce okudum ve hala Macarca gösterimin kötü olduğuna inanıyorum :)
Wilbert

@TehShrike Bağlantınız koptu.
corvus_192

1
@ corvus_192, Joel'in blog tasarımında kaybolmuş olmalı! Yeni URL görünüyor joelonsoftware.com/2005/05/11/making-wrong-code-look-wrong
TehShrike
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.