Là Redux sử dụng một mẫu đối tượng Thiên Chúa vệ sinh?


15

Trong khi tìm hiểu về Redux, mẫu đối tượng Thần (hoặc chống mẫu) xuất hiện trong đầu tôi - cả hai đều có một đối tượng lớn duy nhất nắm giữ tất cả dữ liệu ứng dụng và phương thức để thao túng chúng. Nhưng Redux đã đặt ra một số hạn chế như làm cho Object trở nên bất biến và các hàm thuần túy duy trì các chữ ký nghiêm ngặt.

Vì vậy, câu hỏi được đặt ra, là Redux sử dụng một phiên bản vệ sinh của đối tượng Thiên Chúa? Hoặc, có một cái gì đó để làm với Javascript không được gõ OOP cổ điển?


2
Câu trả lời ngắn gọn: không. Câu trả lời dài (thực sự là một câu hỏi sẽ dẫn đến câu trả lời): cơ sở dữ liệu có phải là một lớp không? Hoặc làm thế nào về một hệ thống tập tin? Hoặc làm thế nào về một bộ đệm? Có phải tất cả các mẫu Thiên Chúa cũng vậy?
code4life

IMO đúng vậy. Đó là trong tuyên bố đầu tiên về Redux: "Khi các yêu cầu đối với các ứng dụng một trang JavaScript ngày càng trở nên phức tạp, mã của chúng tôi phải quản lý nhiều trạng thái hơn bao giờ hết." - điều này ngụ ý rằng bạn phải quản lý trạng thái của ứng dụng của mình dưới dạng một đốm màu. Tôi nghĩ đó là một vấn đề cụ thể đối với các ứng dụng web và được tạo bởi những người nghèo / không bao giờ được thiết kế cho các khung này được sử dụng để triển khai các ứng dụng web.
n13

@ n13: Chỉ vì nó có thể truy cập từ một vị trí tập trung không có nghĩa là đó là một đốm lớn. Ví dụ: cơ sở dữ liệu của tôi được truy cập theo cách tập trung ( DbContext) nhưng dữ liệu bên trong của nó được chia thành các phần nhỏ hơn (bảng, lược đồ).
Flater

@Flater một blob lớn với nhiều phân khu vẫn là một blob lớn. Một mô hình OO cũ đơn giản ngăn chặn tất cả dữ liệu trên cơ sở cần biết, có nghĩa là mỗi đối tượng chỉ xử lý một lượng rất nhỏ trạng thái / dữ liệu và mọi thứ đều khá đơn giản. Bạn cũng có thể lưu trữ mọi thứ trong một cấu trúc toàn cầu khổng lồ nhưng bạn không làm điều đó bởi vì đó là thiết kế phần mềm tồi. Phần mềm 101.
n13

@ n13 Bạn có thể tách logic thành các lớp con (ẩn hoặc không), tuân thủ cả chữ cái và ý định thực hành tốt, trong khi vẫn tập trung vào phần xử lý cho logic của bạn. Đó là lập luận tương tự như sử dụng microservice so với một api. Mặc dù microservice là một tùy chọn, điều đó không có nghĩa là API REST "bình thường" do đó là thông lệ xấu.
Flater

Câu trả lời:


6

Một đối tượng của Thiên Chúa là gì? Từ Wikipedia:

Hầu hết [một đối tượng Thiên Chúa có chứa] chức năng tổng thể của chương trình được mã hóa thành một đối tượng "biết tất cả", duy trì hầu hết thông tin về toàn bộ chương trình và cũng cung cấp hầu hết các phương thức để thao tác dữ liệu này. Bởi vì đối tượng này chứa rất nhiều dữ liệu và đòi hỏi rất nhiều phương pháp, nên vai trò của nó trong chương trình trở nên giống như Chúa (hiểu biết và bao quát tất cả).

Cửa hàng Redux chỉ chứa một đối tượng dữ liệu và chỉ yêu cầu 2 hoặc 3 phương thức. Về mặt này, thật khó để tưởng tượng rằng nó là một đối tượng của Thiên Chúa. Nó được quyết định không phải là "tất cả biết."

Bây giờ nếu bộ giảm tốc của bạn hoàn toàn không bị hỏng, nếu tất cả logic nằm trong một chức năng, thì điều đó có thể đủ điều kiện nhưng đó là một vấn đề đơn giản để chia bộ giảm tốc thành một loạt các mảnh nhỏ hơn để tránh tình huống.


Tôi nghĩ OP đang tự hỏi nếu tất cả các bộ giảm tốc cùng nhau , cộng với Cửa hàng, được tính là "Đối tượng của Chúa".
dùng949300

