Là một chức năng nhận được một giá trị từ một chức năng khác được coi là thuần túy?


9

Tôi đang cố gắng tìm ra cách xử lý các giá trị biến mặc định khi tạo các hàm không có tác dụng phụ và đã kết thúc bằng các cách sau:

function getDefaultSeparator() {
    return ':';
}

function process(input, separator) {
    var separator = separator || getDefaultSeparator();

    // Use separator in some logic

    return output;
}

Dấu phân cách mặc định sẽ được sử dụng trong các chức năng khác và tôi chỉ muốn xác định nó ở một nơi.

Nếu đây là một hàm thuần túy, sự khác biệt so với việc chỉ sử dụng hằng số DEFAULT_SEPARATOR toàn cầu thay thế là gì?


5
Không có bất kỳ sự khác biệt quan trọng nào, trừ khi bạn dự định sử dụng chức năng như một trình giữ chỗ cho một số logic sẽ được thêm vào sau này.
Robert Harvey

3
Có thể trùng lặp là một hàm ngay lập tức không tinh khiết nếu nó lấy một hàm làm tham số? . Câu hỏi không phải là một bản sao chính xác, nhưng câu trả lời phải giống nhau. ( "Nó phụ thuộc vào độ tinh khiết của hàm khác.")
jpmc26

1
Sử dụng hằng số toàn cầu không làm cho hàm không tinh khiết. Sử dụng một giá trị toàn cầu mà bạn giả sử là không đổi.
chepner 14/03/2016

Btw, bạn có thể cà ri process(với thứ tự tham số đảo ngược) và đặc biệt hơn là chức năng cà ri đểvar processDefault = process(":")
bob

Câu trả lời:


22

Là một chức năng nhận được một giá trị từ một chức năng khác được coi là thuần túy?

Điều đó phụ thuộc vào chức năng khác làm gì và chức năng gọi làm gì. Tạp chất là truyền nhiễm, tinh khiết không.

Gọi một hàm thuần túy không làm thay đổi độ tinh khiết của hàm gọi. Gọi một chức năng không tinh khiết cũng làm cho chức năng gọi không tinh khiết.

Vì vậy, trong ví dụ của bạn, nó phụ thuộc vào độ tinh khiết của phần bạn bỏ đi: nếu đó là thuần túy, thì toàn bộ hàm là thuần túy.

Nếu đây là một hàm thuần túy, sự khác biệt so với việc chỉ sử dụng hằng số DEFAULT_SEPARATOR toàn cầu thay thế là gì?

Không có gì. Một hàm luôn trả về cùng một giá trị không thể phân biệt với hằng số. Trong thực tế, đó chính xác là cách các hằng số được mô hình hóa trong calcul-tính toán.


2
"Gọi một chức năng không tinh khiết tự động làm cho chức năng gọi không trong sạch" Bạn có chắc chắn về điều đó không? AFAICS, gọi một chức năng không tinh khiết không tự động làm cho người gọi không trong sạch, mặc dù thực hiện nó có thể.
Ded repeatator

2
@Ded repeatator: phụ thuộc vào mức độ phân tích tĩnh bạn có thể (bị làm phiền). Chắc chắn, nếu có một hàm funccó tác dụng phụ khi bạn vượt qua 0, nhưng không phải khi bạn vượt qua 1, thì bạn có thể nói một cách hợp lý rằng mặc dù funcchính nó "không trong sạch", một hàm gọi nó là func(1)(và bỏ qua giá trị trả về, hãy nói) không nhất thiết là không tinh khiết. Gọi funclà đủ để "làm mờ" người gọi là có khả năng không trong sạch, nhưng một số chức năng có thể bị vô hiệu hóa bằng một số phương tiện có thể được chứng minh là hoàn toàn. Ít nhất là trong javascript, nơi thuần / không tinh khiết không được xác định trong ngôn ngữ.
Steve Jessop

6

Vâng, đó là cả hai hàm thuần túy (giả sử phần elined cũng là thuần túy) bởi vì:

  1. Kết quả chỉ phụ thuộc vào các tham số.
  2. Không có tác dụng phụ.

Lưu ý rằng nếu getDefaultSeparator()không phải là một hàm thuần túy thì cả hai sẽ không process()thuần.

Trong Javascript, không có sự khác biệt có ý nghĩa giữa việc sử dụng hàm thuần túy hoặc hằng số và cả hai đều có thể được sử dụng bởi hàm thuần túy, miễn là khả năng của Javascript xác định lại các hàm hoặc thay đổi giá trị của hằng số.

Một khái niệm chính đằng sau các hàm thuần túy là chúng có thể được thay thế bằng giá trị mà chúng trả về mà không ảnh hưởng đến kết quả của chương trình.


1

Như những người khác đang nói, chắc chắn, nó vẫn là một chức năng thuần túy.

Tuy nhiên, hãy nói về các vấn đề thiết kế. Bạn có quyền thử làm một cái gì đó để giữ mã DRY, bằng cách đặt giá trị ở một nơi duy nhất. Ngoài ra, điều tôi nghĩ cũng nên được xem xét là mức độ khớp nối phù hợp.

Sử dụng một chức năng cho phép bạn linh hoạt hơn để thay đổi việc thực hiện, điều đó có nghĩa là cách tiếp cận chức năng cung cấp khớp nối lỏng lẻo hơn một biến toàn cục.

Câu hỏi là liệu người ta có cần nó hay không?

Nếu người tiêu dùng và nhà cung cấp ở trong cùng một mô-đun và nhà cung cấp là riêng tư đối với mô-đun, thì khó có thể tranh luận rằng mức độ khớp nối lỏng lẻo này là cần thiết, do thực tế là nếu nhà cung cấp yêu cầu nâng cấp từ một biến riêng tư thành một Phương pháp riêng tư, tái cấu trúc đơn giản trong mô-đun có thể được áp dụng cho người tiêu dùng cùng một lúc. Sử dụng một phương thức / chức năng trước khi bạn thực sự cần có thể thuộc YAGNI.

Ngay cả khi người tiêu dùng và nhà cung cấp ở các mô-đun khác nhau, nhưng các mô-đun được phiên bản cùng nhau (ví dụ: bạn sử dụng một công cụ khai thác để các mô-đun của người tiêu dùng và nhà cung cấp nằm trong cùng một tệp), YAGNI cũng có thể áp dụng.

Mặt khác, ví dụ, nếu nhà sản xuất ở trong thư viện hoặc gói API hoặc mô-đun được phiên bản riêng biệt với (các) người tiêu dùng, thì việc sử dụng chức năng có thể phù hợp. Trong trường hợp đó, chúng ta nên xem xét tuổi thọ của API và các nguyên tắc như OCP.

(Một lưu ý khác, nếu mã của bạn có kích thước đáng kể, tôi sẽ khuyến khích sử dụng các mô-đun với các trường và phương thức thay vì các biến và hàm toàn cục.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.