เมื่อใดจึงเหมาะสมที่จะทำการคำนวณในส่วนหน้า


21

ทีมของฉันกำลังพัฒนาแอพพลิเคชั่นทางการเงินบนเว็บและมีข้อโต้แย้งกับเพื่อนร่วมงานที่จะทำการคำนวณ - แบ็คเอนด์หมดจดหรือเก็บฟรอนท์เอนด์ไว้บ้างไหม?

คำอธิบายสั้น ๆ : เราใช้ Java (ZK, Spring) สำหรับ front-end และ Progress 4gl สำหรับ back-end การคำนวณที่เกี่ยวข้องกับคณิตศาสตร์ไม่ยอมใครง่ายๆ & ข้อมูลจากฐานข้อมูลจะถูกเก็บไว้ในส่วนท้ายดังนั้นฉันไม่ได้พูดถึงพวกเขา ฉันกำลังพูดถึงสถานการณ์ที่ผู้ใช้ป้อนค่า X จากนั้นจะเพิ่มค่า Y (แสดงในหน้าจอ) และผลลัพธ์จะปรากฏในฟิลด์ Z การดำเนินการ jQuery-ish ที่เรียบง่ายและบริสุทธิ์ฉันหมายถึง

ดังนั้นสิ่งที่จะเป็นแนวปฏิบัติที่ดีที่สุดที่นี่:

1) เพิ่มค่าด้วย JavaScript ที่บันทึกจากการไปที่ส่วนหลังและส่วนหลังจากนั้นตรวจสอบความถูกต้องที่ส่วนท้าย "ในการบันทึก"?

2) รักษาตรรกะทางธุรกิจทั้งหมดไว้ในที่เดียวกัน - นำค่าไปยังส่วนหลังและทำการคำนวณที่นั่น?

3) ทำการคำนวณในส่วนหน้า; จากนั้นส่งข้อมูลไปยังส่วนหลังตรวจสอบความถูกต้องที่นั่นทำการคำนวณอีกครั้งและหากผลลัพธ์นั้นถูกต้องและเท่าเทียมกันแสดงให้ผู้ใช้เห็นหรือไม่

4) มีอะไรอีกไหม?

หมายเหตุ: เราทำการตรวจสอบความถูกต้องเบื้องต้นใน Java แต่ส่วนใหญ่ยังอยู่ใน back-end เช่นเดียวกับตรรกะทางธุรกิจอื่น ๆ ทั้งหมด

การเพิ่มข้อมูลที่จะถูกส่งโดยการคำนวณใหม่ทุกอย่างใน back-end จะไม่มีปัญหา (ขนาด XML เล็กเซิร์ฟเวอร์และแบนด์วิดท์จะทนต่อจำนวนการดำเนินการที่เพิ่มขึ้นของผู้ใช้)


1
Rule of thumb: เมื่อมันใช้ภาษาที่พิมพ์อย่างรุนแรง
Den

1
การทดสอบหน่วยอัตโนมัติจะง่ายขึ้นหากตรรกะทั้งหมดอยู่ในส่วนท้าย ถ้า 90% ต้องเป็นแบ็คเอนด์และ 10% สามารถอยู่ที่แบ็คเอนด์ได้ฉันจะใส่ 100% ในแบ็คเอนด์
เอียน

3
@Ian: คุณสามารถทำการทดสอบหน่วยอัตโนมัติสำหรับรหัสส่วนหน้าได้เช่นกันหากคุณจัดโครงสร้างรหัสของคุณได้ดี
Lie Ryan

1
Rule of thumb: เมื่อใดก็ตามที่คุณสามารถหนีไปกับมันได้
goldilocks

3
Rule of thumb: สมมติว่าผู้ใช้แฮ็ค JavaScript ของคุณและทำการคำนวณของตัวเอง จากจุดรักษาความปลอดภัยการคำนวณจะต้องทำในส่วนหลัง คุณสามารถทำทั้งสองอย่างเช่นกัน: JS สามารถให้ข้อเสนอแนะได้เร็วขึ้น แต่การคำนวณที่นับจริงจะทำบนเซิร์ฟเวอร์

คำตอบ:


36

