Khi nào thì thích hợp để thực hiện tính toán trong front-end?


21

Nhóm của tôi đang phát triển một ứng dụng tài chính dựa trên WEB và có một chút tranh cãi với một đồng nghiệp, nơi giữ các tính toán - hoàn toàn ở phía sau hoặc giữ một số ở phía trước?

Giải thích ngắn gọn: Chúng tôi đang sử dụng Java (ZK, Spring) cho front-end và Progress 4gl cho back-end. Các tính toán liên quan đến một số dữ liệu và toán học khó tính từ cơ sở dữ liệu được lưu giữ ở phía sau, vì vậy tôi không nói về chúng. Tôi đang nói về tình huống người dùng nhập giá trị X, sau đó nó được thêm vào giá trị Y (hiển thị trên màn hình) và kết quả được hiển thị trong trường Z. Ý tôi là các hoạt động đơn giản và đơn giản của jQuery.

Vì vậy, những gì sẽ được thực hành tốt nhất ở đây:

1) Thêm các giá trị bằng JavaScript lưu từ đi đến back-end và sau đó xác thực chúng ở back-end "on save"?

2) Giữ tất cả logic kinh doanh ở cùng một vị trí - do đó mang các giá trị đến back-end và thực hiện các phép tính ở đó?

3) Thực hiện các tính toán ở mặt trước; Sau đó gửi dữ liệu đến back-end, xác thực chúng ở đó, thực hiện lại các phép tính và chỉ khi kết quả hợp lệ và bằng nhau, hiển thị chúng cho người dùng?

4) Cái gì khác?

Lưu ý: Chúng tôi thực hiện một số xác nhận cơ bản trong Java nhưng hầu hết trong số đó vẫn ở phía sau như tất cả các logic nghiệp vụ khác.

Tăng dữ liệu sẽ được gửi bằng cách tính toán lại mọi thứ trong back-end sẽ không thành vấn đề (kích thước XML nhỏ; máy chủ và băng thông sẽ chịu được lượng hoạt động tăng lên của người dùng).


1
Nguyên tắc nhỏ: khi nó sử dụng ngôn ngữ được gõ mạnh.
Den

1
Kiểm tra đơn vị tự động sẽ dễ dàng hơn nếu tất cả logic ở phía sau. Nếu 90% phải là mặt sau và 10% có thể ở mặt sau, thì tôi sẽ đặt 100% vào mặt sau.
Ian

3
@Ian: bạn cũng có thể thực hiện kiểm tra đơn vị tự động cho các mã giao diện người dùng nếu bạn cấu trúc mã tốt.
Lie Ryan

1
Nguyên tắc nhỏ: Bất cứ khi nào bạn có thể thoát khỏi nó.
goldilocks

3
Nguyên tắc nhỏ: giả sử người dùng đang hack JavaScript của bạn và thực hiện các tính toán của riêng họ. Từ quan điểm bảo mật, các tính toán phải được thực hiện ở mặt sau. Bạn cũng có thể làm cả hai: JS có thể cung cấp phản hồi nhanh hơn, nhưng các tính toán thực sự được tính trên máy chủ.

Câu trả lời:


36

Như mọi khi, các quyết định như vậy liên quan đến sự đánh đổi giữa các mục tiêu khác nhau, một số trong đó mâu thuẫn với nhau.

  • Hiệu quả sẽ đề nghị bạn thực hiện các tính toán ở mặt trước - cả hai vì cách đó máy tính của người dùng sử dụng nhiều năng lượng hơn và máy chủ của bạn sử dụng ít hơn và vì người dùng thấy phản hồi nhanh hơn, giúp cải thiện trải nghiệm người dùng.

  • Bảo mật yêu cầu bất kỳ hoạt động thay đổi trạng thái nào cũng có thể dựa vào dữ liệu được kiểm tra hoặc tính toán trong máy khách, bởi vì máy khách có thể nằm dưới sự kiểm soát của kẻ tấn công độc hại. Do đó, bạn phải xác thực bất cứ điều gì đến từ phía máy chủ nguồn không tin cậy.

  • Hiệu quả lập trình và khả năng bảo trì cho thấy rằng bạn không nên thực hiện tính toán tương tự hai lần vì nỗ lực lãng phí.

Nhìn bề ngoài, điều này nghe có vẻ như mọi thứ phải được thực hiện ở phía máy chủ, nhưng không phải lúc nào cũng như vậy. Nếu bạn có thể dễ dàng duy trì mã trùng lặp (ví dụ: bằng cách tự động tạo trình xác thực javascript từ trình xác thực Java phía máy chủ của bạn), thì việc lặp lại tính toán có thể là một giải pháp tốt. Nếu tất cả các dữ liệu liên quan đều không quan trọng, ví dụ: nếu người dùng chỉ có thể tự lừa dối bạn chứ không phải bạn nếu họ thao túng các giá trị, thì việc xác thực phía máy chủ là không cần thiết. Nếu thời gian phản hồi của bạn bị chi phối bởi các nút thắt hoàn toàn khác nhau do đó độ trễ của chuyến đi khứ hồi là không thể nhận biết được, thì các cân nhắc của UX không mang tính quyết định, v.v. Do đó, bạn phải xem xét từng áp lực này trong tình huống của mình mạnh mẽ như thế nào và quyết định theo đó .


