दो भाषाओं में लिखे गए कोडबेस को बनाए रखने के कुछ तरीके क्या हैं जो एक ही तर्क को लागू करते हैं?


10

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

इसके अलावा, मैं यह सुनिश्चित करना चाहता हूं कि जब यह कोड हाथ बदलेगा, तो अंततः इसे नए प्रोग्रामर को अभिभूत नहीं करना चाहिए।

इस परिदृश्य को देखते हुए, कुछ तरीके क्या हैं जो कोडबेस को बनाए रखने और उन्हें सिंक में रखने में मदद करेंगे? वैसे तो मेरा मतलब है सॉफ्टवेयर टूल्स, बेस्ट प्रैक्टिस आदि।

FYI करें दो भाषाएं C ++ और Java हैं। एंड्रॉइड सहित "बाकी सब" के लिए विंडोज / लिनक्स और जावा के लिए सी ++।


3
क्या आपको वास्तव में इसे किसी अन्य भाषा में लागू करना है? सिर्फ जावा का उपयोग क्यों नहीं?
ओलेक्सी

@ ओलेक्सी कोड सबसे अच्छा है जब यह मूल रूप से चलता है तो जावा केवल एक समझौता था जहां सी ++ का उपयोग नहीं किया जा सकता है।
विआन

13
बस यह सुनिश्चित करें कि आपको उस प्रदर्शन की आवश्यकता है। एक कार्यक्रम के दो संस्करणों को बनाए रखना (विशेष रूप से यह एक जटिल), एक कोलोसेबल प्रयास है। सुनिश्चित करें कि आप सुनिश्चित बिल्कुल , C ++ ऐसा करने की जरूरत है क्योंकि अपना समय और दो भाषाओं में ऐसा करने के प्रयास में एक बड़ी लागत का भुगतान करने जा रहे हैं।
ओलेक्सी

9
जैसा कि @ ओलेक्सी ने कहा - अगर यह जावा में एक ड्रॉड पर स्वीकार्य रूप से चलता है, तो मैं सोच भी नहीं सकता कि पीसी को (शायद सीमांत) सुधार सी ++ की जरूरत होगी। जैसा कि आपने कहा नहीं है कि आपने प्रदर्शन परीक्षण चलाए हैं, मेरा मानना ​​है कि इस स्थिति में समय से पहले अनुकूलन नहीं होता है। जावा में लिखें, प्रदर्शन परीक्षण चलाएं, जावा को अनुकूलित करें। इसके बाद ही C ++ को फिर से लिखें - एक कोड आधार बनाए रखने में समय की बचत, इसके बजाय ऑप्टिमाइज़्मेशन में डालें, निश्चित रूप से दो कोड बेस, सब कुछ (आवश्यकताओं को छोड़कर) के दो सेट बनाए रखने का प्रदर्शन करेंगे।
मटनज

@thePirtProject परिभाषित सबसे अच्छा चलाता है , या तो मामले में (C ++ या जावा) अच्छी तरह से लिखा कोड पोर्टेबल होना चाहिए

जवाबों:


16

संक्षिप्त उत्तर: ऐसा तब तक न करें जब तक कि पूरी तरह से मजबूर न किया जाए।

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

यदि आप बिल्कुल ऐसा नहीं कर सकते हैं, और दो कोड आधार होना चाहिए, तो यहां तीन सुझाव दिए गए हैं:

1) एक उपकरण के लिए देखो जैसे एकता पोर्टेबल सॉफ्टवेयर की ओर गियर है।

2) कोड के जटिल बिट्स को डेटा, या कुछ स्क्रिप्टिंग भाषा में खींचने की कोशिश करें। यदि आप स्क्रिप्टिंग भाषा से निपटने के लिए काफी सामान्य कोड लिख सकते हैं, तो परीक्षण करना और दो बार सही होना आसान है। (खासकर अगर यह किसी और द्वारा बनाई गई एक मानक भाषा है।) तो आपके पास जटिल बिट्स के लिए एक कोडबेस हो सकता है। (आप Lua की कोशिश कर सकते हैं, जो एम्बेड करने की दिशा में सक्षम है।)

