Nói một cách đơn giản, các hạn chế có nghĩa là có ít cách chính xác hơn để đặt mọi thứ lại với nhau và các hàm hạng nhất giúp dễ dàng xác định những thứ như cấu trúc vòng lặp. Lấy vòng lặp từ câu trả lời này , ví dụ:
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String string = iterator.next();
if (string.isEmpty()) {
iterator.remove();
}
}
Đây có thể là một cách bắt buộc an toàn trong Java để loại bỏ một phần tử khỏi bộ sưu tập trong khi bạn đang lặp qua nó. Có rất nhiều cách nhìn rất gần, nhưng đều sai. Mọi người không biết về phương pháp này đôi khi trải qua các cách phức tạp để tránh vấn đề, như lặp đi lặp lại qua một bản sao.
Việc tạo ra cái chung này không quá khó, vì vậy nó sẽ hoạt động trên nhiều bộ sưu tập Strings
, nhưng không có chức năng hạng nhất, bạn không thể thay thế vị ngữ (điều kiện bên trong if
), vì vậy mã này có xu hướng bị sao chép và dán và sửa đổi một chút.
Kết hợp các hàm hạng nhất cung cấp cho bạn khả năng truyền vị ngữ làm tham số, với việc hạn chế tính không thay đổi sẽ gây khó chịu nếu bạn không và bạn đưa ra các khối xây dựng đơn giản filter
như trong mã Scala này điều đó cũng làm điều tương tự:
list filter (!_.isEmpty)
Bây giờ hãy nghĩ về những gì hệ thống loại kiểm tra cho bạn, tại thời điểm biên dịch trong trường hợp của Scala, nhưng những kiểm tra này cũng được thực hiện bởi các hệ thống loại động trong lần đầu tiên bạn chạy nó:
list
phải là một số loại hỗ trợ filter
phương thức, cụ thể là một bộ sưu tập.
- Các phần tử của
list
phải có một isEmpty
phương thức trả về boolean.
- Đầu ra sẽ là một bộ sưu tập nhỏ hơn (có khả năng) với cùng loại phần tử.
Một khi những điều đó đã được kiểm tra, những cách khác còn lại để lập trình viên có thể làm hỏng? Tôi vô tình quên mất !
, điều này gây ra một trường hợp thử nghiệm cực kỳ rõ ràng. Đó là khá nhiều lỗi duy nhất có sẵn và tôi chỉ mắc lỗi vì tôi đang dịch trực tiếp từ mã đã kiểm tra điều kiện nghịch đảo.
Mô hình này được lặp đi lặp lại nhiều lần. Các chức năng hạng nhất cho phép bạn cấu trúc lại mọi thứ thành các tiện ích nhỏ có thể tái sử dụng với ngữ nghĩa chính xác, các hạn chế như tính bất biến cung cấp cho bạn động lực để thực hiện và nhập kiểm tra các tham số của các tiện ích đó để lại rất ít chỗ trống.
Tất nhiên, tất cả phụ thuộc vào lập trình viên biết rằng chức năng đơn giản hóa như filter
đã tồn tại và có thể tìm thấy nó, hoặc nhận ra lợi ích của việc tự tạo một cái. Cố gắng tự thực hiện điều này ở mọi nơi chỉ bằng cách sử dụng đệ quy đuôi và bạn quay lại cùng một chiếc thuyền phức tạp như phiên bản bắt buộc, chỉ tệ hơn. Chỉ vì bạn có thể viết nó rất đơn giản, không có nghĩa là phiên bản đơn giản là hiển nhiên.