Bunu yapmak için bir terim var mı: func1 (func2 (), func3 ());


24

Bunun obj.func1().func2()yöntem zincirleme olduğunu biliyorum , ancak bunun için teknik terim:

func1(func2(), func3());

Bir fonksiyonun geri döndüğü yerde başka bir argüman olarak kullanılır.


8
obj.func1().func2() is called method chaining- Düzeltme: Buna tren kazası denir.
Yam Marcovic

Her obj.func1()zaman üye işlevi olan bir nesneyi döndürdüğünden kesinlikle emin değilseniz, bu çok, çok, çok aldatıcı geliyor func2().
Shadur

8
@Yam Açıklamak ister misiniz? Diğerlerinin yanı sıra, akıcı arayüzlerde büyük kazanç sağlamak için kullanılır. Demeter Yasasını mı kastediyorsunuz? Eğer öyleyse, bu yukarıdaki kalıbı yasaklamıyor ve hatta yaptığı durumlarda LoD'ye karşı iyi bir dava var.
Konrad Rudolph

1
yöntem zincirlemesi, sözdizimsel şekerli bir rafta uzanır, üzerinde titremeye gerek yoktur.
İstanköy

1
@ PauliØsterø Yığın izlemenin ne demek olduğunu düşündüm.
Chris C,

Yanıtlar:


38

Fonksiyon bileşimi olduğunu sanmıyorum. İşlev bileşimi, iki veya daha fazla işlevi alıp bunları f . g . hHaskell'deki gibi yeni bir işleve dönüştürmek anlamına gelir . Bu noktada hiçbir işlev çağrılmadığını unutmayın.

Şahsen, func1(func2(), func3())"iç içe işlev çağrıları" gibi yapılara değineceğim .


+1, gördüğüm tüm programlama bağlamlarında "iç içe işlev çağrıları" olarak adlandırılır.
Izkata

1
+1, bu "işlev kompozisyonu" olarak adlandırılıyor aldatıcı bir şekilde yanlıştır.
Gian

+1. Tüm f(g())yapmak, f()ilk argüman için bir ifade ile çağırmaktır ve işlev çağrısı g()bir ifade olarak nitelendirilir. Ama bunun için bir isim olması gerekiyorsa, bu onun kadar yakın.
Blrfl

16

Matematikte buna fonksiyon kompozisyonu denir . Yine de programlamaya uygulanan terimi duyduğumu sanmıyorum. Bunun nedeni kullanımın birkaç nedenden dolayı büyük ölçüde kaçınılması olabilir. İşlevlerin yan etkileri olduğunda, derleyicilerin func2'den önce func3'ü değerlendirmekte özgür olmasından dolayı garip hatalar ortaya çıkarabilir. Hata ayıklamak daha zordur, çünkü kesme noktalarını ayarlayamaz veya ara sonuçları yazdıramazsınız ve çoğu insan sadece okumayı zor buluyor.


4
İşlevsel programlamada da kompozisyon denir.
Chuck

8
Ben "büyük ölçüde kaçınıldığını" sanmıyorum. IMO printf("%d %d\n", strlen(a), strlen(b));, aracı değişkenler kullanmak yerine, kod yazmak nadir değildir .
user281377

3
İşlevlerin yan etkileri olduğunda garip hataların çözümünün bundan kaçınmak yerine, değer üreten ve yan etkileri olan işlevlerden kaçınmak olduğunu düşünüyorum. Benzer şekilde, hata ayıklayıcılarla ilgili olarak çözüm, hata ayıklayıcının çalışmasını sağlamak için kodunuzu değiştirmeye zorlamayan daha iyi bir hata ayıklayıcı istemek olmalıdır.
R. Martinho Fernandes

7
Derleyicinin func3'ü func2'den önce func3'ü değerlendirmede serbest bırakması tamamen kullanılan dile bağlıdır. Örneğin, Java’da değerlendirme sırası kesinlikle belirtilmiştir. Aslında bunun çoğu dil için geçerli olduğundan şüpheleniyorum.
Michael Borgwardt

2
Matematikte "işlev bileşimi" terimi aslında sadece tek bir argüman işlevine uygulanır, burada formun bir yapısına işaret eder func1(func2(func3(x))). Ya da teknik olarak, bu ifade eder fonksiyonları ise: kendilerini g(x) = f1(f2(f3(x)))daha sonra, g( değil g(x) ) bileşimi f1, f2ve f3. "İşlev kompozisyonu" sorusundaki yapıyı nasıl adlandırabileceğinizi bir şekilde görebildiğim halde, matematiksel anlamda terimin alışılmadık bir kullanımı olarak beni etkiliyor.
David Z,

2

@Karl Bielefeldt'in işaret ettiği gibi, Matematik'te fonksiyon kompozisyonu olarak adlandırılır.

Programlamada bunun için teknik bir terim YOKTUR. Ve bence bu iyi bir şey çünkü operasyonun normal ve dikgen olduğunu gösteriyor .

Programlama dillerinde ortogonalite, bağlamından bağımsız olarak bir talimat / işlem kullanabileceğiniz anlamına gelir . Örneğin, bir işlev / yöntemi aşağıdaki yollardan tümü ile çağırabilirsiniz ve aynı şekilde davranır ...

f1()(f2(), f3());

x = y + f4();

if ( f5() && !f6() ) doSomething();

f7() = f8() + f9(); // in C++ when a function returns a reference

x = f10() ? f11(f12(f13(x))) : f14();

Wikipedia'da Programcılıkta Ortogonallik hakkında daha fazla bilgi edinebilirsiniz ve bu konuda StackOverflow hakkında bir soru var .


Diklik göstergesi değil, buna bağlı olarak.
Raffael

+1 sadece değerleri
geçiyorsunuz, OP'in

1

Gerçekten terimlerle o kadar iyi değilim, ancak birkaç gün önce Yüksek dereceli fonksiyonlar terimiyle ilgili bir makale okudum ve işte Vikipedi tanımının bir özeti:

http://en.wikipedia.org/wiki/Higher-order_function

Matematik ve bilgisayar bilimlerinde, üst düzey fonksiyonlar, fonksiyonel formlar veya fonksiyoneller aşağıdakilerden en az birini yapan fonksiyonlardır:

  • giriş olarak bir veya daha fazla fonksiyon almak
  • işlev çıkarmak

Diğer tüm fonksiyonlar birinci dereceden fonksiyonlardır. Matematikte yüksek dereceli fonksiyonlar, operatörler veya fonksiyoneller olarak da bilinir. Analizde türev ortak bir örnektir, çünkü başka bir fonksiyona bir fonksiyon eşler.

Bu durumda, bu senaryo bir girdi / param olarak en az bir işlevi üstlendiğinden, daha yüksek dereceli bir işlev olarak kabul edilir, inanıyorum.


1
Hayır, daha yüksek bir sipariş işlevini çağırmak gibi gözükecektir func1(func2, func3). Eksik parantezi not alın.
fredoverflow

Bu Fred'i mantıklı kılar. biri bir işlevin adresi, diğeri ise bu işlevin yerine getirilmesinin sonucu. Gösterdiğin için teşekkürler.
silverCORE
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.