फ्रंट-एंड में गणना करना कब उचित है?


21

मेरी टीम एक WEB आधारित वित्त अनुप्रयोग विकसित कर रही है और एक सहकर्मी के साथ थोड़ी बहस हुई थी कि गणना कहाँ रखी जाए - विशुद्ध रूप से बैक-एंड में या कुछ को फ्रंट-एंड में भी रखें?

संक्षिप्त विवरण: हम फ्रंट-एंड के लिए जावा (ZK, स्प्रिंग) का उपयोग कर रहे हैं और बैक-एंड के लिए प्रगति 4gl। गणना जिसमें डेटाबेस से कुछ कट्टर गणित और डेटा शामिल हैं, बैक-एंड में रखे गए हैं, इसलिए मैं उनके बारे में बात नहीं कर रहा हूं। मैं उस स्थिति के बारे में बात कर रहा हूं जहां उपयोगकर्ता मूल्य X में प्रवेश करता है, यह तब मूल्य Y (स्क्रीन में दिखाया गया है) में जोड़ा जाता है और परिणाम क्षेत्र में दिखाया जाता है। शुद्ध और सरल jQuery-ish संचालन, मेरा मतलब है।

तो यहां सबसे अच्छा अभ्यास क्या होगा:

1) जावास्क्रिप्ट के साथ मान जोड़ें जो बैक-एंड और बैक में जाने से बचाता है और फिर बैक-एंड में "सेव पर" को वेरिफाई करता है?

2) सभी व्यापारिक तर्क को एक ही स्थान पर रखें - इसलिए मूल्यों को बैक-एंड में लाएं और वहां गणना करें?

3) सामने के अंत में गणना करें; फिर डेटा को बैक-एंड पर भेजें, उन्हें वहां मान्य करें, फिर से गणना करें और केवल तभी जब परिणाम मान्य और समान हों, उन्हें उपयोगकर्ता को प्रदर्शित करें?

४) कुछ और?

नोट: हम जावा में कुछ बुनियादी सत्यापन करते हैं, लेकिन अधिकांश अभी भी अन्य सभी व्यावसायिक तर्क के रूप में बैक-एंड में हैं।

डेटा की वृद्धि जो एक बैक-एंड में सब कुछ पुनर्गणना करके भेजी जाएगी, एक समस्या नहीं होगी (छोटे XML आकार; सर्वर और बैंडविड्थ उपयोगकर्ताओं द्वारा किए गए संचालन की बढ़ी मात्रा का सामना करेंगे)।


1
अंगूठे का नियम: जब यह एक जोरदार टाइप की हुई भाषा का उपयोग करता है।
डेन

1
स्वचालित इकाई परीक्षण आसान हो जाएगा अगर सब तर्क वापस अंत में है। अगर 90% का बैक एंड होना है और 10% बैक-एंड में हो सकता है, तो मैं बैक एंड में 100% डालूँगा।
इयान

3
@ इयान: यदि आप अपने कोड को अच्छी तरह से संरचना करते हैं तो आप फ्रंट एंड कोड के लिए स्वचालित इकाई परीक्षण कर सकते हैं।
रेयान

1
अंगूठे का नियम: जब भी आप इससे दूर हो सकते हैं।
गोल्डीलॉक्स

3
अंगूठे का नियम: मान लें कि उपयोगकर्ता आपके जावास्क्रिप्ट को हैक कर रहा है और अपनी गणना कर रहा है। सुरक्षा के दृष्टिकोण से, गणना बैक-एंड पर की जानी चाहिए। आप दोनों भी कर सकते हैं: जेएस त्वरित प्रतिक्रिया प्रदान कर सकता है, लेकिन गणना जो वास्तव में सर्वर पर की जाती है।

जवाबों:


36

