क्या HTTP रिक्वेस्ट / रिस्पांस ऑब्जेक्ट्स को अपरिवर्तनीय होना चाहिए?


10

मुझे लगता है कि यह कहना सुरक्षित है कि अधिकांश वेब अनुप्रयोग अनुरोध / प्रतिक्रिया प्रतिमान पर आधारित हैं। PHP में कभी भी इन वस्तुओं का औपचारिक अमूर्तन नहीं हुआ है। एक समूह इसे बदलने की कोशिश कर रहा है: https://github.com/php-fig/fig-standards/blob/master/proposed/http-message.md

हालांकि, उन्होंने अपरिवर्तनीयता के मुद्दे पर पक्ष रखा। एक ओर, अनुरोध / प्रतिक्रिया वस्तु को आम तौर पर उनके जीवन चक्र के दौरान बहुत कम परिवर्तन की आवश्यकता होती है। दूसरी ओर, विशेष रूप से प्रतिक्रिया ऑब्जेक्ट को अक्सर HTTP हेडर जोड़ने की आवश्यकता होती है।

इसके अलावा, अपरिवर्तनीयता वास्तव में कभी भी PHP की भूमि पर नहीं पकड़ी गई है।

अपरिवर्तनीय अनुरोध / प्रतिक्रिया वस्तुओं का उपयोग करने में लोगों को क्या फायदे मिलते हैं?


मान लीजिए कि आप एक वस्तु को वापस कर रहे हैं।

$response = new JsonResponse($item);

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

अनुरोध वस्तु थोड़ी अधिक रोचक है। यह उसी से शुरू होता है:

$request = new Request('incoming request information including uri and headers');

प्रारंभिक जानकारी को बदलने की आवश्यकता नहीं है। हालाँकि, जैसा कि अनुरोध के साथ पारित हो गया है, अक्सर अतिरिक्त प्रसंस्करण जानकारी जोड़ने की आवश्यकता होती है। उदाहरण के लिए, आपके पास एक url मिलानकर्ता हो सकता है जो यह निश्चय करता है कि दिए गए अनुरोध के लिए क्या कार्यवाही निष्पादित की जानी चाहिए।

$request->setAttribute('action',function() {});

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


यदि यह सिर्फ मूल अनुरोध / प्रतिक्रिया है, तो आपको उस वस्तु का एक क्लोन स्टोर कर सकते हैं, जो c'tor में सेट हो जाता है और फिर कभी भी दोबारा नहीं मिलता है। आप दूर उत्परिवर्तित कर सकते हैं लेकिन फिर भी जब भी जरूरत हो मूल का उपयोग कर सकते हैं। यह शायद बेहतर IMO होता।
एमपीएन

जवाबों:


4

अपरिवर्तनीय अनुरोध / प्रतिक्रिया वस्तुओं का उपयोग करने में लोगों को क्या फायदे मिलते हैं?

मैं @ मेनमा के बयान से सहमत हूं " मुझे यकीन नहीं है कि अगर पठनीयता का मामूली लाभ लचीलेपन की संभावित कमी की भरपाई करता है " और व्यक्तिगत रूप से मैं PHP HTTP Requestअस्थायी वस्तुओं या PHP HTTP Responseअस्थायी वस्तुओं को अपरिवर्तनीय होने के लिए कोई व्यावहारिक और उपयोगी पहलू नहीं देखता हूं

आवश्यकताओं के इन प्रकार के साथ काम करने पर कोई अनुभव?

  1. Microsoft की Windows Presentation Foundationरूपरेखा फ्रीज़ेबल वस्तुओं की अवधारणा का परिचय देती है । एक बार जम जाने के बाद ऐसी वस्तुएं बन जाती हैं

    • अपरिवर्तनीय (जब संशोधन का प्रयास किया जाता है तो अपवादों को फेंक दें),
    • तेजी से उपयोग करने के लिए (संपत्ति पाने वालों को किसी भी फैंसी "मेरे मूल्य क्या है?" कोई भी निर्णय लेने की आवश्यकता नहीं है),
    • कम मेमोरी (आंतरिक सहायक डेटा संरचनाएं और कैश आदि) का उपभोग करना उनके समय और अंतरिक्ष कुशल प्रतिनिधित्व को कम किया जा सकता है)
    • और साझा करने योग्य

    यद्यपि यह GUI गति अनुकूलन के रूप में उपयोग किया जाता है, अवधारणा स्वयं भी लागू होती है, जिसमें यह लाभ भी शामिल है

  2. Nancy(".Net और मोनो पर HTTP आधारित सेवाओं के निर्माण के लिए लाइटवेट, कम-समारोह, फ्रेमवर्क") के रूप में प्रतिबद्ध टिप्पणियों में से एक में अपरिवर्तनीयता के लाभ का वर्णन करता है।

    ... हम मान सकते हैं कि हमारे कैश अपरिवर्तनीय हैं यदि वे बंद हैं, जिसका मतलब है कि हमारे पास इतना तेज़ प्रदर्शन नहीं है (हालांकि हिट बड़े पैमाने पर है ...)

    मैं अचल स्थिति के बारे में किसी भी अन्य उल्लेखनीय टिप्पणी नहीं मिला है, लेकिन पुन: प्रयोज्य, संचित करने योग्य प्रतिक्रिया वस्तुओं के लाभ के लिए आवेदन कर सकते हैं PHPऔर साथ ही

