Hãy xem xét ví dụ sau đây, nơi một Listis có thể thay đổi được sử dụng để giữ một khách hàng
đơn đặt hàng:
public class Customer {
// Không có phương pháp setter
Danh sách thức tinđơn đặt hàng;
Danh sách cônggetOrders () {lệnh return; }
khách hàng nào (...) {...}
}
Đó là hợp lý rằng khách hàng của Customerwill muốn xem danh sách các đơn đặt hàng. Thật không may, bằng cách phơi bày danh sách thông qua các phương thức getter, getOrders, chúng tôi đã mất quyền kiểm soát
hơn họ! Một khách hàng có thể sửa đổi danh sách không có kiến thức của chúng tôi. Chúng tôi không cung cấp một
setter cho ordersand nó được tuyên bố chính thức, nhưng những bảo vệ chỉ ngăn chặn gán
một danh sách mới để các đơn đặt hàng. Danh sách chính nó vẫn có thể được sửa đổi.
Chúng tôi có thể làm việc xung quanh vấn đề này bằng cách có getOrdersreturn một bản sao của danh sách hoặc
bằng cách thêm các phương pháp accessor đặc biệt để khách hàng mà cung cấp kiểm soát quyền truy cập vào
các đơn đặt hàng. Tuy nhiên, sao chép danh sách là đắt tiền, đặc biệt là đối với các danh sách lớn. Thêm quảng cáo-hoc
phương pháp accessor tăng sự phức tạp của các đối tượng, các gánh nặng thử nghiệm, và những
nỗ lực cần thiết của các lập trình viên khác để hiểu và sử dụng các lớp học.
Tuy nhiên, nếu danh sách các đơn đặt hàng là không thay đổi và các yếu tố danh sách là không thay đổi, những
lo lắng không có đi. Khách hàng có thể gọi phương thức getter để đọc các đơn đặt hàng, nhưng họ không thể
thay đổi đơn đặt hàng, vì vậy chúng tôi giữ lại quyền kiểm soát trạng thái của đối tượng.
Điều gì xảy ra khi danh sách các đơn đặt hàng được cho là thay đổi, nhưng nó đã trở thành khổng lồ?
Nên chúng ta trở nên dịu dàng và làm cho nó có thể thay đổi để tránh việc tạo bản sao lớn?
May mắn thay, chúng ta có một cách hiệu quả để sao chép các cấu trúc dữ liệu lớn; chúng tôi sẽ sử dụng lại những phần
đó không thay đổi! Khi chúng tôi thêm một trật tự mới vào danh sách các đơn đặt hàng, chúng tôi có thể sử dụng lại các
phần còn lại của danh sách. Chúng tôi sẽ tìm hiểu làm thế nào trong Chương 3.
Một số đột biến là không thể tránh khỏi. Tất cả các chương trình phải làm IO. Nếu không, họ có thể làm
gì, nhưng nóng lên CPU, như một trò đùa đi. Tuy nhiên, lập trình chức năng khuyến khích chúng ta suy nghĩ chiến lược về khi nào và ở đâu đột biến là cần thiết. Nếu chúng ta
đóng gói các đột biến ở các khu vực được xác định rõ và giữ phần còn lại của mã miễn phí của đột biến, chúng ta cải thiện sự vững mạnh và mô đun mã của chúng tôi.
Chúng tôi vẫn cần phải xử lý đột biến một cách thread-safe. Phần mềm giao dịch Memory
và các diễn viên mô hình cho chúng ta an toàn này. Chúng ta sẽ khám phá cả trong Chương 4.
Hãy đối tượng của bạn không thay đổi. Khai báo các lĩnh vực thức. Chỉ cung cấp thu khí
cho các lĩnh vực và sau đó chỉ khi cần thiết. Hãy cẩn thận rằng thức có thể thay đổi
đối tượng vẫn có thể được sửa đổi. Sử dụng các bộ sưu tập có thể thay đổi một cách cẩn thận. Xem
"Minimize đột biến" trong [Bloch2008] cho thêm lời khuyên.
đang được dịch, vui lòng đợi..