2017-11-27 8 views
0

Double.Parseを使用してCelciusからFahrenheitに変換する正常なクリーンコードがあります。しかし、私がDouble.TryParseをしたらどうなるか分かりましたが、コードを完成させる方法は分かりません。一度実行、 Celciusを華氏に変換する - Double.TryParse

は、変換のために値を入力してください...私は「もし、そうでない」の「無効なコード」を、提示することができるが、私はまだ私のInvaild出力した後、これを取得する:
30X
無効なコード
摂氏から華氏への変換である: - 現在それがない32

using System; 
using System.Text; 

namespace CSharpBasics 
{ 
    class Program 
    { 
     public static double CelciusToFarenheit(string celciusTemperature) 
     { 
      //Converting string to a double for conversion 

      double celcius; 
      if (Double.TryParse(celciusTemperature, out celcius)) 
      { 

      } 
      else 
      { 
       Console.WriteLine("Invalid code"); 
      } 
      double fahrenheit = (celcius * 9/5) + 32; 
      return fahrenheit; 
     } 

     public static void Main(string[] args) 
     { 
      Console.WriteLine("Please enter a value for conversion:"); 
      var input = CelciusToFarenheit(Console.ReadLine()); 
      Console.WriteLine("The conversion from Celcius to Fahrenheit is: " + input); 
     } 
    } 
} 
+0

ヒント1:コードの匂い - 空の 'if'ブロック。ヒント2:いつ華氏の値を計算していますか?ヒント:戻り値として 'Nullable 'を調べてください –

答えて

1

変換前に入力を確認して、無効な入力に対して無効な結果が表示されないようにしてから、間違った入力を最初に通知するメッセージを返さなければなりません。このようなもの:

public static double CelciusToFarenheit(double celcius) 
    { 
     double fahrenheit = (celcius * 9/5) + 32; 
     return fahrenheit; 
    } 

    public static void Main(string[] args) 
    { 
     Console.WriteLine("Please enter a value for conversion:"); 
     var input = Console.ReadLine(); 

     double celcius; 
     if (Double.TryParse(input, out celcius)) 
     { 
      var result = CelciusToFarenheit(celcius); 
      Console.WriteLine("The conversion from Celcius to Fahrenheit is: " + result); 
     } 
     else 
     { 
      Console.WriteLine("Invalid code"); 
     }    
    } 
+0

ありがとうございました!これはまさに私がそれを描いていた方法です。私のDouble.Parseに似ています。メインメソッドにTryParseを追加するのが適切かどうかはわかりませんでした。 – Loves2Program

+0

@ Loves2Program:IMHOこれは適切ではありません。メインメソッドの抽象度が低すぎます。特に、そのメソッドを 'public double Fahrenheit(double celsius)=> celsius * 9/5 + 32;のような1つのライナーにすると、実際の計算を独自の方法で行うことはほとんどありません。 –

0

メソッドシグネチャpublic static double CelciusToFarenheit(...)は、この方法は、値を返すことを言います。

しかし、あなたのプログラムの流れが無効な入力を考慮しなければならない - ので、あなたは2の情報が必要です

  1. 何有効な値

で入力された値でしたこの問題を解決するには、少なくとも次の方法があります。

    両方の情報
  1. を保持する構造体またはオブジェクトが戻り値を使用
  2. リターンと例外
  3. と無効な結果は2つの方法、有効性をチェックするための1つの値を提供するための1つに単一のメソッドを分割示します。

はのは、3つのオプションを議論してみましょう:あなたはDouble.TryParse()を見たときに

  • 3)これは、見栄えの良い、しかしかもしれない、あなたはおそらく重複したコードを紹介します。そして、Mainメソッドを見ると、抽象レベルは同じではありません。
  • 2)例外は、例外的な場合に使用するものとします。誤ったユーザー入力はかなり普通のようです。この場合には理想的ではありません。
  • 1)メソッドが有効性のチェックと計算の2つの原因である可能性があることを除いて、かなりうまく聞こえます。

これを実装するには、新しい構造体またはクラスを作成する必要はありません。 Nullable<double>またはdouble?をそのまま使用できます。

あなたはクリーンコード(R.C.マーティンを参照している可能性があります)について話しているので、まずメインメソッドを見てみましょう。基本的には、コードはIPOの原則(入力、処理、出力)に従っていると言えます。それは、ユーザの入力ではないので

var input = CelciusToFarenheit(Console.ReadLine()); 

また、変数名inputが、ここではそれほど有用ではありませんが、処理後の出力:しかし、一行は2つのことを行います。その部分について

提案:

public static void Main(string[] args) 
{ 
    var userInput = GetCelsiusInputFromUser(); 
    var output = CelciusToFarenheit(userInput); 
    PrintOutput(output); 
} 

また、変換方法は、変換しないだけでなくだけでなく、部分的な結果を印刷:

Console.WriteLine("Invalid code"); 

私はその部分を除去するためにそれを残したいですその場合を処理する出力メソッド。

全コード:

using System; 

namespace CSharpBasics 
{ 
    class Program 
    { 
     public static double? CelciusToFarenheit(string celciusTemperature) 
     { 
      //Converting string to a double for conversion 
      double celcius; 
      if (Double.TryParse(celciusTemperature, out celcius)) 
      { 
       double fahrenheit = (celcius * 9/5) + 32; 
       return fahrenheit; 
      } 
      else 
      { 
       return null; 
      } 
     } 

     public static void Main(string[] args) 
     { 
      var userInput = GetCelsiusInputFromUser(); 
      var output = CelciusToFarenheit(userInput); 
      PrintOutput(output); 
     } 

     private static void PrintOutput(double? output) 
     { 
      if (output == null) 
      { 
       Console.WriteLine("Invalid code"); 
      } 
      else 
      { 
       Console.WriteLine("The conversion from Celcius to Fahrenheit is: " + output); 
      } 
     } 

     private static string GetCelsiusInputFromUser() 
     { 
      Console.WriteLine("Please enter a celsius value for conversion:"); 
      var userInput = Console.ReadLine(); 
      return userInput; 
     } 
    } 
} 

ところで:あなたが技術的な問題を持っていない場合は、https://codereview.stackexchange.com/はクリーンなコードに関する質問の方が適している可能性があります。

+0

ありがとうThomas、ありがとう。 – Loves2Program

関連する問題