มีคำสำหรับการทำเช่นนี้: func1 (func2 (), func3 ());


24

ฉันรู้ว่าobj.func1().func2()มันถูกเรียกว่า method chaining แต่อะไรคือคำศัพท์ทางเทคนิคสำหรับ:

func1(func2(), func3());

เมื่อมีการใช้ฟังก์ชัน return เป็นอาร์กิวเมนต์ให้กับฟังก์ชันอื่น


8
obj.func1().func2() is called method chaining- การแก้ไข: มันเรียกว่าซากรถไฟ
Yam Marcovic

ฟังดูดีมากหากคุณไม่แน่ใจว่าobj.func1()จะส่งคืนวัตถุที่มีfunc2()หน้าที่เป็นสมาชิกอยู่เสมอ
Shadur

8
@ มันสนใจที่จะอธิบาย? มันใช้เพื่อผลกำไรที่ยอดเยี่ยมในส่วนต่อประสานที่คล่องแคล่วและอื่น ๆ คุณอ้างถึงกฎหมายของ Demeter หรือไม่? ถ้าเป็นเช่นนั้นสิ่งนี้จะไม่ห้ามรูปแบบข้างต้นและแม้แต่ในกรณีที่มีกรณีที่ดีสำหรับ LoD
Konrad Rudolph

1
การผูกมัดด้วยวิธีการนั้นอยู่บนชั้นหนึ่งที่มีน้ำตาล syntactic ไม่จำเป็นต้องทำเรื่องยุ่งยาก
Kos

1
@ PauliØsterøฉันคิดว่านั่นเป็นสิ่งที่กองติดตามมีไว้สำหรับ
Chris C

คำตอบ:


38

ฉันไม่คิดว่ามันเป็นองค์ประกอบของฟังก์ชั่น องค์ประกอบของฟังก์ชั่นหมายถึงการใช้สองฟังก์ชั่นขึ้นไปและเปลี่ยนเป็นฟังก์ชั่นใหม่เช่นf . g . hใน Haskell โปรดทราบว่าไม่มีการเรียกใช้ฟังก์ชันในตอนนี้

โดยส่วนตัวแล้วฉันจะอ้างถึงโครงสร้างเหมือนfunc1(func2(), func3())"การเรียกใช้ฟังก์ชันที่ซ้อนกัน"


+1 เรียกว่า "การเรียกใช้ฟังก์ชันซ้อน" ในบริบทการเขียนโปรแกรมทั้งหมดที่ฉันเคยเห็น
Izkata

1
+1 การเรียก "การจัดองค์ประกอบของฟังก์ชั่น" นี้ผิดพลาด
เกียน

+1 ทุกf(g())สิ่งที่ทำคือการเรียกf()ด้วยการแสดงออกสำหรับอาร์กิวเมนต์แรกและมันเกิดขึ้นดังนั้นการเรียกใช้ฟังก์ชั่นg()มีคุณสมบัติเป็นนิพจน์ แต่ถ้าจะต้องมีชื่อมันก็จะใกล้เคียงกับที่ได้รับ
Blrfl

16

ในทางคณิตศาสตร์ก็เรียกว่าองค์ประกอบของฟังก์ชั่น ฉันไม่คิดว่าฉันได้ยินคำที่ใช้กับการเขียนโปรแกรม แต่ นั่นอาจเป็นเพราะการหลีกเลี่ยงการใช้งานส่วนใหญ่ด้วยเหตุผลบางประการ มันสามารถแนะนำข้อผิดพลาดแปลก ๆ เมื่อฟังก์ชั่นมีผลข้างเคียงเนื่องจากคอมไพเลอร์มีอิสระในการประเมิน func3 ก่อน func2 การ debug นั้นยากกว่าเพราะคุณไม่สามารถกำหนดจุดพักหรือพิมพ์ผลกลางและคนส่วนใหญ่แค่อ่านยาก


4
มันเรียกว่าองค์ประกอบในการเขียนโปรแกรมการทำงานเช่นกัน
เชย

8
ฉันไม่คิดว่ามัน "หลีกเลี่ยงส่วนใหญ่" IMO ไม่ใช่เรื่องแปลกที่จะเขียนโค้ดเช่นprintf("%d %d\n", strlen(a), strlen(b));แทนที่จะใช้ตัวแปรตัวกลาง
281377

3
ฉันคิดว่าวิธีแก้ไขข้อผิดพลาดแปลก ๆ เมื่อฟังก์ชั่นมีผลข้างเคียงไม่ใช่เพื่อหลีกเลี่ยงสิ่งนี้ แต่แทนที่จะหลีกเลี่ยงการเขียนฟังก์ชั่นที่สร้างคุณค่าและมีผลข้างเคียง ในทำนองเดียวกันเกี่ยวกับ debuggers วิธีแก้ปัญหาควรขอ debugger ที่ดีกว่าซึ่งไม่ได้บังคับให้คุณเปลี่ยนรหัสเพื่อให้โปรแกรมดีบั๊กทำงานได้
R. Martinho Fernandes

