2017-01-25 18 views
15

tôi một có thể có một hành động thông như thế này:sự khác biệt này giữa hành động thông lượng này và hàm gọi này là gì?

{type: 'KILL', payload: {target: 'ogre'}} 

Nhưng tôi không nhìn thấy những gì là sự khác biệt giữa việc có một phương pháp trên một dân lớp (gói các cửa hàng) như thế này,

People.kill('ogre') 

NẾU Người là người nhận duy nhất của hành động?

tôi thấy rằng điều phối thông mang lại cho tôi hai lợi thế (có thể)

  1. Các "giết" phương pháp có thể được phát sóng đến nhiều người nhận biết (tốt!)
  2. Các điều phối mang lại cho tôi một nơi thuận tiện để ghi lại tất cả lưu lượng hành động (cũng tốt!)

Đây có thể là những điều tốt, nhưng có lý do nào khác mà tôi bị thiếu không?

Điều tôi không thấy là cách đặt các hành động dưới dạng đối tượng JSON, đột nhiên thực thi hoặc trợ giúp với luồng truyền thông "một chiều", đó là những gì tôi đọc ở khắp mọi nơi là lợi thế lớn của việc có hành động, và của thông lượng.

Có vẻ như tôi vẫn đang gửi tin nhắn trở lại cửa hàng một cách hiệu quả, bất kể tôi tưới nước heo như thế nào. Chắc chắn hành động bây giờ đang trải qua một vài lớp indirection (action creator, dispatcher) trước khi nó tới cửa hàng, nhưng trừ khi tôi thiếu một vài thứ mà thành phần gửi hành động đó cho tất cả các mục đích thực tế là cập nhật bất cứ cửa hàng nào đang lắng nghe giết tin nhắn.

Tôi thiếu gì ở đây?

Một lần nữa tôi biết trên Stack Overflow, chúng tôi không thể hỏi quá chung chung một câu hỏi, vì vậy tôi muốn giữ điều này rất cụ thể. Hai đoạn mã trong khi có cú pháp khác nhau, dường như có ngữ nghĩa (ngoại trừ khả năng phát sóng tới nhiều cửa hàng) giống hệt nhau. Và một lần nữa nếu lý do duy nhất là nó cho phép phát sóng và cho phép một điểm duy nhất của dòng chảy cho mục đích gỡ lỗi, tôi ổn với điều đó, nhưng muốn biết nếu có một số điều khác về thông lượng/điều phối viên, tôi còn thiếu?

Trả lời

9

Các tính năng chính của kiến ​​trúc thông-style là xấp xỉ như sau:

  1. cửa hàng là nguồn duy nhất của sự thật cho trạng thái ứng dụng
  2. chỉ hành động có thể gây ra đột biến của nhà nước của cửa hàng
  3. trạng thái cửa hàng không được biến đổi trực tiếp, tức là thông qua gán giá trị đối tượng, nhưng bằng cách tạo các đối tượng mới thông qua nhân bản/phá hủy thay vì

Giống như một chế độ ăn uống, sử dụng thứ là loại kiến ​​trúc thực sự không hoạt động nếu bạn trượt và quay trở lại những cách cũ không liên tục.

Quay lại ví dụ của bạn. Lợi ích khi sử dụng hành động ở đây không phải là các khía cạnh phát sóng hoặc ghi nhật ký, mà chỉ đơn giản là lớp People chỉ có thể tiêu thụ dữ liệu từ cửa hàng và thể hiện mong muốn biến đổi trạng thái của cửa hàng nói trên bằng các hành động.Hãy tưởng tượng ví dụ rằng Elves muốn hát cho các yêu tinh và do đó quan tâm đến việc biết ogre nói vẫn còn sống. Đồng thời các People muốn được lịch sự và không muốn giết ogre trong khi nó đang được serenaded. Những lợi ích của kiến ​​trúc thông-phong cách rất rõ ràng:

class People { 
    kill(creature) { 
    if (creatureStore.getSerenadedCreature() !== creature) 
     store.dispatch({ type: 'KILL', payload: { target: creature } }) 
    return `The ${creature} is being serenaded by those damn elves, let's wait until they've finished.` 
    } 
} 

class Elves { 
    singTo(creature) { 
    if (!creatureStore.getCreatures().includes(creature)) 
     return store.dispatch({ type: 'SING_TO', payload: { target: creature } }) 
    return `Oh no, the ${creature} has been killed... I guess there will be no serenading tonight..` 
    } 
} 

Nếu lớp People là để bọc các cửa hàng, bạn cần lớp Elves quấn cùng một cửa hàng là tốt, tạo hai nơi cùng một trạng thái sẽ bị đột biến theo cách này hay cách khác. Bây giờ hãy tưởng tượng nếu có 10 lớp khác cần truy cập vào cửa hàng đó và muốn thay đổi nó: thêm những tính năng mới này đang trở thành nỗi đau bởi vì tất cả những lớp này giờ đây đang ở lòng thương xót của các lớp khác, biến đổi trạng thái từ bên dưới chúng, buộc bạn để xử lý tấn các trường hợp cạnh không thể thậm chí liên quan đến logic nghiệp vụ của các lớp đó.

