2013-04-17 23 views
-7

我希望這之前沒有問過,有沒有辦法突出顯示返回語句應該在方法中返回的所有返回路徑?因爲我有這個相當長的代碼塊可能路徑,我仍然沒有找到它的每一個路徑。 (我認爲這將是一個有用的工具)歡呼。試圖捕獲這段代碼中的所有返回路徑

static double findconversion(int menuOption, int submenuOption) { 

     if (menuOption == 1) { 

      if (submenuOption == 1) { 

        Console.Write("\nYou chose to convert Celcius to Fahrenheit" +   "\nEnter the number that you want to convert, (between -500 and 500)" 
         + "\nOr enter 0 to return to the previous menu: "); 
        double celnum = int.Parse(Console.ReadLine()); 


       if (celnum == 0) { 
        Console.WriteLine("\nYou cancelled your selection"); return celnum; 

       } else if ((-500 > celnum) || (celnum > 500)) { 
        Console.WriteLine("\nchoose a number between -500 to 500 please"); 

        findconversion(menuOption, submenuOption); return celnum; 

       } else if ((-500 <= celnum) && (celnum <= 500)) { 

        double result = Celsiusandfahrenheit(celnum, submenuOption); 

        if (submenuOption == 1) { 
         Console.WriteLine("\n " + celnum + (" degrees celcius converted to fahrenheit is: {0:0.00} degrees fahrenheit"), result); 
         return celnum; 
        } else if (submenuOption == 2) { 
         Console.WriteLine("\n " + celnum + (" degrees fahrenheit converted to celcius is: {0:0.00} degrees celcius"), result); 
         return celnum; 
        } return celnum; 
       } 

      } else if (submenuOption == 2) { 
       Console.Write("\nYou chose to convert Fahrenheit to Celsius" + "\nEnter the number that you want to convert, (between -500 and 500)" 
        + "\nOr enter 0 to return to the previous menu: "); 


       double celnum = int.Parse(Console.ReadLine()); 




       if (celnum == 0) { 
        Console.WriteLine("\nYou cancelled your selection"); return celnum; 

       } else if ((-500 > celnum) || (celnum > 500)) { 
        Console.WriteLine("\nchoose a number between -500 to 500 please"); 


        findconversion(menuOption, submenuOption); return celnum; 
       } else if ((-500 <= celnum) && (celnum <= 500)) { 

        double result = Celsiusandfahrenheit(celnum, submenuOption); 
        if (submenuOption == 2) { 
         Console.WriteLine("\n " + celnum + (" degrees fahrenheit converted to celcius is: {0:0.00} degrees celcius"), result); return celnum; 
        } 




       } return celnum; 


      } 

     } else if (menuOption == 2) { 

      if (submenuOption == 1) { 
       Console.Write("\nYou chose to convert centimetres to feet and inches" + "\nEnter the number that you want to convert to feet and inches, (between -500 and 500)." 
        + "\nOr enter 0 to return to the previous menu: "); 
       double celnum = int.Parse(Console.ReadLine()); 

       if (celnum == 0) { 
        Console.WriteLine("\nYou cancelled your selection"); return celnum; 

       } else if ((-500 > celnum) || (celnum > 500)) { 
        Console.WriteLine("\nchoose a number between -500 to 500 please"); 

        findconversion(menuOption, submenuOption); return celnum; 

       } else if ((-500 <= celnum) && (celnum <= 500)) { 


        double result = cmsandfeet(celnum, submenuOption); 
        // double result1 = cmsandinches(centnum, submenuOption, empty); 
        result = Math.Floor(result); 
        double result1 = ((celnum - (result * 30.48))/2.54); 
        if (submenuOption == 1) { Console.WriteLine("\n " + celnum + (" centimetres converted to feet and inches is: {0:0} feet and {1:0.00} inches"), result, result1); } return celnum; 


       } 

       return celnum; 
      } 

     } 
    } 
+5

沒有這樣的事情存在。正確的做法是將這種可怕的方法重構成許多較小的方法。 –

+1

你是什麼意思與返回路徑?返回聲明? –

+0

如果你有一個代碼路徑沒有在一個方法中返回一個值,而這個方法的簽名保證了一個值將被返回,我想不出有什麼辦法來編寫你的代碼,這樣編譯器就不會打你的手並拒絕建立。 – 48klocs

回答

1

我開始回答這個作爲評論,但我意識到可能有足夠的指導性內容來保證完整的答案。

作爲開發人員,您有責任瞭解邏輯流程,並知道代碼中的所有路徑在哪裏。作爲一個非常一般的經驗法則,您要仔細查看每個結構的每個if/else結構,然後決定:此條件塊的末尾是我返回的位置,還是邏輯在此之後繼續?逐步瞭解每種可能性,並親自查看是否着陸在正確的區域。

您可以通過格式化來幫助自己成爲更好的編碼器。例如,在塊你「之間-500和500 celnum」的結尾,你有這樣的:

if (submenuOption == 1) { Console.WriteLine("\n " + celnum + (" centimetres converted to feet and inches is: {0:0} feet and {1:0.00} inches"), result, result1); } return celnum; 

這就是窮人的原因有很多,其中最重要的是,上return celnum在一個很長的行結束。無論有條件如何,這都會執行,但我不知道如果仔細研究。相反,這更清晰:

if (submenuOption == 1) { 
    Console.WriteLine("\n " + celnum + (" centimetres converted to feet and inches is: {0:0} feet and {1:0.00} inches"), result, result1); 
} 
return celnum; 

這直接在視覺上向我顯示,您正在返回一個值,無論submenuOption的值如何。

你必須看的另一件事是有一個默認情況下,或「隱含else」。你可以在幾種情況下做到這一點,這很好,(例如,「在-500和500之間」後的return celnum)。如果你不這樣做,那是造成錯誤的原因,是你最外面的條件。

您有if submenuOption == 1,並且您有else if submenuOption == 2,但您之後沒有任何內容。如果子菜單選項不是1或2,會發生什麼情況?在這種情況下,你不會返回任何東西。在你的已知案例之外,你需要一個默認案例 - 要麼拋出一個錯誤,要麼返回一個值,表示沒有選擇好的選項。這應該解決您的編譯器問題。

相關問題