में अत्यधिक दोहराव कोड और दस्तावेज़ीकरण का प्रबंधन करना बेहद दोहराव कोड आम तौर पर एक बुरी चीज है, और ऐसे डिज़ाइन पैटर्न हैं जो इसे कम करने में मदद कर सकते हैं। हालांकि, कभी-कभी भाषा की बाधाओं के कारण यह अनिवार्य है। प्रलेखन/विधि हस्ताक्षर में बहुत कम बदलाव लेकिन ठीक उसी विधि शरीर, एक जड़ से प्रत्येक के लिए साथजावा
/**
* Assigns the specified long value to each element of the specified
* range of the specified array of longs. The range to be filled
* extends from index <tt>fromIndex</tt>, inclusive, to index
* <tt>toIndex</tt>, exclusive. (If <tt>fromIndex==toIndex</tt>, the
* range to be filled is empty.)
*
* @param a the array to be filled
* @param fromIndex the index of the first element (inclusive) to be
* filled with the specified value
* @param toIndex the index of the last element (exclusive) to be
* filled with the specified value
* @param val the value to be stored in all elements of the array
* @throws IllegalArgumentException if <tt>fromIndex > toIndex</tt>
* @throws ArrayIndexOutOfBoundsException if <tt>fromIndex < 0</tt> or
* <tt>toIndex > a.length</tt>
*/
public static void fill(long[] a, int fromIndex, int toIndex, long val) {
rangeCheck(a.length, fromIndex, toIndex);
for (int i=fromIndex; i<toIndex; i++)
a[i] = val;
}
ऊपर टुकड़ा स्रोत कोड में प्रकट होता है 8 बार,: java.util.Arrays
से निम्न उदाहरण लें सरणी प्रकार int[]
, short[]
, char[]
, byte[]
, boolean[]
, double[]
, float[]
, और Object[]
।
मेरा मानना है कि जब तक कोई प्रतिबिंबित नहीं करता है (जो स्वयं में एक पूरी तरह से अलग विषय है), यह पुनरावृत्ति अपरिहार्य है। मैं समझता हूं कि एक उपयोगिता वर्ग के रूप में, दोहराव वाले जावा कोड की उच्च सांद्रता अत्यधिक असामान्य है, लेकिन सर्वोत्तम अभ्यास के साथ भी, पुनरावृत्ति होती है! रिफैक्टरिंग हमेशा काम नहीं करती है क्योंकि यह हमेशा संभव नहीं होती है (स्पष्ट मामला तब होता है जब पुनरावृत्ति दस्तावेज में होती है)।
स्पष्ट रूप से इस स्रोत कोड को बनाए रखना एक दुःस्वप्न है। प्रलेखन में एक मामूली टाइपो, या कार्यान्वयन में मामूली बग, हालांकि कई बार दोहराया गया है। वास्तव में, सबसे अच्छा उदाहरण इस सटीक वर्ग को शामिल करने से होता है:
बग क्या बहुत से विचार सिर्फ एक सरल और सीधा एल्गोरिथ्म होने के लिए होने वाली है, एक आश्चर्यजनक रूप से सूक्ष्म से एक है।
// int mid =(low + high)/2; // the bug
int mid = (low + high) >>> 1; // the fix
ऊपर लाइन स्रोत कोड में 11 बार प्रकट होता है!
तो मेरी प्रश्न हैं:
- दोहराए जावा कोड/दस्तावेज के इन प्रकार के व्यवहार में नियंत्रित किया जाता है कैसे? वे कैसे विकसित, रखरखाव और परीक्षण कर रहे हैं?
- क्या आप "मूल" से शुरू करते हैं, और इसे यथासंभव परिपक्व बनाते हैं, और फिर आवश्यकतानुसार प्रतिलिपि बनाते हैं और उम्मीद करते हैं कि आपने कोई गलती नहीं की है?
- और यदि आपने मूल में कोई गलती की है, तो बस इसे हर जगह ठीक करें, जब तक कि आप प्रतियों को हटाने और पूरी प्रतिकृति प्रक्रिया को दोहराने में सहज न हों?
- और आप परीक्षण कोड के लिए भी यही प्रक्रिया लागू करते हैं?
- जावा इस प्रकार की चीज़ के लिए सीमित प्रकार के स्रोत कोड प्रीप्रोकैसिंग से किसी प्रकार से लाभान्वित होगा?
- शायद सूर्य का अपना प्रीप्रोसेसर लिखने, बनाए रखने, दस्तावेज और इस प्रकार के दोहराव वाले पुस्तकालय कोड की जांच करने में मदद करने के लिए है?
एक टिप्पणी एक और उदाहरण का अनुरोध किया है, इसलिए मैं गूगल संग्रह से एक खींच लिया: com.google.common.base.Predicates लाइनों 276-310 (AndPredicate
) लाइनों 312-346 (OrPredicate
) बनाम।
इन दो वर्गों के लिए स्रोत, समान हैं के लिए छोड़कर:
AndPredicate
बनामOrPredicate
"And("
(प्रत्येक अपनी श्रेणी में 5 बार दिखाई देता है) (संबंधितtoString()
तरीकों में) बनामOr("
#and
बनाम#or
(@see
जावाडोक टिप्पणियों में)true
बनामfalse
(apply
में;!
hashCode()
ऐसा लगता है कि आप आदिम सरणी को संभालने के लिए कोड के कारण पुनरावृत्ति के बारे में विशेष रूप से चिंतित हैं। व्यक्तिगत रूप से, मैं सामान्य रूप से जरूरी होने तक, सरणी और प्राइमेटिव दोनों से बचने, जेनेरिक संग्रह और ऑटोबॉक्सिंग का उपयोग करके इस तरह के पुनरावृत्ति (और दूसरों को ऐसा करने के लिए प्रोत्साहित करता हूं) से बचता हूं। क्या आपके पास इस पुनरावृत्ति के कोई उदाहरण हैं कि * आदिम सरणी शामिल नहीं हैं? अच्छी पोस्ट के लिए –
+1 और http://netlib.bell-labs.com/cm/cs/pearls/ – stacker
पूर्ण ओवरलोड प्रदान करने के कारण पुनरावृत्ति केवल एक उदाहरण है। मैंने गैर-ओवरलोडिंग और गैर-आदिम सरणी हैंडलिंग परिदृश्यों में भी इस तरह की पुनरावृत्ति देखी है। – polygenelubricants