Câu trả lời:
Wikipedia có một bài viết tuyệt vời về Lập trình chức năng với một số ví dụ bạn yêu cầu. @Konrad Rudolph đã cung cấp liên kết đến bài viết OOP .
Tôi không nghĩ một mô hình là một siêu tập hợp khác. Chúng là những quan điểm khác nhau về lập trình và một số vấn đề được giải quyết tốt hơn từ góc độ này và một số từ góc độ khác.
Câu hỏi của bạn phức tạp hơn bởi tất cả các triển khai của FP và OOP. Mỗi ngôn ngữ có những câu hỏi riêng có liên quan đến bất kỳ câu trả lời hay nào cho câu hỏi của bạn.
Tăng dần tiếp tuyến:
Tôi thích ý tưởng rằng một ngôn ngữ như Scala cố gắng cung cấp cho bạn những điều tốt nhất của cả hai thế giới. Tôi lo lắng rằng nó cũng mang lại cho bạn sự phức tạp của cả hai thế giới.
Java là ngôn ngữ OO, nhưng phiên bản 7 đã thêm tính năng "dùng thử với tài nguyên" có thể được sử dụng để bắt chước một kiểu đóng. Ở đây, nó bắt chước cập nhật một biến cục bộ "a" ở giữa một hàm khác, mà không làm cho nó hiển thị cho hàm đó. Trong trường hợp này, nửa đầu của hàm khác là hàm tạo ClosTry () và nửa sau là phương thức close ().
public class ClosureTry implements AutoCloseable {
public static void main(String[] args) {
int a = 1;
try(ClosureTry ct = new ClosureTry()) {
System.out.println("Middle Stuff...");
a = 2;
}
System.out.println("a: " + a);
}
public ClosureTry() {
System.out.println("Start Stuff Goes Here...");
}
/** Interface throws exception, but we don't have to. */
public void close() {
System.out.println("End Stuff Goes Here...");
}
}
Đầu ra:
Start Stuff Goes Here...
Middle Stuff...
End Stuff Goes Here...
a: 2
Điều này có thể hữu ích cho mục đích dự định của nó là mở một luồng, ghi vào luồng và đóng nó một cách đáng tin cậy hoặc chỉ đơn giản là ghép hai hàm theo cách mà bạn không quên gọi hàm thứ hai sau khi thực hiện một số công việc giữa chúng . Tất nhiên, nó mới và khác thường đến nỗi một lập trình viên khác có thể loại bỏ khối thử mà không nhận ra họ đang phá vỡ thứ gì đó, vì vậy hiện tại nó là một kiểu chống mẫu, nhưng thú vị là nó có thể được thực hiện.
Bạn có thể diễn đạt bất kỳ vòng lặp nào trong hầu hết các ngôn ngữ bắt buộc dưới dạng đệ quy. Đối tượng và các biến có thể được thực hiện bất biến. Việc kiểm tra có thể được viết để giảm thiểu tác dụng phụ (mặc dù tôi cho rằng chức năng thực sự là không thể thực hiện được trên máy tính - thời gian cần thiết để thực thi và tài nguyên bộ xử lý / đĩa / hệ thống mà nó tiêu thụ là tác dụng phụ không thể tránh khỏi). Một số ngôn ngữ chức năng có thể được thực hiện để làm nhiều nếu không phải tất cả các hoạt động hướng đối tượng là tốt. Chúng không phải loại trừ lẫn nhau, mặc dù một số ngôn ngữ có những hạn chế (như không cho phép bất kỳ cập nhật biến nào) ngăn các mẫu nhất định (như các trường có thể thay đổi).
Đối với tôi, phần hữu ích nhất của lập trình hướng đối tượng là ẩn dữ liệu (đóng gói), coi các đối tượng đủ tương tự như nhau (đa hình) và thu thập dữ liệu và phương thức của bạn hoạt động trên dữ liệu đó cùng nhau (đối tượng / lớp). Kế thừa có thể là lá cờ đầu của OOP, nhưng với tôi nó là phần ít quan trọng nhất và ít được sử dụng nhất.
Các phần hữu ích nhất của lập trình chức năng là tính bất biến (mã thông báo / giá trị thay vì biến), hàm (không có tác dụng phụ) và đóng.
Tôi không nghĩ nó hướng đối tượng, nhưng tôi phải nói rằng một trong những điều hữu ích nhất trong khoa học máy tính là khả năng khai báo một giao diện, sau đó có nhiều phần chức năng và dữ liệu thực hiện giao diện đó. Tôi cũng muốn có một vài dữ liệu có thể thay đổi để làm việc, vì vậy tôi đoán rằng tôi không hoàn toàn thoải mái với các ngôn ngữ chức năng độc quyền, mặc dù tôi cố gắng hạn chế khả năng biến đổi và tác dụng phụ trong tất cả các thiết kế chương trình của mình.