เช่นเคยการตัดสินใจดังกล่าวเกี่ยวข้องกับการแลกเปลี่ยนระหว่างเป้าหมายที่แตกต่างกันซึ่งบางข้อขัดแย้งกัน

  • ประสิทธิภาพขอแนะนำให้คุณทำการคำนวณในส่วนหน้า - ทั้งสองอย่างเนื่องจากวิธีที่คอมพิวเตอร์ของผู้ใช้ใช้พลังงานมากขึ้นและเซิร์ฟเวอร์ของคุณใช้งานน้อยลงและเนื่องจากผู้ใช้เห็นการตอบกลับที่เร็วขึ้นซึ่งช่วยปรับปรุงประสบการณ์ผู้ใช้

  • ความต้องการด้านความปลอดภัยที่การดำเนินการเปลี่ยนสถานะไม่สามารถพึ่งพาข้อมูลที่ถูกตรวจสอบหรือคำนวณในคอมพิวเตอร์ไคลเอนต์ได้เนื่องจากคอมพิวเตอร์ไคลเอนต์อาจอยู่ภายใต้การควบคุมของผู้โจมตีที่ประสงค์ร้าย ดังนั้นคุณต้องตรวจสอบสิ่งที่มาจากฝั่งเซิร์ฟเวอร์ที่ไม่น่าเชื่อถือ

  • ประสิทธิภาพการเขียนโปรแกรมและการบำรุงรักษาแสดงให้เห็นว่าคุณไม่ควรทำการคำนวณเดียวกันสองครั้งเพราะความพยายามที่สูญเปล่า

ผิวเผินนี้ฟังดูราวกับว่าทุกอย่างจะต้องทำในฝั่งเซิร์ฟเวอร์ แต่ก็ไม่ได้เป็นเช่นนั้นเสมอไป หากคุณสามารถรักษารหัสที่ซ้ำกันได้อย่างง่ายดาย (เช่นโดยการสร้างตัวตรวจสอบความถูกต้องของจาวาสคริปต์จากตัวตรวจสอบความถูกต้อง Java ฝั่งเซิร์ฟเวอร์ของคุณ) การทำซ้ำการคำนวณอาจเป็นวิธีที่ดี หากข้อมูลที่เกี่ยวข้องนั้นไม่สำคัญทั้งหมดเช่นหากผู้ใช้สามารถโกงได้ด้วยตนเองเท่านั้นและไม่ใช่คุณหากพวกเขาจัดการกับค่าต่างๆการตรวจสอบความถูกต้องฝั่งเซิร์ฟเวอร์นั้นไม่จำเป็น หากเวลาตอบสนองของคุณถูกครอบงำโดยคอขวดที่แตกต่างกันอย่างสิ้นเชิงเพื่อไม่ให้เกิดความล่าช้าในการเดินทางไป - กลับดังนั้นการพิจารณา UX นั้นไม่ได้เด็ดขาด ฯลฯ ดังนั้นคุณต้องพิจารณาว่าแรงกดดันเหล่านี้แต่ละครั้งแข็งแกร่งแค่ไหนในสถานการณ์ของคุณ .


4
ฉันต้องการที่จะเพิ่มที่Programming efficiency and maintainability suggests that you shouldn't do the same computation twice because of the wasted effort.ไม่ถูกต้องเพราะ [1] การตรวจสอบในส่วนหน้าสามารถให้ข้อเสนอแนะอย่างรวดเร็วแก่ผู้ใช้ในการแก้ไขหากจำเป็น [2] การตรวจสอบความถูกต้องของแบ็คเอนด์นั้นไม่ตอบสนองดังนั้นผู้ใช้จึงไม่ได้ให้โอกาสที่ดีที่สุดในการแก้ไข ผู้ใช้จะต้องรอและทำงานซ้ำอีกครั้ง ดังนั้นฉันคิดว่าการตรวจสอบทั้งสองนั้นไม่เหมือนกันทั้งหมด
InformedA

9
นั่นไม่ใช่สิ่งที่ฉันต้องการที่จะข้าม - การบำรุงรักษาไม่ได้หมายความว่า "อย่าทำซ้ำตัวเอง" และตามหลักการนี้การทำซ้ำนั้นไม่ดีอย่างแน่นอน หากไม่มีข้อควรพิจารณาอื่นคุณไม่ควรทำ ความจริงที่ว่ามันยังคงมักจะเป็นความคิดที่ดีเป็นเพราะมีมีการพิจารณาอื่น ๆ ซึ่งขัดแย้งกับหลักการนี้คือการใช้งานที่ดีขึ้นผ่านการตอบสนองอย่างรวดเร็ว
Kilian Foth

@randomA คุณกำลังนำหลักการนั้นไปใช้ในทางที่ผิดถ้าคุณหมายความว่ามีบางสิ่งที่จำเป็นต้องมีการตรวจสอบความถูกต้องบนเซิร์ฟเวอร์ควรคำนวณบนเซิร์ฟเวอร์เท่านั้นเพราะหาก "ค่าการตรวจสอบความถูกต้องของเซิร์ฟเวอร์" (หรืออะไรก็ตามที่ขึ้นอยู่กับมัน) ในบางจุดที่ส่งกลับไปยังเซิร์ฟเวอร์คุณต้องตรวจสอบอีกครั้ง - ไร้ประโยชน์ หรืออื่น ๆ ที่คุณต้องการระบบการอ้างอิงที่ปลอดภัยซึ่งอาจจะไม่มีประสิทธิภาพมากขึ้น ผมว่าถ้าคุณสามารถทำคำนวณกับลูกค้าที่ทำกับลูกค้าแต่ยังไม่เคยไว้วางใจสิ่งที่ลูกค้าจะบอกคุณ
goldilocks