4
Tôi muốn thêm rằng điều đó Programming efficiency and maintainability suggests that you shouldn't do the same computation twice because of the wasted effort.không đúng vì [1] Xác thực trong giao diện người dùng có thể cung cấp phản hồi nhanh cho người dùng để chỉnh sửa nếu cần. [2] Xác thực trong back-end không đáp ứng và do đó không cung cấp cho người dùng cơ hội tốt nhất để thực hiện chỉnh sửa. Người dùng sẽ cần phải chờ và làm lại nhiều công việc hơn. Vì vậy, tôi nghĩ rằng hai xác nhận không hoàn toàn giống nhau.
Được thông báo vào

9
Đó không phải là điều tôi muốn vượt qua - khả năng bảo trì nghĩa là "đừng lặp lại chính mình", và theo nguyên tắc này, sự lặp lại chắc chắn là xấu. Nếu không có sự cân nhắc nào khác, bạn không nên làm điều đó. Thực tế là nó vẫn thường là một ý tưởng tốt là vì có những cân nhắc khác mà mâu thuẫn với nguyên tắc này, tức là khả năng sử dụng tốt hơn thông qua quay vòng nhanh.
Kilian Foth

@randomA Bạn đang áp dụng sai nguyên tắc đó, nếu bạn muốn nói rằng một cái gì đó cần được xác nhận trên máy chủ chỉ nên được tính trên máy chủ, bởi vì nếu "giá trị xác thực của máy chủ" (hoặc bất cứ điều gì phụ thuộc vào nó) được trả về cho máy khách thì tại một số điểm được gửi trở lại máy chủ, dù sao bạn cũng phải xác nhận lại - vô dụng. Hoặc nếu không, bạn cần một số hệ thống tài liệu tham khảo an toàn, có thể không hiệu quả hơn. Tôi muốn nói nếu bạn có thể thực hiện một phép tính trên máy khách, hãy thực hiện nó trên máy khách , nhưng cũng không bao giờ tin vào những gì khách hàng nói với bạn .
goldilocks

@goldilocks Những gì bạn nói in đậm cũng là những gì tôi đồng ý, bạn phải xác thực mọi thứ ở mặt sau. Quan điểm của tôi là: xác nhận trên front-end phản ứng nhanh hơn, do đó không hoàn toàn giống như xác nhận trên back-end.
Được thông báo vào

13

Có nhiều lý do để thực hiện tính toán trong phần phụ trợ

  • Logic nghiệp vụ không thuộc về lớp trình bày
  • Logic kinh doanh trong JavaScript đặt ra một mối đe dọa
  • Bạn cho rằng có một mối quan hệ một mặt -> một mặt sau không phải lúc nào cũng đúng , back-end nên được coi là có khả năng hoặc phục vụ nhiều hơn một ứng dụng mặt trước, do đó bạn không thể thừa nhận bất cứ điều gì.
  • Nếu các tính toán sử dụng một lượng lớn dữ liệu, việc giữ nó ở phía trước sẽ không hiệu quả
  • Nếu tính toán sử dụng cơ sở dữ liệu, bạn sẽ không thể sao chép nó trong giao diện người dùng

Đề nghị của tôi

  • Có cơ sở dữ liệu thực thi càng nhiều quy tắc kinh doanh rõ ràng trong mô hình, bao gồm khóa ngoại, khóa chính, kiểm tra các ràng buộc và kích hoạt
  • Có lớp nghiệp vụ đưa ra ngoại lệ khi các quy tắc kinh doanh không được đáp ứng (vì cơ sở dữ liệu trả về lỗi hoặc do chính lớp doanh nghiệp đã xác thực dữ liệu)
  • Nếu và chỉ khi thời gian phản hồi không được chấp nhận, hãy xác thực hoặc xử lý trước bằng cách sử dụng Ajax (công việc sẽ không thực sự được thực hiện bằng JavaScript, nó sẽ được thực hiện trong phần phụ trợ mà không phải tải lại trang)
  • Bạn có thể thực hiện xác thực đơn giản trong JavaScript như không cho phép một giá trị trống hoặc các giá trị quá dài hoặc nằm ngoài phạm vi (đối với cái sau bạn có thể muốn tạo phạm vi ở mặt sau)

2
Vấn đề với việc cơ sở dữ liệu thực thi các quy tắc kinh doanh là báo cáo vi phạm lên mặt trước! Nếu giao diện người dùng thực thi các quy tắc kinh doanh, nó có thể nhanh chóng phản hồi các thông báo lỗi có ý nghĩa cho người dùng. Nếu back-end thực hiện thì có rất nhiều lưu lượng hai chiều lộn xộn giữa mặt trước và mặt sau vì lỗi được báo cáo cùng một lúc.
James Anderson

@JamesAnderson Không còn "mặt trước". Có thể có một số giao diện người dùng cho cùng một cơ sở dữ liệu hoặc một số cơ sở dữ liệu cho một số giao diện người dùng. Ngoài ra, có các quy tắc kinh doanh thực thi back-end không có nghĩa là front-end bị cấm làm điều đó. Tôi nhấn mạnh rằng trong điểm đạn thứ hai.
Tulains Córdova
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.