ऊपर से ऑफ-टॉपिक उत्तर दिख सकते हैं, लेकिन मुझे किसी और चीज़ के बारे में पता नहीं है और इसीलिए मुझे लगता है कि अपरिवर्तनीयता की आवश्यकता एक कृत्रिम समस्या है, बल्कि वरीयता या कोडिंग स्टाइल आदि की बात है।


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

7

सामान्य रूप से अपरिवर्तनीय वस्तुओं के कई लाभ हैं।

  • सबसे महत्वपूर्ण यह है कि समानांतर में निष्पादित कोड में अपरिवर्तनीय वस्तुओं का उपयोग करना कितना आसान है। इससे यह भी पता चलता है कि "अपरिवर्तनीयता वास्तव में PHP की भूमि पर वास्तव में कभी नहीं पकड़ी गई है"

  • राज्य की स्थिरता प्राप्त करना आसान है।

  • वस्तुओं के साथ काम करने के लिए आसान, अधिक प्राकृतिक हैं।

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

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

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

दोनों मामलों में, यह देखते हुए कि समानांतर में कोई निष्पादन नहीं है, मुझे यकीन नहीं है कि पठनीयता का मामूली लाभ लचीलेपन की संभावित कमी की भरपाई करता है।

सुनिश्चित करें कि आप PSR-7 के बारे में एवर्ट पॉट द्वारा एक अधिक संपूर्ण लेख भी पढ़ें । लेख बताता है, दूसरों के बीच, उन मामलों में से एक जहां ऐसी अपरिवर्तनीयता समस्याग्रस्त है लंबी प्रतिक्रियाओं के लिए है जिसे स्ट्रीम किया जाना चाहिए । व्यक्तिगत रूप से, मुझे यह बिंदु दिखाई नहीं देता: IMHO, एक धारा को समाहित करने के लिए एक अपरिवर्तनीय वस्तु को मना नहीं करता है (उदाहरण के लिए, एक FileReaderवस्तु अपरिवर्तनीय हो सकती है, भले ही वह उस फ़ाइल को पढ़ ले जो समय के साथ बदल सकती है)। पायथन के फ्लास्क ढाँचे का उपयोग एक अलग दृष्टिकोण का उपयोग करता है जब यह एक पुनरावृत्ति करके बड़ी प्रतिक्रियाओं (या प्रतिक्रियाओं को उत्पन्न होने में समय लगता है) के लिए आता है।


1
एक लाभ जो IMO का उल्लेख करने योग्य है, वह यह है कि जब आपके पास अपरिवर्तनीय वस्तुएं होती हैं, तो आपको कभी भी अपने आप से यह पूछने की आवश्यकता नहीं होती है कि क्या आप एक निजी कॉपी के साथ काम कर रहे हैं, आप स्वतंत्र रूप से बदल सकते हैं या किसी अन्य वस्तु के स्वामित्व वाले संदर्भ में जहां परिवर्तन अन्य वस्तुओं को प्रभावित कर सकते हैं।
फिलिप

@Philipp: IMHO, Java.NET की सबसे बड़ी कमियों में से एक यह है कि नई वस्तुओं के संदर्भों में अंतर करने के लिए एक कन्वेंशन की कमी है जो कॉल करने वाले की इच्छा पर बदल सकते हैं, बनाम जो उन संदर्भों को वापस करते हैं जो आंतरिक से जुड़े होते हैं या उन्हें संलग्न करते हैं। वह अवस्था जिसे उस राज्य में हेरफेर करने के लिए संशोधित किया जा सकता है, और जो वस्तु के संदर्भ में लौटते हैं जो आंतरिक स्थिति से जुड़ा हो सकता है या हो सकता है। ऐसा कोड लिखना संभव नहीं है, जो यह जानने के बिना मजबूत और कुशल हो कि किस तरह की संदर्भ चीजें वापस आनी चाहिए, लेकिन यह संकेत देने के लिए कोई सम्मेलन नहीं है।
18

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