3) अन्य उत्तर के रूप में, दोनों कोड सेट को मान्य करने के लिए एक परीक्षण सूट बनाएं। ध्यान दें कि यह सही पाने के लिए वास्तव में कठिन है। ठीक ऐसा करने के बाद, मैं आपको बता सकता हूं कि यह बहुत सारी बहसें करता है कि कौन सा संस्करण "सही" है, विशेष रूप से त्रुटि मामलों में।

(2) और (3) का एक साथ उपयोग किया जा सकता है।


4
अच्छे अंक। एक और बात के बारे में सोचने के लिए प्रतिगमन परीक्षणों का एक सेट लिख रहा है और इसके साथ दोनों कार्यान्वयन का परीक्षण कर रहा है (जैसे SWIG के माध्यम से)।
जेम्स यंगमैन

15

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


4

आप मशीन कोड और जावा बाइट कोड में संकलित कर सकते हैं या तो पहले जावा और सी ++ या सीधे में बदल सकते हैं। अंतिम बार मैंने जाँच की कि एलएलवीएम में दोनों के लिए बैक-एंड हैं

संपादित करें: थोड़ा सा सर्फ़िंग मुझे जीसीजे में मिला जो जावा को मशीन कोड में संकलित कर सकता है


4

मेरी राय में, एक प्रोग्रामर के लिए सबसे महत्वपूर्ण नियम है, "खुद को दोहराएं नहीं"। आप जो सुझाव देते हैं वह इस नियम का स्पष्ट उल्लंघन है।

मैं गंभीरता से सुझाव दूंगा कि आप केवल एक बार एल्गोरिथ्म को लागू करने का एक तरीका खोजें। मैं वर्तमान में दो अलग-अलग तरीकों के बारे में सोच सकता हूं।

  • डोमेन विशिष्ट भाषा का उपयोग करें। हो सकता है कि एल्गोरिथ्म को एक अलग भाषा में बेहतर रूप से व्यक्त किया जा सकता है, उदाहरण के लिए एक स्क्रिप्ट भाषा, जिसके लिए एक पार्सर उन सभी प्लेटफार्मों पर मौजूद हो सकता है जिन्हें आप एप्लिकेशन को चलाने की उम्मीद करते हैं, या आप DSL कोड के आधार पर C ++ / Java कोड उत्पन्न कर सकते हैं।

  • C ++ में सब कुछ लिखें। C ++ को लगभग किसी भी प्लेटफॉर्म पर संकलित किया जा सकता है। यदि कुछ प्लेटफार्मों पर आपको जावा में लिखे जाने वाले मुख्य एप्लिकेशन की आवश्यकता होती है, तो मुझे लगता है कि यह एक मूल पुस्तकालय को कॉल करना संभव है (मैं जावा में बहुत जानकार नहीं हूं, लेकिन मुझे लगता है कि यह किया जा सकता है)।

दो अलग-अलग प्लेटफार्मों पर एक ही एल्गोरिदम को बनाए रखने से केवल दर्द और कीड़े हो सकते हैं।


मुझे लगता है कि आपकी राय में एक ऑपरेटिंग सिस्टम होना चाहिए, कार्यालय उत्पादकता सूट पर, एक वीडियो प्लेयर सॉफ्टवेयर पैकेज ........
मैटनज़

1
@mattnz - आपने मेरी बात को गलत समझा है। मैं "DRY" के प्रोग्रामिंग सिद्धांत की बात कर रहा हूँ। यह सिद्धांत किसी भी तरह से यह नहीं बताता है कि केवल एक ऑपरेटिंग सिस्टम, ऑफिस सूट आदि होना चाहिए। आप DRY से चिपके रहते हुए आसानी से कई प्लेटफार्मों के लिए उत्पाद तैयार कर सकते हैं।
पीट

2