@goldilocks สิ่งที่คุณพูดเป็นตัวหนาก็เป็นสิ่งที่ฉันเห็นด้วยเช่นกันคุณต้องตรวจสอบทุกอย่างในส่วนหลัง ประเด็นของฉันคือ: การตรวจสอบความถูกต้องของส่วนหน้านั้นตอบสนองได้ดีกว่าดังนั้นจึงไม่เหมือนกับการตรวจสอบความถูกต้องที่ส่วนท้าย
InformedA

13

มีเหตุผลที่ดีสำหรับการคำนวณในแบ็กเอนด์

  • ตรรกะทางธุรกิจไม่ได้อยู่ในเลเยอร์การนำเสนอ
  • ตรรกะทางธุรกิจใน JavaScript ก่อให้เกิดภัยคุกคาม
  • คุณคิดว่ามีความสัมพันธ์แบบหน้าเดียว -> ความสัมพันธ์แบบหน้าหลังเดียวซึ่งไม่เป็นความจริงเสมอไปส่วนหน้าหลังควรคิดว่ามีความสามารถหรือให้บริการแอพพลิเคชั่นส่วนหน้ามากกว่าหนึ่งโปรแกรม
  • หากการคำนวณใช้ข้อมูลจำนวนมากมันจะไม่มีประสิทธิภาพในการเก็บไว้ที่ส่วนหน้า
  • หากการคำนวณใช้ฐานข้อมูลคุณจะไม่สามารถทำซ้ำได้ในส่วนหน้า

คำแนะนำของฉัน

  • ให้ฐานข้อมูลบังคับใช้กฎทางธุรกิจให้มากที่สุดเท่าที่เป็นไปได้ในโมเดลรวมถึงคีย์ต่างประเทศคีย์หลักตรวจสอบข้อ จำกัด และทริกเกอร์
  • ให้ชั้นธุรกิจเกิดข้อยกเว้นเมื่อไม่ปฏิบัติตามกฎเกณฑ์ทางธุรกิจ (เนื่องจากฐานข้อมูลส่งคืนข้อผิดพลาดหรือเนื่องจากชั้นธุรกิจตรวจสอบความถูกต้องของข้อมูลเอง)
  • หากและถ้าหากเวลาตอบสนองไม่เป็นที่ยอมรับให้ทำการตรวจสอบความถูกต้องหรือประมวลผลล่วงหน้าโดยใช้ Ajax (งานจะไม่ได้ทำใน JavaScript จริงๆมันจะทำในแบ็กเอนด์โดยไม่ต้องโหลดหน้าซ้ำ)
  • คุณสามารถทำการตรวจสอบง่าย ๆ ใน JavaScript เช่นไม่อนุญาตให้มีค่าว่างหรือค่าที่ยาวเกินไปหรืออยู่นอกช่วง (สำหรับระยะหลังคุณอาจต้องการสร้างช่วงในส่วนหลัง)

2
ปัญหาของการมีฐานข้อมูลบังคับใช้กฎเกณฑ์ทางธุรกิจคือการรายงานการละเมิดไปยังส่วนหน้า! หากส่วนหน้าบังคับใช้กฎเกณฑ์ทางธุรกิจก็สามารถส่งข้อความตอบกลับข้อผิดพลาดที่มีความหมายถึงผู้ใช้ได้ หากแบ็คเอนด์ทำเช่นนั้นจะมีการรับส่งข้อมูลแบบสองทางจำนวนมากระหว่างด้านหน้าและด้านหลังสิ้นสุดเนื่องจากมีการรายงานข้อผิดพลาดทีละรายการ
James Anderson

@JamesAnderson ไม่มี "ส่วนหน้า" อีกต่อไป อาจมีหลาย Front-End ไปยังฐานข้อมูลเดียวกันหรือหลายฐานข้อมูลไปยัง Front-End หลาย ๆ นอกจากนี้การมี back-end บังคับใช้กฎเกณฑ์ทางธุรกิจไม่ได้หมายความว่า front-end นั้นไม่สามารถทำได้ ฉันเน้นว่าในสัญลักษณ์แสดงหัวข้อย่อยที่สอง
Tulains Córdova
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.