हमेशा की तरह, ऐसे निर्णयों में विभिन्न लक्ष्यों के बीच एक व्यापार-बंद शामिल होता है, जिनमें से कुछ एक-दूसरे के साथ संघर्ष करते हैं।

  • दक्षता का सुझाव होगा कि आप फ्रंट-एंड में गणना करते हैं - दोनों क्योंकि उपयोगकर्ता का कंप्यूटर अधिक शक्ति का उपयोग करता है और आपका सर्वर कम उपयोग करता है, और क्योंकि उपयोगकर्ता तेजी से प्रतिक्रिया देखता है, जिससे उपयोगकर्ता अनुभव में सुधार होता है।

  • सुरक्षा की मांग है कि कोई भी राज्य-बदलते संचालन क्लाइंट कंप्यूटर में जाँच या गणना किए जा रहे डेटा पर भरोसा नहीं कर सकता है , क्योंकि क्लाइंट कंप्यूटर दुर्भावनापूर्ण हमलावर के नियंत्रण में हो सकता है। इसलिए, आपको अविश्वसनीय स्रोत सर्वर-साइड से आने वाली किसी भी चीज़ को मान्य करना होगा

  • प्रोग्रामिंग दक्षता और स्थिरता बताती है कि व्यर्थ प्रयास के कारण आपको दो बार समान गणना नहीं करनी चाहिए।

सतही तौर पर ऐसा लगता है जैसे सब कुछ सर्वर-साइड किया जाना है, लेकिन ऐसा हमेशा नहीं होता है। यदि आप आसानी से डुप्लिकेट किए गए कोड को बनाए रख सकते हैं (जैसे कि आपके सर्वर-साइड जावा वैलिडेटर से एक जावास्क्रिप्ट-वैलिडेट ऑटो-जेनरेटर द्वारा), तो पुनरावृत्ति को दोहराने से अच्छा समाधान हो सकता है। यदि शामिल डेटा सभी महत्वहीन हैं, उदाहरण के लिए यदि उपयोगकर्ता केवल स्वयं को धोखा दे सकता है और आपको नहीं अगर वे मूल्यों में हेरफेर करते हैं, तो सर्वर-साइड सत्यापन आवश्यक नहीं है। यदि आपकी प्रतिक्रिया का समय पूरी तरह से अलग-अलग अड़चनों पर हावी हो जाता है ताकि एक दौर की यात्रा में देरी की संभावना न हो, तो यूएक्स विचार निर्णायक नहीं हैं, इसलिए आपको यह विचार करना होगा कि इनमें से प्रत्येक दबाव आपकी स्थिति में कितना मजबूत है, और इसके अनुसार निर्णय लें। ।


4
मैं जोड़ना चाहूंगा कि Programming efficiency and maintainability suggests that you shouldn't do the same computation twice because of the wasted effort.यह सही नहीं है क्योंकि [१] फ्रंट-एंड में सत्यापन उपयोगकर्ता को त्वरित प्रतिक्रिया प्रदान कर सकता है यदि आवश्यकता हो तो सुधार करने के लिए। [२] बैक-एंड में सत्यापन उतना उत्तरदायी नहीं है, और इस प्रकार उपयोगकर्ता को सुधार करने का सबसे अच्छा अवसर प्रदान नहीं करता है। उपयोगकर्ता को और अधिक काम करने के लिए इंतजार करना और फिर से करना होगा। इसलिए मुझे लगता है कि दोनों मान्यताएं समान नहीं हैं।
सूचित

9
यही कारण है कि मैं क्या नहीं चाहता था - स्थिरता का अर्थ है "अपने आप को दोहराना नहीं", और इस सिद्धांत के अनुसार पुनरावृत्ति निश्चित रूप से खराब है। यदि कोई अन्य विचार नहीं था, तो आपको ऐसा नहीं करना चाहिए। तथ्य यह है कि यह फिर भी अक्सर एक अच्छा विचार है क्योंकि वहाँ रहे हैं अन्य कारणों जो त्वरित बदलाव के माध्यम से इस सिद्धांत, यानी बेहतर प्रयोज्य खंडन।
किलन फ़ॉथ

