अपने कोड में गहरे इंडेंटेशन को रोकने के लिए मैं क्या कदम और उपाय कर सकता हूं?
अपने कोड में गहरे इंडेंटेशन को रोकने के लिए मैं क्या कदम और उपाय कर सकता हूं?
जवाबों:
दीप इंडेंटेशन आमतौर पर एक समस्या नहीं है यदि आपके कार्यक्रम में प्रत्येक फ़ंक्शन / विधि एक और केवल एक ही काम करती है। कभी-कभी, सशर्त रूप से कुछ स्तरों को घोंसले के लिए आवश्यक हो सकता है, लेकिन मैं ईमानदारी से कह सकता हूं कि मैंने केवल 12+ वर्षों की कोडिंग में एक मुट्ठी भर गहरा इंडेंट कोड लिखा है।
सबसे अच्छी बात आप कर सकते हैं निकालने के तरीके:
int Step1(int state)
{
if (state == 100)
{
return Step2(state);
}
else
{
return Step3(state);
}
}
int Step2(int state)
{
if (state != 100)
{
throw new InvalidStateException(2, state);
}
// ....
}
if
। चरम पर ले जाया गया, आप निष्पादन योग्य छद्मकोड के साथ समाप्त करेंगे।
else
ब्लॉक को छोड़ दें ।
शायद आप गार्ड क्लॉस पर विचार कर सकते हैं ?
के बजाय
public void DoSomething(int value){
if (someCondition){
if(someOtherCondition){
if(yetAnotherCondition){
//Finally execute some code
}
}
}
}
कर
public void DoSomething(int value){
if(!(someCondition && someOtherCondition && yetAnotherCondition)){
return;
//Maybe throw exception if all preconditions must be true
}
//All preconditions are safe execute code
}
अगर आपको कभी मौका मिले तो मैं आपको स्टीव मैककोनेल द्वारा कोड कम्प्लीट पढ़ने की अनुमति दूंगा। उन्हें इन विषयों पर बहुत सलाह मिली है।
http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=pd_sim_b_6
"गार्ड क्लॉस" के बारे में अधिक जानकारी के लिए देखें: https://sourcemaking.com/refactoring/replace-nested-conditional-with-guard-clauses
अपने को उलटा करो if
।
के बजाय:
if (foo != null)
{
something;
something;
if (x)
{
something;
}
something;
}
else
{
boohoo;
}
मैं लिखूंगा:
if (foo == null)
{
boohoo;
return;
}
something;
something;
if (x)
{
something;
}
something;
यही बात if
- else
ब्लॉक पर भी लागू होती है । यदि else
कम / कम नेस्टेड है, तो उन्हें वापस कर दें।
एक स्थान पर मापदंडों के मूल्यों की जाँच करें
अवैध मानों के लिए सभी मापदंडों की जाँच करें जैसे ही आप अपना तरीका दर्ज करते हैं, तब यह जानते हुए आगे बढ़ें कि आप सुरक्षित हैं। यह अधिक पठनीय कोड के लिए बनाता है, लेकिन यह आपको बाद में सशर्त ब्लॉकों को जमा करने और सब-चेकआउट पर इन चेकों को फैलाने से भी बचाता है।
If
कोड की शुरुआत में जो कुछ स्थिति के कारण निष्पादन प्रवाह को रोकते हैं, वे नहीं मिलते हैं , उन्हें @JasonTuran की तरह सुरक्षित क्लॉज के रूप में भी जाना जाता है। और ऐसा लगता है जैसे यह एक अलग नाम होने के करीब है।
आमतौर पर, मैंने देखा है कि गहरा इंडेंट कोड आमतौर पर समस्याग्रस्त कोड होता है। यदि आप इस समस्या का सामना कर रहे हैं, तो वापस कदम रखें और मूल्यांकन करें कि क्या आपका कार्य बहुत सारी चीजें कर रहा है।
उसी समय, आपके प्रश्न का उत्तर देने के लिए, अगर उस गहनता की आवश्यकता है, तो मैं आपको सुझाव दूंगा कि आप इसे वहीं रहने दें। इस कारण से कि इस तरह के कोड में, इंडेंटेशन मदद करेगा क्योंकि यह कोड का एक बहुत लंबा टुकड़ा होने की संभावना है।
नेस्टेड घटकों (विशेष रूप से दोहराया वाले) को अलग-अलग कार्यों में तोड़ दें (यह आसान है यदि आपकी भाषा क्लोजर का समर्थन करती है) या पुनरावर्ती के साथ नेस्टेड छोरों की एक श्रृंखला को प्रतिस्थापित करें।
इसके अलावा, चार के बजाय दो रिक्त स्थान पर इंडेंट करें।
मुझे हटाने के लिए एक स्पष्ट समस्या के रूप में गहरे संकेत नहीं दिखते हैं (न ही मैं सब कुछ के लिए सही उत्तर के रूप में रिफैक्टिंग देख रहा हूं)।
आमतौर पर नेस्टेड आईएफ के बजाय, मैं तार्किक कथन लिखना पसंद करता हूं:
if (foo && bar && baz)
बजाय
if foo
if bar
if baz
मुझे खुद पर विश्वास नहीं था, लेकिन कोड पूरा के अनुसार यह उपयोग करने के लिए एक उपयुक्त स्थान है break
(यदि आपकी टीम बोर्ड पर है)। मुझे लगता है कि यह C ++ प्रोग्रामर के साथ अधिक स्वीकार्य है, हालांकि, जहां यह डेल्फी प्रोग्रामर के साथ बयानों break
में उपयोग किया जाता है , जहां केवल तब उपयोग किया जाता है जब आपको लूप लिखने का मन नहीं होता है ।switch
break
while
इंडेंटेशन वास्तव में लड़ने के लिए एक विचार है, वास्तव में। मैंने जो करना सीखा, वह यह है कि विधि को पहले टुकड़ों में विभाजित किया जाए, फिर प्रत्येक निम्नलिखित टुकड़ों को छोड़ने के लिए एक अजीब चाल का उपयोग करें यदि एक टुकड़ा विफल रहा। यहाँ एक उदाहरण है :
के बजाय :
{if (networkCardIsOn() == true)
{if (PingToServer() == true)
{if (AccesLogin(login,pass) == true)
{if (nextCondition == true)
...
}
}
}
मैं वर्तमान में लिखता हूं:
{vbContinue = true;
if (vbContinue) {
vbContinue = networkCardIsOn();
if (vbContinue == false) {
code to Handle This Error();
}
}
if (vbContinue) {
vbContinue = PingToServer();
if (vbContinue == false) {
code to HandleThisError2();
}
}
if (vbContinue) {
vbContinue = AccesLogin(login,pass);
if (vbContinue == false) {
HandleThisErrorToo();
}
}
...
यह पहली बार में मुझे अजीब लग रहा है, लेकिन जब से मैं इसका उपयोग करता हूं, रखरखाव की लागत आधे से विभाजित हो गई है, और दिन के अंत में मेरा मस्तिष्क ठंडा है।
वास्तव में, इस "तकनीक" द्वारा पेश किया गया लाभ यह है कि कोड जटिलता वास्तव में विभाजित है क्योंकि कोड कम घना है।
कोड पढ़ते समय, आपको पिछली स्थितियों के बारे में कुछ भी याद रखने की ज़रूरत नहीं है: यदि आपका कोड में उस बिंदु X पर है, तो पिछले चरण पास हो गए हैं और सफल हो गए हैं।
एक और लाभ यह है कि उन सभी नेस्टेड "इफ-और" से "एस्केप पाथ एंड कंडीशन" को सरल बनाया जाता है।