まず、141行目にエラーがあります。そのdone
単語を削除してください。コピー&ペーストの間違いだったと思います。第二に:ここであなたはあなたのコードが次のようになっていると言います:
else if (type == "cups")
{
Console.WriteLine("Enter a number of liters to be converted into cups.");
amount = Convert.ToDouble(Console.ReadLine());
Console.WriteLine(cupsTolitConverter.Convert(amount) + " cups to said number of liters.");
}
しかし、あなたがそこにリンクを与えた解決策には次のものがあります:
else if(type == "cups")
{
Console.WriteLine("Enter a number of liters to be converted into cups.");
amount = Convert.ToDouble(Console.ReadLine());
Console.WriteLine(cupsTolitConverter.Convert(amount) + " centimeters to said number of inches.");
}
私はそれがただの不注意であることを提案します。コードは正常に機能します。置き換えるだけです。
Console.WriteLine(cupsTolitConverter.Convert(amount) + " centimeters to said number of inches.");
と
Console.WriteLine(cupsTolitConverter.Convert(amount) + " cups to said number of liters.");
あなたのソリューションで。
コードを単純化し、繰り返しを削除することについて話します。もちろん、それを行う方法はあります。この手順は、コードリファクタリングと呼ばれます。たとえば、プロジェクトに次のように記述しました。
...
else if(type == "grams")
{
amount = gramsToOunces(ozToGramsConverter, ref done);
}
...
あなたの評価はamount
gramsToOunces()メソッドに置き換えられました。これもある程度のコードリファクタリングです。あなたはあなたのコードの一般的な部分を取り、それらが何に依存しているかを見る必要があります。例えば:
private static double MilesToFeet(UnitConverter milesToFeetConverter, ref int done)
{
double amount;
Console.WriteLine("Enter a number of miles to be converted to feet.");
amount = Convert.ToDouble(Console.ReadLine());
Console.WriteLine(milesToFeetConverter.Convert(amount) + " feet to said number of miles.");
return amount;
}
すべてのconvertメソッドにはそのような構造があります。すべての方法で同じことをします。同じ命令メッセージを出力します...同じ量の変数を宣言し、その値をコンソール入力に設定します...その後、ほぼ同じ情報メッセージを書き込みます。代わりに、これらすべてを1つのメソッドに入れることができるN個のメソッドを使用します。まず、コンバータークラスを拡張する必要があります。さらに2つの文字列フィールドフィールドを追加します。FromUnit
およびToUnit
。なぜ???メソッドのパラメーターとしてコンバーターインスタンスを指定するためです。また、このインスタンスを使用して、このコンバーターに関する詳細情報を保存したり、後で情報メッセージを作成したりできます。例えば:
public class UnitConverter
{
double ratio;
public string From { get; set; }
public string To { get; set; }
public UnitConverter(double unitratio) { ratio = unitratio; }
public double Convert(double unit) { return unit * ratio; }
}
それよりも、コンバーターのインスタンスを作成するときに、これらのプロパティに適切な値を設定します。
UnitConverter milesToFeetConverter = new UnitConverter(5280) { From = "miles" , To = "feet"};
次に、作成済みのすべてのメソッド(gramsToOunces、kmatesToMilesなど)を表すメソッドを作成しましょう。
private static void MakeConversion(UnitConverter customConverter)
{
Console.WriteLine("Enter a number of {0} to be converted to {1}.",customConverter.From, customConverter.To);
double amount = Convert.ToDouble(Console.ReadLine());
string message = string.Format("{0} {1} to said number of {2}", amount, customConverter.To, customConverter.From);
Console.WriteLine(message);
}
これで、すべてのメソッドを削除できます。ifブロックでは、同じことを行うさまざまなメソッドを呼び出す代わりに、さまざまなパラメーターを使用して、この1つのメソッドを呼び出すことができます。
else if(type == "miles"){MakeConversion(milesToFeetConverter); }
これらすべての操作の後、ソリューションは次のようになります。
using System;
namespace ConsoleApplication2
{
public class UnitConverter
{
double ratio;
public string From { get; set; }
public string To { get; set; }
public UnitConverter(double unitratio) { ratio = unitratio; }
public double Convert(double unit) { return unit * ratio; }
}
class Test
{
private static void MakeConversion(UnitConverter customConverter)
{
Console.WriteLine("Enter a number of {0} to be converted to {1}.",customConverter.From, customConverter.To);
double amount = Convert.ToDouble(Console.ReadLine());
string message = string.Format("{0} {1} to said number of {2}", amount, customConverter.To, customConverter.From);
Console.WriteLine(message);
}
public static void Main()
{
UnitConverter feetToInchesConverter = new UnitConverter(12) { From = "feet", To = "inches"};
UnitConverter milesToFeetConverter = new UnitConverter(5280) { From = "miles" , To = "feet"};
UnitConverter kmsToMilesConverter = new UnitConverter(1.609) { From = "kilometers", To = "miles"};
UnitConverter centToInchesConverter = new UnitConverter(2.54) { From = "centimeters", To = "inches" };
UnitConverter ozToGramsConverter = new UnitConverter(28.349) { From = "ounces", To = "grams" };
UnitConverter cupsTolitConverter = new UnitConverter(4.226) { From = "cups", To = "litters" };
string type;
int done;
done = 0;
while(done == 0)
{
{
type = Console.ReadLine();
if(type == "centi")
{
MakeConversion(centToInchesConverter);
}
else if(type == "feet")
{
MakeConversion(feetToInchesConverter);
}
else if(type == "km")
{
MakeConversion(kmsToMilesConverter);
}
else if(type == "miles")
{
MakeConversion(milesToFeetConverter);
}
else if(type == "grams")
{
MakeConversion(ozToGramsConverter);
}
else if(type == "cups")
{
MakeConversion(cupsTolitConverter);
}
else if(type == "end")
{
done = 1;
}
}
}
}
}
}
当然のことながら、コードをより簡単かつ明確にするために、より多くのことを行うことができます。ifをcaseに置き換え、MakeConversion
メソッドを直接UnitConverterクラスに置き換え、クラスのアーキテクチャを変更します。それはあなたが何ができるかについての私の提案だけです。ただし、まず最初に、ounメソッドとクラスの記述方法を学習し、VisualStudioメソッドジェネレーターを使用しないでください。メソッドの記述方法を自分で知っておく必要があります。私はどういうわけかそれを説明しようとしました、それが役に立ったことを願っています