क्या यह एक प्रतीकात्मक निरंतर ओवरकिल का उपयोग है?


34

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

for (int i = 0; i < 8; i++){
    for (int j = 0; j < 8; j++){

जबकि उन्होंने जोर देकर कहा कि यह बजाय होना चाहिए

for (int i = 0; i < CHESS_CONST; i++){
    for (int j = 0; j < CHESS_CONST; j++){

कुछ बेहतर प्रतीक नाम के साथ जिन्हें मैं अभी सोचने के लिए परेशान नहीं कर सकता।

अब बेशक मुझे पता है कि आमतौर पर मैजिक नंबरों का उपयोग करने से बचते हैं, लेकिन मुझे ऐसा लगता है

  1. यह संख्या कभी नहीं बदलेगी;
  2. नाम वैसे भी वर्णनात्मक नहीं हो सकता है क्योंकि पूरे कोड में कई स्थानों पर संख्या का उपयोग किया जाता है; तथा
  3. शतरंज कार्यक्रम के लिए स्रोत कोड के माध्यम से जाने वाले किसी व्यक्ति को शतरंज के बारे में पर्याप्त जानना चाहिए क्योंकि यह जानने के लिए कि 8 क्या है,

वास्तव में प्रतीकात्मक स्थिरांक की कोई आवश्यकता नहीं है।

तो आप लोग क्या सोचते हैं? क्या यह ओवरकिल है, या मुझे सिर्फ सम्मेलन के साथ जाना चाहिए और एक प्रतीक का उपयोग करना चाहिए?


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

43
व्यक्तिगत रूप से, जो मुझे जादू की संख्या की तुलना में बहुत अधिक परेशान करता है वह नाम है iऔर jलूप चर के लिए। मैं अपने जीवन के लिए यह पता नहीं लगा सकता कि कौन सा व्यक्ति रैंक का प्रतिनिधित्व करने वाला है और कौन सा फाइल का प्रतिनिधित्व करने वाला है। रैंक 1..8 से लेकर और फ़ाइलों a..h से लेकर, लेकिन आपके मामले में, दोनों iऔर j0..7 से लेकर, तो मदद नहीं करता है कि मुझे देखने जो जो है। वहाँ कुछ अंतरराष्ट्रीय पत्र कमी संकट के बारे में मैं नहीं जानता है, या जो उनके लिए नाम बदलने के साथ कुछ गलत है rankऔर file?
जोर्ग डब्ल्यू मित्तग

4
एक दूसरे के लिए शैतान के वकील खेलें; किसी के शतरंज कोड को पढ़ने की कल्पना करें जहां उन्होंने एक जादू नंबर 8 का उपयोग किया है। क्या आप मान सकते हैं कि आप जानते हैं कि यह किसके लिए उपयोग किया जाता है? आप 100% कैसे सुनिश्चित हो सकते हैं? क्या कोई संभावना है कि इसका अर्थ कुछ और हो सकता है? यदि आप एक धारणा बनाने के लिए भी नहीं किया था, तो क्या यह सिर्फ थोड़ा सा अच्छा नहीं होगा? आपका अनुमान सही है या नहीं, यह जानने के लिए आपको कोड के माध्यम से ट्रेसिंग में कितना समय देना होगा? क्या आप कम समय बिताएंगे, अगर कोड इसके बजाय सार्थक, आनंददायक नाम का उपयोग करते हुए अधिक स्व-दस्तावेजीकरण किया गया हो?
बेन कॉटरेल

16
@ जैक्सबी: वास्तव में। 8 रैंक, 8 फाइलें, 8 प्यादे हैं। कुछ शतरंज इंजन एक बिंदु प्रणाली का उपयोग करते हैं जहां कुछ टुकड़े, कुछ क्षेत्र, और कुछ चालों में उनसे जुड़े बिंदु होते हैं और इंजन उच्चतम स्कोर के साथ चाल चुनता है। 8 ऐसा स्कोर हो सकता है। 8 एक डिफ़ॉल्ट खोज गहराई हो सकती है। यह बहुत ज्यादा कुछ भी हो सकता है।
जोर्ग डब्ल्यू मित्तग

9
मैं उदाहरण के लिए, एक फॉरेस्ट लूप का उपयोग करने पर विचार करूंगा foreach(var rank in Ranks)। मैं दोनों छोरों को एक में विलय करने पर भी विचार करूंगा जहां प्रत्येक तत्व एक (रैंक, फ़ाइल) टपल है।
कोडइन्चॉस 11

जवाबों:


101

IMHO आपका दोस्त एक प्रतीकात्मक नाम का उपयोग करने में सही है, हालांकि मुझे लगता है कि नाम निश्चित रूप से अधिक वर्णनात्मक होना चाहिए (जैसे कि BOARD_WIDTHइसके बजाय CHESS_CONST)।

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

संख्याओं के नाम लेने के तरीके (या कैसे नहीं) के लिए इस पूर्व SE.SE पोस्ट को देखें ।

एक साइड नोट के रूप में, चूंकि टिप्पणियों में यहां पर चर्चा की गई थी : यदि, आपके वास्तविक कार्यक्रम के कोड में, यह मायने रखता है कि यदि चर iपंक्तियों और jबोर्ड के स्तंभों को संदर्भित करता है , या इसके विपरीत, तो चर नाम लेने की सिफारिश की जाती है जो भेद स्पष्ट, जैसे rowऔर col। ऐसे नामों का लाभ है, वे गलत कोड को गलत बनाते हैं।


22
मैं जोड़ना चाहूंगा, अगर ओपी ने वास्तव में एक महान शतरंज इंजन लिखा था, तो 3 डी शतरंज, या अन्य वेरिएंट को शामिल करने के लिए इसका विस्तार करने की कामना की थी, फिर जिसे बदलने के लिए 8s की आवश्यकता है वह एक चुनौती होगी।
स्टीव बार्न्स

32
@SteveBarnes: मैं इस तरह के तर्कों से बचने की कोशिश करता हूं, क्योंकि यह बहुत आसानी से एक उल्टे-सीधे तर्क की ओर ले जाता है जैसे "मुझे लगता है कि यह इस कार्यक्रम को एक अलग तरह का खेल बनाने के लिए कभी भी विपरीत है, इसलिए मैं जादू नंबर 8 को छोड़ सकता हूं जहां यह है। "
डॉक ब्राउन

4
@IllusiveBrian यह दो कारणों से एक क्लासिक "स्ट्रॉ मैन" तर्क है: (1) बस एक स्थिरांक को परिभाषित करने का मतलब यह नहीं है कि प्रोग्रामर अभी भी "8" टाइप नहीं कर सकता है (चाहे दुर्घटना, डिजाइन, या दुर्भावना से!) और (2) सिर्फ इसलिए कि एक निरंतर BOARD_WIDTH = 8 प्रोग्राम में किसी विशेष स्थान पर उपयोग करने के लिए BOARD_WIDTH को सही निरंतर नहीं बनाता है ।
एलेफ़ेज़ेरो

3
@ ब्लरफ्ल ... या कोड को ओवररेंज करने की ओर ले जाएगा। भविष्य में और कोड के अनुसार क्या बदल सकता है, इसका एहसास करना डेवलपर की जिम्मेदारी है। आवश्यकताओं की तरह कोडिंग समस्याओं का कारण नहीं बनेगी, लेकिन अन्य चरम बेहतर नहीं है।
माल्कॉम

4
@corsiKa जब लूप चर भौतिक कुल्हाड़ियों के अनुरूप होते हैं, तो उन्हें शतरंज, फ़ाइल, रैंक के लिए x, y या पंक्ति, कोल या, नाम दिया जाना चाहिए।
user949300

11

ठीक है, यहाँ कुछ टिप्पणियाँ हैं:

जादू की संख्या से छुटकारा पाना एक महान विचार है। DRY नामक एक अवधारणा है, जिसे अक्सर गलत तरीके से प्रस्तुत किया जाता है, लेकिन विचार यह है कि आप अपनी परियोजना में अवधारणाओं के ज्ञान की नकल नहीं करते हैं। इसलिए यदि आपके पास शतरंजबोर्ड नामक एक वर्ग है, तो आप एक निरंतर नाम BOARD_SIZE या ChessBoard.SIZE रख सकते हैं। इस तरह से इस जानकारी के लिए एकमात्र स्रोत है। इसके अलावा, यह बाद में पठनीयता में मदद करता है:

for (int i = 0; i < ChessBoard.SIZE; i++){
  for (int j = 0; j < ChessBoard.SIZE; j++){

यहां तक ​​कि अगर नंबर कभी नहीं बदलता है, तो आपका कार्यक्रम यकीनन बेहतर है। इसे पढ़ने वाला कोई भी व्यक्ति इस बारे में अधिक जानकारी जानता है कि कोड क्या कर रहा है।

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


8
यह केवल पहले से ही बनाए गए दोहराने वाले बिंदुओं पर लगता है और शीर्ष उत्तर में बताया गया है
gnat

-7

क्या आप वास्तव में चाहते हैं कि स्थिरांक के लिए विज्ञापन गतिरोध को समाप्त किया जाए, चाहे उनका नाम रखा जाए या नंगे:

for_each_chess_square (row, col) {
  /*...*/
}

यदि आप वास्तव में इस तरह के छोरों और व्हाट्सएप को दोहराकर निरंतर को आगे बढ़ाने जा रहे हैं, तो इसके साथ रहना सबसे अच्छा है 8

8आत्म-वर्णन है; यह स्थूल नहीं है जो किसी और चीज़ के लिए खड़ा है।

आप एवर नेवर गॉन (टीएम) इसे 9x9 शतरंज कार्यक्रम में बदल देते हैं और यदि आप कभी ऐसा करते हैं, तो 8 का प्रसार प्रमुख कठिनाई नहीं होगी।

हम टोकन 8 के लिए 150,000 लाइन कोड आधार खोज सकते हैं, और वर्गीकृत कर सकते हैं कि कौन सी घटनाएँ सेकंड में क्या मतलब है।

अधिक महत्वपूर्ण कोड को संशोधित करना है ताकि शतरंज का ज्ञान कम से कम कुछ स्थानों पर केंद्रित हो। एक, दो, शायद तीन शतरंज-विशिष्ट मॉड्यूल होना बेहतर है, जिसमें एक शाब्दिक 8 होता है, बत्तीस मॉड्यूल की तुलना में शतरंज-विशिष्ट जिम्मेदारी से लैस, एक प्रतीकात्मक नाम के माध्यम से 8 का उल्लेख करते हैं।

जब या यदि यह 8 स्थिरांक आपके कार्यक्रम में तनाव का स्रोत बन जाता है, तो आप उस समय इसे आसानी से ठीक कर सकते हैं। वास्तविक समस्याएं जो अब हो रही हैं, उन्हें ठीक करें। यदि आपको ऐसा नहीं लगता है कि आप उस विशेष 8 से बाधित हैं, तो उस वृत्ति के साथ जाएं।

मान लीजिए कि भविष्य में आप वैकल्पिक बोर्ड आयामों का समर्थन करना चाहते हैं। उस मामले में, उन छोरों कि क्या वे एक नामित निरंतर का उपयोग करें या परिवर्तन करना होगा 8, क्योंकि आयाम जैसे कुछ अभिव्यक्ति के द्वारा प्राप्त हो जाएगा board.widthऔर board.height। यदि आपके पास BOARD_SIZEहै 8, तो इन स्थानों को ढूंढना आसान होगा। तो वह कम प्रयास है। हालांकि, आपको पहली जगह के 8साथ बदलने के प्रयास के बारे में नहीं भूलना चाहिए BOARD_SIZE। समग्र प्रयास कम नहीं है। बदलने के 8लिए कोड पर एक पास बनाना BOARD_SIZE, और फिर वैकल्पिक आयामों का समर्थन करने के लिए दूसरा, केवल 8वैकल्पिक आयाम समर्थन से जाने की तुलना में सस्ता नहीं है ।

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

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

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


13
8यह आत्म-वर्णन नहीं है, यह एक संख्या है जिसका अर्थ कुछ भी हो सकता है। और शायद वे 9x9 शतरंज का खेल करना चाहते हैं, क्यों नहीं? यदि आपके पास कोड की 150,000 पंक्तियाँ हैं, तो ऐसा कोई तरीका नहीं है जिससे आप याद रख सकें 8कि कोड में प्रत्येक का क्या अर्थ है, और यहां तक ​​कि अगर आप कर सकते हैं, तो आप क्यों कर सकते हैं? यह सिर्फ एक अतिरिक्त परेशानी है। जहां तक ​​मॉडर्नाइजेशन की बात है, तो 8कुछ ऐसा है जो NUM_RANKSमॉड्युलैरिटी को नुकसान नहीं पहुंचाता है, वास्तव में, यह मदद करता है क्योंकि यह कोड को छेड़छाड़ करना आसान बनाता है।
जेरोफ़ोव 2

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

1
"हालाँकि, आपको पहले स्थान के 8साथ बदलने के प्रयास के बारे में नहीं भूलना चाहिए BOARD_SIZE" - आपके 8द्वारा अपने कार्यक्रम महीनों में अब तक किए गए आंकड़ों को जानने के लिए अपने कोड पर छानबीन करने में बिताया गया समय सबसे अधिक संभावना है कि समय के 8साथ बदल दिया जाए। एक सार्थक मॉड्यूल-स्तर स्थिर।
क्रिश्चियन डीन

1
@doppelganger यह परिदृश्य पहले से ही यहां है। मैं यह नहीं कह रहा हूं कि एक शतरंज कार्यक्रम लें, जो स्थिरांक का उपयोग करता है, और उन्हें 8 के साथ प्रतिस्थापित करता है। न ही मैं कह रहा हूं, "नॉन-अभी तक लिखित शतरंज कार्यक्रम में स्थिरांक का उपयोग नहीं करने की योजना"
कज़

1
@Kaz आप खुद को 8 के आसपास के सभी कोड क्यों पढ़ना चाहते हैं, और कभी-कभी यह संदर्भ गलत हो सकता है जब आप सार्थक नाम में केवल 3 सेकंड का अतिरिक्त समय दे सकते हैं? स्थिरांक के वास्तविक मूल्य को जानने के लिए, यह बहुत आसान है कि किसी चर के लिए सटीक मान को पीछे की ओर देखने की तुलना में इंजीनियर के लिए कोड में कुछ जादू पूर्णांक का क्या मतलब है
जेरोफ़ोव 2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.