क्या बाहरी कमांड-लाइन एप्लिकेशन को कॉल करना बेहतर है या उस एप्लिकेशन के तर्क को आंतरिक बनाना है?


10

मेरे पास एक "पाइपलाइन" प्रकार की प्रक्रिया है जो अनिवार्य रूप से एक वर्कफ़्लो को स्वचालित करने के लिए मौजूदा टूल के एक गुच्छा को एक साथ जोड़ना है। चरणों में से एक के लिए, एक मौजूदा कमांड-लाइन टूल है जो पहले से ही मांस करता है कि उस चरण को क्या करना है।

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

सवाल यह है कि क्या केवल बाहरी प्रक्रिया को कॉल करना और आह्वान करना बेहतर विचार है, या यह बेहतर होगा कि अपने आवेदन में बाहरी कोड को एकीकृत किया जाए?

बाहरी प्रक्रिया को एकीकृत करने बनाम कॉल करने के पक्ष / विपक्ष क्या हैं?


क्या कमांड-लाइन टूल कुछ ऐसा है जिसे आप नियंत्रित करते हैं, या यह किसी अन्य पार्टी द्वारा विकसित किया गया है?
whatsisname

यह ओपन सोर्स (मोज़िला लाइसेंस) dcm4che DICOM टूलकिट है, इसलिए इसे किसी अन्य पार्टी द्वारा विकसित किया गया है, लेकिन मैं इसके साथ बहुत कुछ कर सकता हूं जो भी मैं चाहता हूं।
cdeszaq

जवाबों:


12

क्या केवल बाहरी प्रक्रिया को कॉल करना और आह्वान करना एक बेहतर विचार है, या मेरे आवेदन के भीतर बाहरी कोड को एकीकृत करना बेहतर होगा?

यह है बहुत इन बातों को एकीकृत करने के लिए बेहतर है।

कमांड-लाइन इंटरफ़ेस सिर्फ एक इंटरफ़ेस है, और विशेष रूप से भयानक है। यह आवश्यक है, लेकिन यह भी quirks और सीमाओं से भरा है जो समझदार नहीं हैं।

प्रत्येक "मौजूदा उपकरण एक वर्कफ़्लो को स्वचालित करने के लिए" एक सुव्यवस्थित वर्ग होना चाहिए जो कमांड-लाइन विकल्पों को पार्स किए जाने के बाद वास्तविक कार्य करता है।

आदर्श रूप से, public static void mainफ़ंक्शन उन "मौजूदा टूल" में से प्रत्येक में दो चीजें करता है।

  1. यह कुछ कमांड-लाइन विकल्प / तर्क पार्सर को आमंत्रित करता है।

  2. यह असली काम करने वाले सुव्यवस्थित वर्ग को आमंत्रित करता है। एक चींटी कार्य या एक मावेन कार्य के बारे में सोचें जो चींटी या मावेन के बाद वास्तविक कार्य करता है और सभी निर्णय और निर्णय लेने की जिम्मेदारी संभालता है।

जब आप इन चीजों को एकीकृत करने के लिए जाते हैं, तो आप चाहते हैं कि असली काम करने वाले साफ-सुथरे वर्ग हों।

यदि वे मौजूद नहीं हैं, तो आपको उन सभी टूलों को फिर से लिखना होगा, जो सभी कमांड-लाइन पार्सिंग से अलग, वास्तविक काम करता है।

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


मेरे मामले में, काम करने वाला वर्ग संपूर्ण उपकरण है, और इसमें mainविधि, सीएलआई-पार्स तरीके आदि शामिल हैं, बल्कि यह बहुत बुरा है :(
cdeszaq

@ LCDeszaq: उस मामले में, इसे ठीक करने की आवश्यकता है। यह बहुत कठिन रूप से कठिन पुनर्लेखन नहीं है, और यह किया जाना चाहिए।
S.Lott

3
मुझे लगता है कि आपके समय सीमा के आधार पर, आप मौजूदा सीएल इंटरफेस के साथ एकीकृत कर सकते हैं और समय के साथ एक ठीक से एकीकृत समाधान पर पोर्ट कर सकते हैं। लेकिन अगर आपके पास अभी इसे ठीक करने का समय है, तो ऐसा करें :-)
Martijn Verburg

1
@MartijnVerburg: अच्छी बात है। अक्सर, एक स्पष्ट प्राथमिकता होती है। वर्कफ़्लो में से कुछ अधिक कसकर एकीकृत है या संभवतः "उप-वर्कफ़्लो" के रूप में एक अलग उपयोग हो सकता है। यह सबसे मूल्यवान से कम से कम मूल्यवान तक rework के एक बैकलॉग को जन्म दे सकता है।
S.Lott

मेरे पिछले नियोक्ता में हमें एक उपयोगिता निर्गमन को निष्पादित करने में समस्या थी (हम लेकिन मेरे कोड बिल्कुल नहीं)। "वरिष्ठ" डेवलपर का निदान करने में मदद करना कि यह निर्वासन निष्पादित क्यों नहीं होगा मैंने सुझाव दिया कि इसे लिखने के लिए एक बैट फाइल लिखी जाए। इसने काम कर दिया। उन्होंने समस्या की तलाश बंद कर दी और कहा कि यह दरवाजे से बाहर कैसे गया। सबक मैंने सीखा है 1. कभी भी किसी को समस्या का निवारण करने के लिए एक बुरे विचार का प्रस्ताव न दें जो निर्णय करता है। 2. पुस्तकालयों का उपयोग करें या जितना संभव हो अपने स्वयं के तर्क को आंतरिक करें। उस "फिक्स" में कुछ मशीनों पर तकनीकी सहायता के मेजबान की लागत होती है। उन्होंने यह भी परीक्षण या स्रोत नियंत्रण में कोई आश्चर्य की बात पर विश्वास नहीं किया ...
ऋग

