2015-12-19 26 views
47

phần từ các tài liệu chính thức:Redux: tại sao các hàm trạng thái được gọi là bộ giảm tốc?

Nó được gọi là giảm bởi vì đó là loại chức năng bạn sẽ vượt qua để Array.prototype.reduce (? Giảm tốc, initialValue)

Nó doesn' t có ý nghĩa nhiều đối với tôi. Ai đó có thể giải thích cho tôi lý do tại sao họ thực sự được gọi là reducers? Thực tế là họ trả về một giá trị mặc định (hoặc họ có một giá trị đối số mặc định) không làm cho họ giảm tốc IMHO.

+3

Chúng là các trình giảm tốc chính xác vì chúng hoạt động giống như hàm bạn chuyển sang 'reduce', có quyền truy cập vào giá trị mặc định và giá trị khác và cung cấp cho bạn giá trị mặc định có khả năng được chuyển đổi.'state -> action -> state' – azium

+1

hoa hồng bằng bất kỳ tên nào khác ... có lẽ là tiếp thị; map/reduce là một từ thông dụng bây giờ ... – dandavis

Trả lời

39

Thực tế là chúng trả về giá trị mặc định (hoặc giá trị đối số mặc định là ) không làm cho chúng giảm tốc IMHO.

Hộp số không chỉ trả về giá trị mặc định. Họ luôn luôn trả lại sự tích lũy của nhà nước (dựa trên tất cả các hành động trước đó và hiện hành).

Vì vậy, chúng hoạt động như một bộ giảm của tiểu bang. Mỗi lần một trình giảm tốc Redux được gọi, trạng thái được chuyển vào với hành động (state, action). Trạng thái này sau đó được giảm (hoặc tích lũy) dựa trên hành động, sau đó trạng thái tiếp theo được trả về. Đây là một chu kỳ của chức năng cổ điển fold hoặc reduce.

Khi @azium tổng hợp với state -> action -> state.

+0

Cảm ơn, bây giờ điều đó có ý nghĩa đối với tôi, tôi vừa bị mất một thời gian –

+3

Humm bởi logic này không nên chúng được gọi là người tăng chứ không phải là bộ giảm tốc? Không có dữ liệu bao giờ được giảm của nó đang được thêm vào:/lol –

+6

@JamieHutber Tôi nghĩ rằng bạn hơi bỏ lỡ ý nghĩa của giảm trong bối cảnh này. reducer đang lấy một dòng (hoặc tập hợp) các mục và kết hợp chúng thành một mục duy nhất. Trong trường hợp này, tất cả các hành động (thông qua thời gian) là tập hợp các mục và trạng thái là mục duy nhất. Có lý? –

17

Nếu bạn xem chuỗi hành động trong ứng dụng của mình giống như một danh sách hoặc có thể giống như một luồng, điều đó có thể có ý nghĩa hơn.

Hãy ví dụ contrived này:

['apple', 'banana', 'cherry'].reduce((acc, item) => acc + item.length, 0) 

Đối số đầu tiên là một chức năng của mẫu (Int, String) => Int. Cùng với giá trị ban đầu, bạn vượt qua reduce những gì có thể được gọi là "chức năng giảm tốc" và bạn nhận được kết quả xử lý chuỗi các mục. Vì vậy, bạn có thể nói, chức năng giảm tốc mô tả những gì được thực hiện với từng mục riêng lẻ liên tiếp để thay đổi kết quả. Nói cách khác, hàm reducer lấy đầu ra trước đó và giá trị tiếp theo, và nó tính toán đầu ra tiếp theo.

Điều này tương tự với trình giảm tốc Redux làm gì: nó lấy trạng thái trước đó và hành động hiện tại, và nó tính trạng thái tiếp theo.

Trong phong cách lập trình chức năng thực sự, bạn có thể xóa ý nghĩa áp dụng cho các đối số và kết quả, và chỉ tập trung vào "hình dạng" của đầu vào và đầu ra. Trong thực tế, Redux reducers thường trực giao, theo nghĩa là đối với một hành động nhất định, chúng không làm thay đổi cùng thuộc tính, giúp dễ dàng phân chia trách nhiệm của chúng và tổng hợp đầu ra với combineReducers.

