2010-05-07 53 views
22

Phương pháp sau có phải là Pure? Tôi sẽ nói như vậy, vì nó không thay đổi trong lớp học hiện tại, do đó, tất cả mọi thứ chúng ta bây giờ có thể "nhìn thấy" trong lớp, trước khi chạy phương pháp này sẽ vẫn chính xác như sau. Tôi có đúng không?Câu hỏi về phương pháp [Tinh khiết]

class Set { 
    ... 
    public ISet<T> UnionWith(ISet<T> set) { 
     ISet<T> unionSet = ... 

     foreach (Element element in this) { 
      unionSet.Add(element); 
     } 

     foreach (Element element in set) { 
      unionSet.Add(element); 
     } 

     return unionSet; 
    } 
} 
+0

Có lẽ bạn đang tìm cụm từ * idempotent *? –

+0

Hmmm ... không thực sự. –

+0

Lưu ý rằng (khái niệm) điều quan trọng là phải xem xét mức độ trừu tượng của bạn khi suy nghĩ nếu một hàm là thuần khiết. Nó thực sự thuần khiết đối tượng, bởi vì nó không thay đổi trạng thái của bất kỳ đối tượng hiện tại nào (trừ cái mới), nhưng nó không thuần khiết hệ thống - nó phân bổ bộ nhớ, vì vậy nó thay đổi trạng thái của hệ thống. – Kos

Trả lời

31

Nếu bởi [Pure] bạn có nghĩa là dán nhãn với các thuộc tính Pure từ System.Diagnostics.Contracts, tài liệu nói:

phương pháp tinh khiết không thực hiện bất kỳ thay đổi trạng thái nhìn thấy được.

Vì phương pháp của bạn dường như không thực hiện bất kỳ thay đổi trạng thái hiển thị nào (ví dụ: không có tác dụng phụ), nó sẽ đủ điều kiện cho thuộc tính [Pure].

+1

Có định nghĩa nào về "thuần túy" mà phương pháp của anh ta không phù hợp không? Cho đến nay tôi có thể thấy, nó thuần túy về mặt toán học - nó sẽ luôn tạo ra cùng một đầu ra cho cùng một đầu vào ('this' đếm làm đầu vào), và nó sẽ không thay đổi trạng thái của hệ thống tổng thể theo bất kỳ cách nào. –

+1

Pavel: Một số định nghĩa về "thuần túy" yêu cầu đầu vào không thay đổi. Hãy xem xét một hàm bao bọc mà ghi nhớ một hàm đầu vào nếu nó là thuần túy. Nếu Set có thể thay đổi mà không có wrapper biết về nó, bạn có thể nói rằng UnionWith không phải là "đủ tinh khiết" để ghi nhớ với một wrapper. – Gabe

+0

Có ngay trong lúc tôi đưa ra câu hỏi một số câu trả lời cho biết nó không phải là, bằng cách sử dụng một định nghĩa thuần túy khác với các Hợp đồng Mã của C#. Nhưng tác giả của nó sau đó đã xóa nó. Ý tưởng là nếu vào các thời điểm khác nhau, bạn vượt qua cùng một ISet cho lớp của tôi, vì các phần tử của lớp của tôi có thể khác ở các thời điểm khác nhau, bạn sẽ nhận được các kết quả đầu ra khác nhau, vì vậy chức năng của bạn không thuần túy. http://en.wikipedia.org/wiki/Pure_function –

Các vấn đề liên quan