@randomA आप उस सिद्धांत को गलत ठहरा रहे हैं, अगर आपका मतलब है कि सर्वर पर मान्य होने वाली किसी चीज़ की गणना केवल सर्वर पर की जानी चाहिए, क्योंकि यदि "सर्वर मान्य मूल्य" (या उस पर निर्भर कुछ भी) क्लाइंट को वापस कर दिया जाता है, तो सर्वर पर वापस भेजे गए किसी बिंदु पर, आपको इसे वैसे भी फिर से मान्य करना होगा - बेकार। या फिर आपको सुरक्षित संदर्भों की कुछ प्रणाली की आवश्यकता है, जो अभी तक अधिक अक्षम हो सकती है। मैं कहूंगा कि यदि आप ग्राहक पर कोई गणना कर सकते हैं, तो इसे ग्राहक पर करें , लेकिन कभी भी इस बात पर भरोसा न करें कि ग्राहक आपको क्या बताता है
गोल्डीलॉक्स

@goldilocks आपने जो बोल्ड किया है, वह वही है जो मैं भी सहमत हूं, आपको बैक-एंड पर सब कुछ मान्य करना होगा। मेरा कहना यह था कि: फ्रंट-एंड पर सत्यापन अधिक उत्तरदायी है, इसलिए बैक-एंड पर सत्यापन पूरी तरह से वैसा ही नहीं है।
सूचित

13

बैकएंड में गणना करने के लिए मजबूत कारण हैं

  • व्यावसायिक तर्क प्रस्तुति परत में नहीं है
  • जावास्क्रिप्ट में व्यापार तर्क एक खतरा बन गया है
  • आप मान लेते हैं कि एक-सामने-अंत -> एक-बैक-एंड-रिलेशनशिप जो हमेशा सही नहीं होता है , बैक-एंड्स को एक फ्रंट-एंड एप्लिकेशन से अधिक सक्षम या सेवारत माना जाना चाहिए, इस प्रकार आप कुछ भी ग्रहण नहीं कर सकते।
  • यदि गणना डेटा का एक बड़ा उपयोग करती है, तो इसे फ्रंट-एंड में पकड़ना कुशल नहीं होगा
  • यदि गणना डेटाबेस का उपयोग करती है, तो आप इसे आगे के अंत में दोहरा नहीं पाएंगे

मेरी सिफारिश

  • डेटाबेस में विदेशी कुंजी, प्राथमिक कुंजी, चेक बाधाओं और ट्रिगर सहित कई व्यावसायिक नियमों को लागू करें
  • जब व्यावसायिक नियम पूरे नहीं होते हैं, तो व्यावसायिक परत को छोड़ दें
  • यदि और केवल यदि प्रतिक्रिया समय अस्वीकार्य है, तो अजाक्स का उपयोग करके सत्यापन या प्रीप्रोसेसिंग करें (कार्य वास्तव में जावास्क्रिप्ट में नहीं किया जाएगा, यह पृष्ठ को फिर से लोड किए बिना बैकएंड में किया जाएगा)
  • आप जावास्क्रिप्ट में साधारण सत्यापन कर सकते हैं जैसे खाली मान, या मान जो बहुत लंबे हों, या सीमा से बाहर हों (बाद वाले के लिए आप बैक-एंड में रेंज जेनरेट करना चाहते हैं) कर सकते हैं

2
व्यावसायिक नियम लागू करने वाले डेटाबेस के साथ समस्या सामने के अंत में उल्लंघन की रिपोर्ट कर रही है! यदि सामने का अंत व्यावसायिक नियमों को लागू करता है, तो यह उपयोगकर्ता को सार्थक त्रुटि संदेशों की प्रतिक्रिया दे सकता है। यदि बैक-एंड करता है, तो सामने और पीछे के छोरों के बीच बहुत अधिक क्लूनी दो तरह से ट्रैफ़िक होता है क्योंकि एक समय में त्रुटियों की रिपोर्ट की जाती है।
जेम्स एंडरसन

@JamesAnderson अब "फ्रंट-एंड" नहीं है। एक ही डेटाबेस के कई फ्रंट-एंड हो सकते हैं, या कई डेटाबेस से कई फ्रंट-एंड हो सकते हैं। इसके अलावा, व्यवसाय के बैक-एंड लागू होने का मतलब यह नहीं है कि फ्रंट-एंड इसे करने के लिए निषिद्ध है। मैंने दूसरी बुलेट बिंदु में प्रकाश डाला।
ट्यूलेंस कोरडोवा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.