8

मैं कहूंगा कि अगर यह काम करता है तो इसे अकेला छोड़ दो।

एक प्रोग्रामर के रूप में आप सॉफ्टवेयर के साथ समस्याओं को हल करके अपने संगठन के लिए मूल्य लाते हैं। एक निश्चित समय के भीतर गुणवत्ता और मात्रा दोनों में अधिक समस्याओं को हल करना सीधे संगठन में आपके मूल्य से संबंधित है। कोड बनाने के लिए इस समय को खर्च करने से आपका मूल्य कम हो जाता है क्योंकि यह आपको अधिक महत्वपूर्ण समस्या को हल करने से दूर ले जाता है।

हालाँकि, कुछ ऐसे कारक जो समय व्यतीत करने को कम कर सकते हैं वे स्केलेबिलिटी होंगे और अगर बाहरी कार्यक्रमों की स्थिरता के लिए कोई चिंता थी।


मैं सहमत हूँ। आप अपने ऐप में 3 पार्टी कार्यक्रमों / कोड को एकीकृत करने की कोशिश में अपने आप को बहुत तकलीफ के लिए खोल सकते हैं। कभी-कभी यह आवश्यक होता है लेकिन, जैसा कि कहा जाता है, "अगर यह टूट नहीं गया है, तो इसे ठीक न करें"
jfrankcarr

5
समस्याओं का समाधान महान है। अन्य समस्याओं के लिए दरवाजा खोलते समय कुछ समस्याओं का समाधान करना इतना महान नहीं है।
yfeldblum

5

यह "बेहतर" या "बदतर" नहीं है। बस अलग-अलग लागत और लाभ हैं।

सॉफ़्टवेयर का एक टुकड़ा लिखना और बनाए रखना अक्सर अधिक महंगा होता है, एकीकरण की संख्या जितनी अधिक हो जाती है, उतनी जटिलता जुड़ जाती है।

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

ध्यान दें कि ये एकीकरण लागतें हैं जिन्हें आपको कुल लागत के मुकाबले तौलना पड़ता है जिसमें सॉफ्टवेयर लिखने और रखरखाव के लिए अन्य चीजें शामिल हैं।

यह मामला हो सकता है कि आप एक बहुत ही अनुभवहीन प्रोग्रामर हैं, लेकिन लंबे समय से बिजली उपयोगकर्ता हैं।

  • यदि आप "शेल आउट" करने वाले थे, तो उच्च एकीकरण लागत के बावजूद आपकी कुल लागत कम हो सकती है, क्योंकि आप अपने अनुभव और ज्ञान के साथ एकीकरण लागत को कम कर सकते हैं।
  • यदि आप फ़ंक्शन को स्वयं लिखना चाहते थे, तो आपकी अनुभवहीन प्रोग्रामिंग के कारण कम एकीकरण लागत के बावजूद आपकी कुल लागत काफी अधिक हो सकती है।

सबसे अच्छा तरीका यह पता लगाने के लिए:

क्या बाहरी कमांड-लाइन एप्लिकेशन को कॉल करना बेहतर है या उस एप्लिकेशन के तर्क को आंतरिक बनाना है?

अपने लिए लागतों की गणना करने के लिए है। लागत अलग-अलग वातावरण, स्थितियों और लोगों के लिए अलग-अलग होगी। अधिकांश समय इसे कमांड लाइन पर कॉल करने के लिए अधिक खर्च होगा, लेकिन हमेशा नहीं और एकमात्र तरीका यह सुनिश्चित करने के लिए विश्लेषण करना होगा।


मेरे मामले में, यह अनिवार्य रूप से एक बाहरी अनुप्रयोग है कि है होता है खुला स्रोत और जावा में लिखा है, जैसे होने के लिए मेरी आवेदन। दुर्भाग्य से, वहाँ नहीं है बस एक पुस्तकालय बाहरी अनुप्रयोग का उपयोग करता है, के बाद से है कि पुस्तकालय में ही इंटरफ़ेस CLI में कसकर आ जाते हैं। इसके अलावा, सभी अच्छे अंक।
cdeszaq

1

आदर्श रूप से आप इसे एकीकृत करना चाहेंगे। खासकर यदि यह एक ऐसा ऐप है जो वितरित हो जाता है - निर्भरता और कॉन्फ़िगरेशन की संख्या कम करने से यह आसान हो जाएगा। लेकिन निश्चित रूप से यह आपके विशिष्ट मामले के लिए एक लागत / लाभ का मुद्दा है।

उस ने कहा, एक बात पर विचार करना स्थिरता है। मैंने कुछ साल पहले कुछ इसी तरह का सामना किया और क्ली कार्यक्रम को जगह पर रखा। यह बहुत अस्थिर था, और मैं नहीं चाहता था कि इसके दुर्घटनाग्रस्त होने पर माता-पिता के आवेदन को नीचे ले जाया जाए, जिसे 24/7 चलाने की आवश्यकता थी। अब यह एक जावा ऐप नहीं था, लेकिन कोई भी कम नहीं, अगर इसका एक मुद्दा जो आपको लागू कर सकता है, तो आप इसे ध्यान में रख सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.