Lợi ích là các hàm thuần làm cho mã của bạn dễ dàng lý luận hơn. Hay nói cách khác, tác dụng phụ làm tăng độ phức tạp của mã của bạn.
Lấy một ví dụ về computeProductPrice
phương pháp.
Một phương thức thuần túy sẽ hỏi bạn về số lượng sản phẩm, một loại tiền tệ, v.v. Bạn biết rằng bất cứ khi nào phương thức được gọi với cùng một đối số, nó sẽ luôn tạo ra kết quả tương tự.
- Bạn thậm chí có thể lưu trữ nó và sử dụng phiên bản lưu trữ.
- Bạn có thể làm cho nó lười biếng và hoãn cuộc gọi của nó khi bạn thực sự cần nó, biết rằng giá trị sẽ không thay đổi trong khi đó.
- Bạn có thể gọi phương thức nhiều lần, biết rằng nó sẽ không có tác dụng phụ.
- Bạn có thể suy luận về chính phương thức này trong sự cô lập với thế giới, biết rằng tất cả những gì nó cần là các đối số.
Một phương thức không thuần túy sẽ phức tạp hơn để sử dụng và gỡ lỗi. Vì nó phụ thuộc vào trạng thái của các biến khác với các đối số và có thể thay đổi chúng, điều đó có nghĩa là nó có thể tạo ra các kết quả khác nhau khi được gọi nhiều lần hoặc không có cùng một hành vi khi không được gọi hoặc quá sớm hoặc quá muộn.
Thí dụ
Hãy tưởng tượng có một phương thức trong khung phân tích một số:
decimal math.parse(string t)
Nó không có tính minh bạch tham chiếu, bởi vì nó phụ thuộc vào:
Biến môi trường chỉ định hệ thống đánh số, đó là Cơ sở 10 hoặc một cái gì đó khác.
Biến trong math
thư viện chỉ định độ chính xác của các số cần phân tích. Vì vậy, với giá trị của 1
, phân tích chuỗi "12.3456"
sẽ cung cấp 12.3
.
Văn hóa, trong đó xác định định dạng dự kiến. Ví dụ, với fr-FR
, phân tích cú pháp "12.345"
sẽ cung cấp 12345
, bởi vì ký tự phân tách nên ,
, không phải.
Hãy tưởng tượng sẽ dễ dàng hay khó khăn như thế nào khi làm việc với phương pháp như vậy. Với cùng một đầu vào, bạn có thể có các kết quả hoàn toàn khác nhau tùy thuộc vào thời điểm bạn gọi phương thức, bởi vì một cái gì đó, ở đâu đó đã thay đổi biến môi trường hoặc chuyển văn hóa hoặc đặt độ chính xác khác. Đặc tính không xác định của phương pháp sẽ dẫn đến nhiều lỗi hơn và ác mộng gỡ lỗi nhiều hơn. Gọi math.parse("12345")
và nhận 5349
như một câu trả lời vì một số mã song song đang phân tích số bát phân không tốt.
Làm thế nào để khắc phục phương pháp rõ ràng bị hỏng này? Bằng cách giới thiệu minh bạch tham chiếu. Nói cách khác, bằng cách loại bỏ trạng thái toàn cầu và di chuyển mọi thứ đến các tham số của phương thức:
decimal math.parse(string t, base=10, precision=20, culture=cultures.en_us)
Bây giờ phương thức này là thuần túy, bạn biết rằng bất kể khi bạn gọi phương thức, nó sẽ luôn tạo ra kết quả tương tự cho cùng một đối số.