एक सामान्य बाहरी परीक्षण सूट का उपयोग करने के लिए उत्कृष्ट सलाह के अलावा आप साक्षर प्रोग्रामिंग में देखना चाहते हैं । साक्षर प्रोग्रामिंग उपकरण आपको एक ही स्रोत फ़ाइल से कई फ़ाइलों का उत्पादन करने की क्षमता देते हैं।

एलपी का पारंपरिक उपयोग आपको कोड के साथ दस्तावेज़ीकरण को एक तरीके से करने की अनुमति देता है जो आपको दस्तावेज़ को स्रोत कोड के बहुत करीब रखने की अनुमति देता है । एक नोएब फ़ाइल (उदाहरण के लिए) का उपयोग डॉक्यूमेंटेशन फ़ाइल उत्पन्न करने के लिए किया जा सकता है, जिसे LaTex का उपयोग करके एक बड़े दस्तावेज़ में संकलित किया जा सकता है, और एक .cppऔर .hफ़ाइल का उत्पादन किया जा सकता है जिसे आपके आवेदन में संकलित किया जा सकता है।

आपके मामले में, यह आपको कोड और दस्तावेज दोनों को एक साथ रखने की अनुमति दे सकता है, एक .javaफ़ाइल का निर्माण भी कर सकता है।

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


2

यह एक अच्छा उदाहरण है जहां परीक्षण मददगार हो सकते हैं।

मेरा सुझाव है कि एक एकल परीक्षण सूट है जो आपके दोनों कोड आधार के खिलाफ चलता है। तब आपको पता चलता है कि आपका कोड दोनों एक ही विनिर्देशन के अनुरूप है!

(और, अच्छा परीक्षण कवरेज है!)



0

अस्वीकरण

जैसा कि पिछले, पदों में उल्लेख किया गया है, यदि आपके पास वास्तव में कोई और विकल्प नहीं है, तो।

उत्तर

एकल उत्तर के बजाय कई व्यावहारिक सुझाव:

(1) समान संरचनाओं का उपयोग करें, भले ही, एक ही सामान अलग किया जा सकता है।

उदाहरण: मुझे "ऑब्जेक्ट पास्कल" और "सी ++" में समान कोड होना चाहिए, जहां "अगर" वाक्य दोनों में मौजूद है, तो "सी ++" में कोष्ठक की आवश्यकता है, लेकिन, "ऑब्जेक्ट पास्कल" में नहीं।

// Object Pascal
...
if MyBollExpression
begin
  ...
end;
...

// C++
...
if (MyBollExpression)
{
  ...
}
...

में परिवर्तित किया गया:

// Object Pascal
...
if (MyBollExpression)
begin
  ...
end;
...

// C++
...
if (MyBollExpression)
{
  ...
}
...

दोनों भाषाओं में कोष्ठक जोड़ा गया। एक और मामला वैकल्पिक नामस्थान बनाम आवश्यक नामस्थान ("पैकेज") होगा।

(3) पहचानकर्ता के नाम, केस सेंसिटिविटी, विशेष प्रकार, समान रखें, उपनाम का उपयोग करें, उपवर्ग, रैपिंग:

// Java
// 
import java.io.*;

...
System.out("Hello World\n");
...

// C++
// 
include <iostream>

...
cout << "Hello World\n";
...

में:

// Java
// 
import java.io.*;

static class ConsoleOut
{
   void Out(string Msg)
   {
     System.out("Hello World\n");
   }
}

...
ConsoleOut MyConsole = new ConsoleOut();
...
MyConsole.out("Hello World\n");
...

// C++
// 
include <iostream>

public class ConsoleOut
{
   void Out(string Msg)
   {
     cout << "Hello World\n";
   }
}

...
ConsoleOut MyConsole = new ConsoleOut();
...
MyConsole.out("Hello World\n");

...

सारांश

मुझे आमतौर पर कई प्रोग्रामिंग भाषाओं के साथ काम करना पड़ता है, और कुछ कस्टम "कोर" लाइब्रेरी हैं, जिन्हें मैं कई प्रोग्रामिंग भाषाओं में रखता हूं।

शुभ लाभ।

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