1
Có phải tất cả các lớp mô hình của một chương trình cùng được tính là một đối tượng thần?
Daniel T.

Tôi tranh luận rằng trong OOP truyền thống, tất cả họ không hoạt động trên cùng một dữ liệu "mọi thứ", vì vậy, không có họ.
dùng949300

Các bộ giảm cũng không hoạt động trên cùng một dữ liệu "mọi thứ". Một bộ giảm tốc tương đương với một lớp mô hình duy nhất. Dữ liệu của trình giảm tương đương với các trường của lớp và các hành động tương đương với các phương thức của lớp (Tức là mỗi câu lệnh trường hợp tương đương với một phương thức cụ thể.)
Daniel T.

2

IMO, câu hỏi trên không nên phát sinh. Các khái niệm lập trình chức năng không thể so sánh với các khái niệm trong OOPS, chúng chỉ là những cách khác nhau để giải quyết cùng một vấn đề. nhập mô tả hình ảnh ở đây


5
Bạn đã làm hình ảnh bảng này chỉ cho câu hỏi? Tôi nghĩ rằng nó sẽ phù hợp hơn dưới dạng văn bản, để nó tải nhanh hơn và có thể được quan sát bằng trình đọc màn hình
Phoenix

Không phải OOP cũng khuyến khích luồng dữ liệu đơn hướng? Trừ khi bạn coi OOP chỉ đơn giản là khái niệm về các lớp có thể chứa các tham chiếu cho nhau, nhưng không phải là thiết kế phù hợp trong đó các tham chiếu hai chiều thường chỉ ra một lỗ hổng thiết kế.
Steven Jeuris

Hầu hết những thứ bạn đề cập trong OOP và FP thậm chí không liên quan gì đến tuyên bố vấn đề trên cột đầu tiên. thành phần chức năng chẳng hạn chỉ làm cho việc hiểu cấu trúc trạng thái trở nên khó khăn hơn và nó thay đổi
Ski

Có vẻ như bạn thích FP hơn, nhưng trong tâm trí tôi, câu trả lời của bạn chỉ xác nhận cảm giác của tôi rằng đó là một đối tượng của Chúa. Giống như OMG, trạng thái của tôi rất phức tạp, bởi vì tôi coi toàn bộ trạng thái của toàn bộ chương trình là một điều lớn. Vâng, đó là phức tạp. Trong OOP, bạn có các mô hình đối tượng logic xung quanh được cập nhật, đây không phải là vấn đề lớn. Nếu nó xảy ra bất thường thì cũng tốt. Các khung nhìn phản ánh trạng thái của đối tượng và nó rất đơn giản trong thực tế.
n13

0

Trang đầu tiên cho thấy rõ rằng Redux giải quyết một vấn đề dành riêng cho các ứng dụng web của một trang:

Vì các yêu cầu đối với các ứng dụng một trang JavaScript đã trở nên ngày càng phức tạp, mã của chúng tôi phải quản lý trạng thái nhiều hơn bao giờ hết. (từ Redux - Động lực)

Bản dịch của riêng tôi là - các ứng dụng web và các khung để tạo ứng dụng web rất lộn xộn và khi chúng đang chạy trên trình duyệt, chúng phải đối mặt với một loạt vấn đề duy nhất không phát sinh bên ngoài các ứng dụng web.

Đừng hiểu sai ý tôi - Tôi không nói các ứng dụng web là xấu, hoặc các khung công tác là xấu. Không thể phủ nhận rằng các trang web và toàn bộ mô hình về nó không bao giờ được thiết kế với các ứng dụng trong tâm trí. Một số ứng dụng web hoạt động rất tốt - ví dụ: tôi yêu Google Docs, nó tốt hơn ứng dụng gốc tương đương.

Nhưng Redux chỉ là một công cụ để quản lý các vấn đề phát sinh khi bạn phải giải quyết các hạn chế và vấn đề xuất phát từ việc tạo các ứng dụng web chạy trên trình duyệt.

Đối với một ứng dụng iOS hoặc bất kỳ ứng dụng gốc nào, điều đó không có ý nghĩa. Mô hình đối tượng xử lý các thay đổi không đồng bộ và tương tác người dùng một cách dễ dàng. Bạn sẽ luôn biết những gì đang xảy ra. Kết xuất các trạng thái khác nhau không phải là vấn đề và được tự động hóa với các sự kiện MVC và cập nhật.

Bạn chưa bao giờ phải đối mặt với một tình huống như các ứng dụng web.

** Nếu kiến ​​trúc của bạn tệ, thì tốt, không có gì có thể cứu bạn, ngay cả Redux;)

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.