एक से अधिक भाषाओं में स्थिरांक का प्रबंधन कैसे किया जाना चाहिए?


13

मेरे पास एक ऐसी स्थिति है जहां मैं कई भाषाओं में कार्यात्मक रूप से एक ही पुस्तकालय का समर्थन करता हूं। अक्सर ऐसे स्थिरांक होते हैं जिन्हें इन दोनों के बीच साझा करने की आवश्यकता होती है (उदाहरण के लिए, json फ़ील्ड नाम कुंजियाँ या त्रुटि कोड)।

जिस तरह से मैं वर्तमान में ऐसा कर रहा हूं वह प्रत्येक भाषा में स्थिरांक को परिभाषित करने वाला कोड है।

रखरखाव में समस्या आती है। यदि मैं एक नया त्रुटि कोड जोड़ता हूं, तो मुझे इसे हर लाइब्रेरी में मैन्युअल रूप से अपडेट करना होगा। जबकि यह कुछ के लिए ठीक है अगर मुझे अपडेट करने के लिए 5 एसडीके हैं तो यह थकाऊ हो जाता है। इन के लिए सत्य का एक भी स्रोत होना अच्छा होगा।

मैंने किसी प्रकार की कॉन्फ़िगर-जैसी फ़ाइल के बारे में सोचा है, लेकिन फिर उसे हर तैनात पैकेज में शामिल करने की आवश्यकता है जो हमारी बिल्ड / रिलीज़ प्रक्रिया में जटिलता जोड़ता है।

क्या स्थिरांक के रखरखाव का एक बेहतर तरीका है जो कई भाषाओं के बीच साझा किया जाता है?


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

5
@DavidPacker नहीं नहीं नहीं, तुम मेरे लिए एक बहुत ही सुंदर समाधान होना चाहिए। मुझे मत बताओ यह सबसे अच्छा है! :-)
एंडरलैंड

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

आपको तालिकाओं की एक तालिका की आवश्यकता होती है जो भाषाओं की तालिकाओं से स्थिरांक की मैप करती है।
जॉनी

जवाबों:


10

हालांकि मुझे लगता है कि आपका वर्तमान दृष्टिकोण शायद सबसे सरल और सीधा है, यहां कुछ वैकल्पिक विचार हैं:

  • अपने स्थिरांक (और शायद मॉडल) को एक अलग पैकेज में निकालें जो आपकी सभी भाषाओं में क्रॉस-संकलित है। आप पूरी लाइब्रेरी को क्रॉस-कंपाइल करने में सक्षम हो सकते हैं, लेकिन यह पर्याप्त मात्रा में समस्याओं के साथ आ सकता है। बस क्रॉस-संकलित स्थिरांक काफी सरल होना चाहिए कि कई मुद्दे नहीं होंगे। आप अपने स्थिरांक पैकेज को प्रकाशित कर सकते हैं और अपनी भाषा-विशिष्ट पुस्तकालयों में इस पर निर्भर कर सकते हैं। हैक्स शायद कर सकते हैं। यह दृष्टिकोण अच्छा है क्योंकि आप अभी भी संकलन-समय की जाँच करेंगे (संकलित भाषाओं के लिए)
  • एक केंद्रीय सेवा में स्टोर कॉन्फ़िगरेशन। उदाहरण के लिए साबुन वेब सेवाओं में वेब सेवा विवरण भाषा (WSDL) और REST सेवाओं में वेब अनुप्रयोग विवरण भाषा (WADL) होती है जो सेवा के संचालन और संदेशों का वर्णन करती है। स्प्रिंग क्लाउड कॉन्फ़िगरेशन जैसी सामान्य केंद्रीकृत कॉन्फ़िगरेशन सेवाएँ भी हैं
  • विन्यास फाइल। मुझे पता है कि आप पहले से ही इसका सुझाव दे चुके हैं, लेकिन मुझे नहीं लगता कि इसे आपकी बिल्ड / रिलीज़ प्रक्रिया को जटिल बनाने की आवश्यकता है। अपनी कॉन्फिग फाइल को एक अलग बिल्ड प्रोजेक्ट (जहाँ आप इसे वर्जन कर सकते हैं) में रखें। अपनी सभी भाषा विशिष्ट पैकेज रिपॉजिटरी (Maven, Nuget, NPM, आदि) के लिए प्रोजेक्ट प्रकाशित करें, फिर अपनी भाषा-विशिष्ट लाइब्रेरी में आप पैकेज पर निर्भर रह सकते हैं। यह आपके बिल्ड पाइपलाइन में एक अतिरिक्त प्रोजेक्ट होने से अधिक जटिल नहीं होना चाहिए।
  • जैसा कि रबरडक ने सुझाव दिया था, कोड पीढ़ी क्रॉस-संकलन के लिए एक अच्छा विकल्प है। आप एक सामान्य कॉन्फ़िगरेशन का उपयोग करके प्रत्येक भाषा के लिए निरंतर परिभाषा उत्पन्न कर सकते हैं।

5
@RubberDuck कोड जनरेशन दिलचस्प लगता है (विशेष रूप से मेरे एक स्पर्शरेखा उपयोग के मामलों के लिए, जिसमें पहले से ही एक कोड जनरेटर वैसे भी शामिल है)।
एंडरलैंड

3

बड़ा अच्छा सवाल! मेरे पास एक ही सटीक मुद्दा है; मेरे स्थिरांक अनिवार्य रूप से हैं: मेरे अनुप्रयोगों में किन भाषाओं का समर्थन किया जाता है, और उन भाषाओं के बारे में अतिरिक्त जानकारी जो वे ऐप में कार्यक्षमता से संबंधित हैं।

