có một thuật ngữ để làm điều này: func1 (func2 (), func3 ());


24

Tôi biết điều đó obj.func1().func2()được gọi là phương pháp chuỗi, nhưng thuật ngữ kỹ thuật cho:

func1(func2(), func3());

Trường hợp trả về của hàm được sử dụng làm đối số cho hàm khác.


8
obj.func1().func2() is called method chaining- Sửa chữa: Nó được gọi là một con tàu đắm.
Yam Marcovic

Điều đó nghe có vẻ rất, rất, rất khó khăn trừ khi bạn hoàn toàn chắc chắn rằng obj.func1()luôn trả về một đối tượng có func2()chức năng thành viên.
Shadur

8
@Yam Quan tâm giải thích? Nó được sử dụng cho lợi nhuận lớn trong các giao diện trôi chảy, trong số những người khác. Bạn đang đề cập đến Luật Demeter? Nếu vậy, điều này không cấm mô hình trên và ngay cả trong trường hợp nó xảy ra trường hợp tốt đối với LoD.
Konrad Rudolph

1
phương pháp xích nằm trên một kệ với đường cú pháp, không cần phải làm ầm ĩ lên nó.
Kos

1
@ PauliØsterø Tôi nghĩ đó là ý nghĩa của stack stack.
Chris C

Câu trả lời:


38

Tôi không nghĩ đó là thành phần chức năng. Thành phần chức năng có nghĩa là lấy hai hoặc nhiều chức năng và biến chúng thành một chức năng mới, như f . g . htrong Haskell. Lưu ý rằng không có chức năng được gọi tại thời điểm này.

Cá nhân, tôi sẽ đề cập đến các cấu trúc như func1(func2(), func3())"các hàm gọi lồng nhau".


+1, nó được gọi là "các hàm gọi lồng nhau" trong tất cả các bối cảnh lập trình mà tôi đã thấy.
Izkata

1
+1, gọi đây là "thành phần chức năng" là sai lầm.
Gian

+1. Tất cả f(g())đang làm là gọi f()với một biểu thức cho đối số đầu tiên và do đó, lệnh gọi hàm g()đủ điều kiện là một biểu thức. Nhưng nếu phải có một cái tên cho nó, thì nó cũng gần như vậy.
Blrfl

16

Trong toán học, nó được gọi là thành phần chức năng . Tuy nhiên, tôi không nghĩ rằng tôi đã nghe thuật ngữ được áp dụng cho lập trình. Đó có thể là do việc sử dụng phần lớn được tránh vì một vài lý do. Nó có thể đưa ra các lỗi lạ khi các chức năng có tác dụng phụ, do trình biên dịch được tự do đánh giá func3 trước func2. Khó gỡ lỗi hơn vì bạn không thể đặt điểm dừng hoặc in kết quả trung gian và hầu hết mọi người chỉ đơn giản là khó đọc hơn.


4
Nó được gọi là thành phần trong lập trình chức năng là tốt.
Chuck

8
Tôi không nghĩ đó là "phần lớn tránh". IMO không có gì lạ khi viết mã như printf("%d %d\n", strlen(a), strlen(b));thay vì sử dụng các biến trung gian.
user281377

3
Tôi nghĩ rằng giải pháp cho các lỗi lạ khi các chức năng có tác dụng phụ không phải là để tránh điều này, mà thay vào đó là để tránh việc viết các hàm tạo ra giá trị và có tác dụng phụ. Tương tự, liên quan đến trình gỡ lỗi, giải pháp nên yêu cầu trình gỡ lỗi tốt hơn, một giải pháp không bắt buộc bạn phải thay đổi mã của mình để làm cho trình gỡ lỗi hoạt động.
R. Martinho Fernandes

7
Trình biên dịch có tự do đánh giá func3 trước func2 hay không phụ thuộc hoàn toàn vào ngôn ngữ được sử dụng. Trong Java, ví dụ, thứ tự đánh giá được quy định chặt chẽ. Tôi thực sự nghi ngờ rằng đây là trường hợp của hầu hết các ngôn ngữ.
Michael Borgwardt

2
Thuật ngữ "thành phần hàm" trong toán học thực sự chỉ áp dụng cho các hàm đối số đơn, trong đó nó dùng để chỉ một cấu trúc của biểu mẫu func1(func2(func3(x))). Hoặc về mặt kỹ thuật, nó đề cập đến chức năng tự: nếu g(x) = f1(f2(f3(x))), sau đó g( không g(x) ) là các thành phần của f1, f2f3. Trong khi tôi có thể thấy một cách mà bạn có thể gọi cấu trúc trong câu hỏi là "thành phần chức năng", nó đánh vào tôi như một cách sử dụng rất bất thường của thuật ngữ này, theo nghĩa toán học.
David Z

2

Như @Karl Bielefeldt chỉ ra, nó được gọi là thành phần hàm trong Toán học.

KHÔNG có thuật ngữ kỹ thuật cho điều này trong lập trình. Và tôi nghĩ rằng đây là một điều tốt, bởi vì nó chỉ ra rằng hoạt động là bình thường và trực giao .

Tính trực giao trong các ngôn ngữ lập trình có nghĩa là bạn có thể sử dụng một lệnh / thao tác độc lập với ngữ cảnh của nó . Ví dụ: bạn có thể gọi một hàm / phương thức theo tất cả các cách sau và nó sẽ hoạt động giống như ...

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

Bạn có thể đọc thêm về Tính trực giao trong Lập trình trên Wikipedia và có một câu hỏi về StackOverflow về vấn đề này.


Nó không chỉ ra tính trực giao mà phụ thuộc vào điều đó.
Raffael

+1 bạn chỉ truyền các giá trị, không có phép thuật nào trong cuộc gọi của OP
vemv

1

Tôi thực sự không tốt với các điều khoản, nhưng tôi mới đọc một bài viết vài ngày trước có đề cập đến thuật ngữ Hàm bậc cao hơn và đây là một bản tóm tắt về định nghĩa trên Wikipedia:

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

Trong toán học và khoa học máy tính, các hàm bậc cao hơn, các dạng hàm hoặc hàm là các hàm thực hiện ít nhất một trong các cách sau:

  • lấy một hoặc nhiều chức năng làm đầu vào
  • xuất một hàm

Tất cả các chức năng khác là chức năng đầu tiên. Trong toán học, các hàm bậc cao hơn còn được gọi là toán tử hoặc hàm. Đạo hàm trong phép tính là một ví dụ phổ biến, vì nó ánh xạ một hàm sang một hàm khác.

Vì vậy, trong trường hợp này, vì kịch bản đó có ít nhất một hàm làm đầu vào / param, nên tôi tin rằng nó sẽ được coi là hàm bậc cao hơn.


1
Không, gọi một hàm bậc cao hơn sẽ như thế nào func1(func2, func3). Lưu ý dấu ngoặc đơn vắng mặt.
dòng chảy

Điều đó có ý nghĩa với Fred. địa chỉ của một chức năng và kết quả của việc thực hiện chức năng đó là một địa chỉ. Cảm ơn đã chỉ ra rằng.
silverCORE
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.