+0

Có, bạn nói đúng, có ý nghĩa hơn khi tôi đang nghĩ về các hành động giống như về một luồng. Cool, apretiate rằng! –

+0

Đây là cách ban đầu tôi hiểu nó, nhưng điều này dường như không phải là cách triển khai cửa hàng mà tôi đã thấy, cho đến nay đã thực hiện nó ... –

2

Tác giả nghĩ trạng thái là bộ tích lũy của hàm reduce. Ví dụ:

Final State = [Action1, Action2, ..., ActionN].reduce(reducer, Initial State); 

Chức năng giảm đến từ Lập trình chức năng, tên "giảm tốc" cũng đến từ FP.

Tôi không thích sử dụng tên đó ở đây. Bởi vì tôi không thấy thế giới như một kết quả giá trị duy nhất sau hành động. Trạng thái ở đây là một đối tượng. Ví dụ:

['eat', 'sleep'] === [addTodo('eat'), addTodo('sleep')].reduce(reducer, []); 

Điều này Giảm bớt không làm giảm gì cả. Và tôi không quan tâm nó làm giảm bất cứ điều gì hay không. Đặt tên nó là Đầu dò sẽ có ý nghĩa hơn.

3

Chúng tôi biết vị trí của Bộ giảm thiểu (lập trình hàm) và lý do tại sao chúng được xem là đang giảm công việc (giảm n mục nhập thành giá trị trả về đơn - chỉ là những chức năng bình thường được supposted). Tuy nhiên: Tên chỉ là tên, như hoa hồng là tên cho hoa hồng. Không suy nghĩ quá nhiều. Redux progammers là những người IT, họ bị khóa trong bối cảnh của họ và ở đó nó có ý nghĩa. Phần còn lại của chúng tôi phải chấp nhận quyền của một nhà phát minh để gọi một con chó màu xanh là một con mèo màu vàng ;-)

5

Như đã đề cập, tên có liên quan đến khái niệm về bộ giảm tốc trong lập trình hàm. Bạn cũng có thể tìm định nghĩa từ điển Merriam-Webster về giảm tốc hữu ích:

1a. để cùng nhau hoặc gây hội tụ: hợp nhất (giảm tất cả các câu hỏi thành một)

Trình giảm này hợp nhất hành động thành một đối tượng đại diện cho trạng thái ứng dụng.

+0

Tôi đã xóa bình luận của tôi ủng hộ giải thích này, đặc biệt là dòng cuối cùng – PrimeLens

2

Lý do tại sao nó được gọi là một reducer là bởi vì bạn có thể "giảm" một collection of actions và một initial state (cửa hàng) mà trên đó để thực hiện các hành động để có được những kết quả final state.

Làm cách nào? Để trả lời rằng, hãy để tôi xác định một giảm một lần nữa:

Các reduce() phương pháp áp dụng một function chống lại một accumulator và mỗi giá trị của mảng (từ trái sang phải) để giảm nó vào một đơn giá trị.

Và trình giảm tốc Redux làm gì?

Bộ giảm tốc là số function thuần túy có trạng thái hiện tại và hành động và trả về trạng thái tiếp theo. Lưu ý rằng trạng thái là accumulated vì mỗi hành động trên bộ sưu tập được áp dụng để thay đổi trạng thái này.

Vì vậy, cho một collection of actions, bộ giảm tốc được áp dụng cho mỗi giá trị của bộ sưu tập (từ trái sang phải). Lần đầu tiên, nó trả về initial value. Bây giờ bộ giảm tốc được áp dụng một lần nữa trên trạng thái ban đầu này và hành động đầu tiên để trả về trạng thái tiếp theo. Và mục bộ sưu tập tiếp theo (hành động) được áp dụng mỗi lần trên current state để có được next state cho đến khi nó đạt đến cuối mảng. Và sau đó, bạn nhận được the final state. Thật là tuyệt!

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