7
คอมไพเลอร์สามารถประเมิน func3 ก่อน func2 ได้หรือไม่นั้นขึ้นอยู่กับภาษาที่ใช้ ตัวอย่างเช่นใน Java ลำดับการประเมินผลจะถูกระบุอย่างเคร่งครัด ฉันสงสัยจริงๆว่านี่เป็นกรณีสำหรับภาษาส่วนใหญ่
Michael Borgwardt

2
คำว่า "องค์ประกอบของฟังก์ชั่น" func1(func2(func3(x)))ในวิชาคณิตศาสตร์จริงเพียงนำไปใช้กับฟังก์ชั่นเดียวอาร์กิวเมนต์ที่มันหมายถึงโครงสร้างของรูปแบบ หรือในทางเทคนิคมันหมายถึงฟังก์ชั่นตัวเอง: ถ้าg(x) = f1(f2(f3(x)))แล้วg( ไม่ g(x) ) เป็นองค์ประกอบของf1, และf2 f3ในขณะที่ฉันเห็นวิธีที่คุณสามารถเรียกโครงสร้างในคำถาม "องค์ประกอบของฟังก์ชั่น" มันทำให้ฉันรู้สึกว่าเป็นการใช้คำผิดปกติอย่างมากในแง่คณิตศาสตร์
David Z

2

ในฐานะที่เป็นจุด @Karl Bielefeldt มันเรียกว่าองค์ประกอบฟังก์ชั่นในคณิตศาสตร์

ไม่มีศัพท์เทคนิคสำหรับสิ่งนี้ในการเขียนโปรแกรม และผมคิดว่านี่เป็นสิ่งที่ดีเพราะมันแสดงให้เห็นว่าการดำเนินการเป็นเรื่องปกติและฉาก

Orthogonality ในการเขียนโปรแกรมภาษาวิธีการที่คุณสามารถใช้การเรียนการสอน / การดำเนินงานที่เป็นอิสระจากบริบทของมัน ตัวอย่างเช่นคุณสามารถเรียกใช้ฟังก์ชัน / เมธอดได้ทุกวิธีดังต่อไปนี้และมันจะทำงานเหมือนกัน ...

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

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ Orthogonality ในการเขียนโปรแกรมบนWikipediaและมีคำถามเกี่ยวกับ StackOverflowในเรื่องนี้


มันไม่ได้บ่งบอกถึงความตั้งฉาก แต่ขึ้นอยู่กับว่า
Raffael

+1 คุณเพิ่งผ่านค่าไม่มีความมหัศจรรย์ในการโทรของ OP
vemv

1

ฉันไม่ค่อยดีกับคำศัพท์ แต่ฉันเพิ่งอ่านบทความเมื่อไม่กี่วันก่อนที่อ้างถึงคำสั่งฟังก์ชั่นการสั่งซื้อที่สูงขึ้นและนี่เป็นนามธรรมของคำจำกัดความต่อ Wikipedia:

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

ในคณิตศาสตร์และวิทยาการคอมพิวเตอร์ฟังก์ชันลำดับสูงรูปแบบการทำงานหรือ functionals เป็นฟังก์ชันที่ทำอย่างน้อยหนึ่งอย่างต่อไปนี้:

  • ใช้หนึ่งหรือมากกว่าหนึ่งฟังก์ชั่นเป็นอินพุต
  • ส่งออกฟังก์ชั่น

ฟังก์ชั่นอื่น ๆ ทั้งหมดเป็นฟังก์ชั่นลำดับแรก ในคณิตศาสตร์ฟังก์ชันอันดับสูงยังเป็นที่รู้จักกันในนามตัวดำเนินการหรือฟังก์ชัน อนุพันธ์ในแคลคูลัสเป็นตัวอย่างทั่วไปเนื่องจากจะจับคู่ฟังก์ชันกับฟังก์ชันอื่น

ดังนั้นในกรณีนี้เนื่องจากสถานการณ์นั้นใช้ฟังก์ชันอย่างน้อยหนึ่งฟังก์ชั่นเป็นอินพุต / param ดังนั้นจึงถือว่าเป็นฟังก์ชันลำดับที่สูงกว่าฉันเชื่อ


1
func1(func2, func3)ไม่มีการเรียกฟังก์ชั่นการสั่งซื้อที่สูงขึ้นจะมีลักษณะ หมายเหตุวงเล็บที่ขาด
fredoverflow

นั่นทำให้รู้สึกว่าเฟร็ด ที่อยู่ของฟังก์ชันหนึ่งและอีกหนึ่งผลลัพธ์ของการเรียกใช้ฟังก์ชันนั้น ขอบคุณสำหรับการชี้ให้เห็นว่า
silverCORE
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.