Với kiến ​​trúc kiểu thông lượng, tất cả các lớp đó sẽ chỉ tiêu thụ dữ liệu từ creatureStore và gửi tác vụ dựa trên trạng thái đó. Cửa hàng xử lý đối chiếu các hành động khác nhau với tiểu bang để tất cả người đăng ký của nó có dữ liệu phù hợp vào đúng thời điểm.

Lợi ích của mẫu này có thể không hiển nhiên khi bạn chỉ có một vài cửa hàng được tiêu thụ bởi một hoặc hai thực thể. Khi bạn có hàng chục (hoặc hàng trăm) cửa hàng với hàng chục (hoặc hàng trăm) thành phần tiêu thụ dữ liệu từ một vài cửa hàng, kiến ​​trúc này giúp bạn tiết kiệm thời gian và tiền bạc bằng cách làm cho việc phát triển các tính năng mới dễ dàng hơn mà không phá vỡ các tính năng hiện có.

Hy vọng tường-o-văn bản này đã giúp làm rõ!

2

Điều tôi không thấy là cách đặt các hành động dưới dạng đối tượng JSON, đột nhiên thực thi hoặc trợ giúp luồng truyền thông "1 chiều", đó là những gì tôi đọc ở khắp mọi nơi. và thông lượng. Có vẻ như tôi vẫn đang gửi một tin nhắn trở lại cửa hàng một cách hiệu quả, cho dù tôi có tưới nước cho heo như thế nào đi nữa. Chắc chắn hành động bây giờ đang trải qua một vài lớp indirection (action creator, dispatcher) trước khi nó tới cửa hàng, nhưng trừ khi tôi thiếu một vài thứ mà thành phần gửi hành động đó cho tất cả các mục đích thực tế là cập nhật bất cứ cửa hàng nào đang lắng nghe giết tin nhắn. Tôi thiếu gì ở đây?

Facebook Flux lấy ý tưởng từ hệ thống GUI điều khiển sự kiện. Trong đó ngay cả khi bạn di chuyển chuột, bạn sẽ nhận được tin nhắn. Điều này được gọi là vòng lặp tin nhắn sau đó, và bây giờ chúng tôi có hành động gửi đi.

Ngoài ra, chúng tôi có danh sách người đăng ký bên trong cửa hàng.

Và nó thực sự là nguyên tắc tương tự trong Redux, nơi bạn có một cửa hàng, trong khi ở Flux bạn có thể có nhiều cửa hàng.

Bây giờ, ít toán học. Có 2 thành phần A và B bạn cần phải có một vài chuỗi cập nhật có thể Cập nhật B và B cập nhật A hoặc tự cập nhật (không bao gồm ở đây các bản cập nhật từ bên ngoài ứng dụng). Đây là trường hợp có thể xảy ra.

enter image description here

Chỉ với ba thành phần, chúng tôi có nhiều chuỗi có thể hơn.

enter image description here

Và thậm chí có nhiều thành phần phức tạp hơn.Vì vậy, để ngăn chặn sự phức tạp theo hàm mũ của các thành phần có thể tương tác, chúng ta có mẫu Flux này không có gì hơn IDispatch, IObservable nếu bạn làm việc với các giao diện này từ một số ngôn ngữ lập trình khác. Một sẽ là cho các hành động khạc nhổ, và một cho nhập chuỗi của người nghe tồn tại bên trong cửa hàng.

Với mẫu này, mã Phản ứng của bạn sẽ được sắp xếp theo cách khác với cách tiếp cận phản ứng thông thường. Bạn sẽ không phải sử dụng trạng thái React.Component nữa. Thay vào đó, bạn sẽ sử dụng (các) Cửa hàng sẽ giữ trạng thái ứng dụng.

Thành phần của bạn chỉ có thể thể hiện mong muốn biến đổi trạng thái ứng dụng bằng cách gửi tác vụ. Ví dụ: onClick có thể gửi hành động để tăng bộ đếm. Các hành động là các đối tượng với thuộc tính type: thường là một chuỗi và thường là chữ hoa, nhưng đối tượng hành động có thể có nhiều đạo cụ khác như ID, giá trị, ...

Vì các thành phần chịu trách nhiệm hiển thị dựa trên về trạng thái đơn đăng ký, chúng tôi cần bằng cách nào đó để cung cấp cho họ trạng thái đơn đăng ký . Nó có thể thông qua props = store.getState() hoặc chúng tôi có thể sử dụng context. Nhưng cũng kiểm tra this.

Cuối cùng, thậm chí không bị cấm thành phần sử dụng trạng thái nội bộ (this.state) trong trường hợp điều này không ảnh hưởng đến ứng dụng. Bạn nên nhận ra những trường hợp này.

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