दुर्भाग्य से, मैंने जो सबसे अच्छी चीज पाई है (जैसा कि आपके पास है) प्रत्येक भाषा के लिए बस फिर से परिभाषित करना है, जैसा कि आप वर्तमान में कर रहे हैं (मुझे पता है, आप निश्चित रूप से सुनना चाहते थे )।

जाहिर है यह गलत लगता है क्योंकि यह DRY ( WET ?? ) के विपरीत है । हालांकि, स्थिरांक को इतनी बार बदलना चाहिए कि प्रत्येक भाषा के लिए उन्हें फिर से परिभाषित करने के 5-10 मिनट वास्तव में मुझे परेशान नहीं करते हैं। दिन के अंत में, साझा विन्यास या कोड पीढ़ी जैसे कुछ 'सुरुचिपूर्ण' समाधान के साथ छोटे मुद्दों को हल करने में घंटों या दिन लग सकते हैं, इसलिए वास्तव में क्या प्राप्त हुआ है? कुछ गलत होने के जोखिम के साथ जटिलता जोड़ा गया है जो ठीक करने के लिए अतिरिक्त प्रयास कर सकता है, ऐसा कुछ नहीं है जिससे मैं निपटना चाहता हूं।

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

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

एक बात के लिए निश्चित रूप से करना है, हालांकि, सुनिश्चित करें कि आपके स्थिरांक कर रहे हैं अच्छी तरह से प्रलेखित एक सामान्यीकृत (और भाषा नास्तिक) में ढंग (हम, डॉक्स 'बोर्ड ड्राइंग', आदि चश्मा, विविध डॉक्स के साथ एक कंपनी documentarion रेपो है जहाँ हम रखने के इस दस्तावेज़)। यह भी सुनिश्चित करें कि उनकी परिभाषाओं को सिंक में रखने के लिए आपके पास तंत्र है। जानबूझकर कोड दोहराव से मनोवैज्ञानिक संकट की एक छोटी राशि को छोड़कर, आपके पास दोहराव दृष्टिकोण के रूप में बड़ी समस्या है। लेकिन अंत में, आपके निरंतर परिवर्तन बहुत जानबूझकर और अनियंत्रित होने चाहिए, इसलिए समकालिकता मुद्दे अनिवार्य रूप से शून्य होना चाहिए।


मुझे यह भी उल्लेख करना चाहिए कि वर्षों से, मैंने विभिन्न पुस्तकालयों के बहु-भाषा बंदरगाहों को देखा है (यह याद करने के लिए कि वे इस समय क्या हैं, यह याद रखने के लिए एक ही समूह द्वारा लिखे गए हैं) जो कि स्वयं भाषाओं में परिभाषित स्थिरांक हैं। कोई साझा कॉन्‍फ़िगर नहीं, कोई कोड जेनरेशन (Google API क्लाइंट लाइब्रेरी को छोड़कर ... लेकिन चलो, Google के पास इस तरह की जटिलता को वहन करने के लिए संसाधन हैं)। इसलिए मुझे लगता है कि हमने इस पर एक ईंट की दीवार को मारा है। हो सकता है कि कोई आखिरकार इस समस्या से निपटने के लिए एक पुस्तकालय के साथ आएगा;)


0

उम्मीद है, आप की लाइब्रेरी का मूल एक भाषा में लिखा गया है, और अन्य पुस्तकालय कोर लाइब्रेरी में कॉल करने के लिए FFI ( https://en.wikipedia.org/wiki/Foreign_function_interface ) का उपयोग करते हैं । यह आपको स्थिरांक और परिभाषाओं को प्रकाशित करने के लिए एक एपीआई प्रदान करने के लिए केंद्रीय स्थान प्रदान करेगा। इस तरह से पुस्तकालय के भीतर सब कुछ स्वयं समाहित है। मैं केवल इसका उल्लेख कर रहा हूं क्योंकि यह सैमुअल की प्रतिक्रिया में शामिल नहीं लगता है।

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


1
Hopefully, the core of you library is written in one language, and the other libraries use FFI दुर्भाग्य से हमारे पास एक वेब क्लाइंट और सर्वर कोड (कई भाषाओं में) दोनों के लिए पुस्तकालय हैं ... इसे बंद करने के लिए गैर-तुच्छ होगा (और यदि हम शुरू करने के लिए वेब ऐप में हो सकते हैं तो सुरक्षा भेद्यता)।
एंडरलैंड

मैं आपको सुझाव दूंगा कि आप अपनी सुरक्षा में सुधार करें, क्योंकि मैं अपने उपयोगकर्ताओं पर इतनी विश्वास नहीं करूंगा कि वे विन्यास फाइल को गुप्त रखें।
रॉबर्ट बैरन

आप वेब एप्लिकेशन कैसे तैनात करते हैं जो त्रुटि कोड को संभालते हैं? या json क्षेत्र के नाम? मैं उलझन में हूं कि आपको क्या लगता है कि मैं ऐसा कर रहा हूं जो एक सुरक्षा मुद्दा है। मेरे मुवक्किल की मशीन पर मनमाना कोड चलाना पूरी तरह से एक सुरक्षा समस्या है, जब तक कि वे सर्वर से जोंस को पार्स करने की अनुमति नहीं देते हैं जब तक कि कुछ गायब न हो।
एंडरलैंड

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

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