2010-11-22 12 views
3

したがって、華氏、摂氏、ケルビンまたはランキンクのソース温度を華氏、摂氏、ケルビンまたはランキンに変換する温度変換器で作業しようとしています。4方向温度変換器の最も効率的なオブジェクト指向アプローチ

今、私は最高のオブジェクト指向のガイドラインに従って(C#で)これをやろうとしています。

私は早い段階でロードブロッキングを打ちましたが、続ける方法についてはアドバイスが必要です。

私は現在、プログラムのインターフェイスと実装を処理しているクラスTempConvertを持っています。

次に、実際にMain()メソッドを実行するMain.csファイルがあります。

これはコンソールプログラムになります。

TempConvert.cs

using System; 

namespace TempConverter 
{ 
    public class TempConvert 
    { 
     private double SourceTemp { get; set; } 
     private double TargetTemp { get; set; } 

     public TempConvert(double sourceTemp, double targetTemp) 
     { 
      SourceTemp = sourceTemp; 
      TargetTemp = targetTemp; 
     } 
    } 
} 

Main.cs

using System; 

namespace TempConverter 
{ 
    class MainClass 
    { 
     public static void Main() 
     { 
      TempConvert converter = new TempConvert(10, 20); 
     } 
    } 
} 

これは良いスタートであるかどうか、私は知りません。

私は異なるソース温度(4つの異なるスケールを使用しています)と異なるターゲット温度を扱う方法について考えることはできません。

私の上記のコードは、私がSourceTemp値として10を渡し、そしてTargetTemp値として20ように、エンドユーザが所望のスケーリングを決定する方法がないので、少なくとも私が考える、動作しないことができます。

intの3番目のパラメータを渡すことができました.1,2,3,4という値が入ります。次に、条件付きで、特定の変換方法が呼び出されます。 。

答えて

3

あなたはこのような何かしたい:

interface ITemperatureConverter { 
    double Convert(double temperature); 
} 

class FahrenheitToCelciusConverter : ITemperatureConverter { 
    // details elided 
} 
おそらく

が、私は、条件を使用して、1、2、3または4次に、値が含まれている三番目のパラメータ、int型を渡すでした各整数は特定のスケールに対応するため、特定の変換メソッドが呼び出されます。

あなたは遠くこれを取ると言うことができます。

enum TemperatureScale { Celcius, Fahrenheit, Kelvin, Rankine }; 

class TemperatureConverterFactory { 
    // details elided 

    public ITemperatureConverter CreateConverter(
     TemperatureScale from, 
     TemperatureScale to 
    ) { 
     // details elided 
    } 
} 

をあなたはCreateConverter方法が適切なITemperatureConverterを返却する必要があります。

は、あなたの質問に答えるように編集:応答のための

おかげで、しかし、あなたはn00byの観点から、このもう少し説明できますか? 2つ目のコードブロックを解釈する際に問題があります。

OOPの重要な原則は、single responsibility principleです。単一責任の原則の一つの現れ方は、すべてのクラスに1つの責任しか持たないことです。

ビルドしているプログラムでは、温度変換を実行している特定の責任があります。それはインタフェースITemperatureConverterのポイントであり、具体的な実装はFahrenheitToCelciusConverterです。 FahrenheitToCelciusConverterは、華氏のみを摂氏に変換します。それはその単一の責任です。

もう1つの責任は、変換元の温度スケールと温度スケールに変換された適切な変換オブジェクトを参照していることです。したがって、私たちは責任を孤立させたので、この責任に対応するクラスを持つべきです。それはクラスTemperatureConverterFactoryのポイントです:変換する温度スケールとそれに変換する温度スケールが与えられたら、適切なITemperatureConverterが生成されます。

ITemperatureConverterのインターフェイスを継承するものは何ですか? .NETで温度変換の組み込み関数を使用することができますか?

私たちは継承しているインターフェースについては言及しませんが、実装について話します。インタフェースは契約であり、インタフェースを実装するクラスはインスタンスが契約に従うクラスです。 「」というインターフェースを実装しているクラス(たとえば、FahrenheitToCelciusConverter)は、「温度を変換する方法はわかっています。」と考えてください。

私が知る限り、.NET Frameworkには温度変換ルーチンが組み込まれていません。

+0

良いOOの練習を使った素晴らしい例のための+1 – mhenrixon

+0

応答に感謝しますが、n00byの観点からもう少し説明できますか? 2つ目のコードブロックを解釈する際に問題があります。 – Qcom

+0

'ITemperatureConverter'のインターフェースを継承することで何ができますか? .NETで温度変換の組み込み関数を使用することができますか? – Qcom

3

私は単に任意の入力を例えばに変換します。摂氏。その後、あなたが望むスケールに戻ります。

+3

はい、すべてのクラスを共通の入力または出力値で処理します(どちらの方向に向いているかに基づいて)。そしてそれを連鎖してください。 – Joe

+0

それはそれを実装する方法ですが、OPが苦労していることをはっきりと示しているデザインをあまり提供していません。 – jason

+2

私はSI単位を温度に使用し、ケルビンは内部スケールとして使用します。その利点の1つ(ランキンとのシェア)は、0が絶対値0であることです。したがって、あなたが温度の計算を行うと、最も便利な選択になります。 – CodesInChaos

0
public class TemperatureConverter 
{ 
    private readonly double TempAtZero; 
    private readonly double StepSize; 

    public TemperatureConverter(double tempAtZero,double stepSize) 
    { 
    TempAtZero=tempAtZero; 
    StepSize=stepSize; 
    } 

    public double ToKelvin(double temp) 
    { 
    return (temp-TempAtZero)/StepSize; 
    } 
    public double FromKelvin(double tempInKelvin); 
    { 
    return TempAtZero+StepSize*tempInKelvin; 
    } 

    public static double Convert(double temperature,TemperatureConverter sourceScale,TemperatureConverter targetScale) 
    { 
    return targetScale.FromKelvin(sourceScale.ToKelvin(temperature)); 
    } 

    public static readonly Kelvin=new TemperatureConverter(0,1); 
    public static readonly Celsius=new TemperatureConverter(-272.15, 1); 
} 

このようにそれを使用する:

double celsius = TemperatureConverter.Celsius.FromKelvin(300); 
double celsius2 = TemperatureConverter.Celsius.FromKelvin(TemperatureConverter.Fahrenheit.ToKelvin(100)); 
double celsius3 = TemperatureConverter.Convert(100,TemperatureConverter.Fahrenheit,TemperatureConverter.Celsius);//using the helpermethod 

この設計の制限は、それが唯一の変換が線形であるとの間の温度スケールのために働くことです。線形でない場合は、ToKelvin/FromCelvin仮想または抽象的なインターフェイスを使用する必要があります。

0

私はちょうど温度コンバータを作成しましたが、私は代理人に大きく依存していました。

このデリゲートの形状即ち

public delegate double ConversionFormula(double temperature); 

、変換式を表すことができるものデリゲートを作成するには、それは二重、すなわち温度を取得し、変換された値でなる二重を返すことを指示します。

デリゲートは、1つのメソッドインターフェイスを実装しているクラスと同等であることに注意してください。

変換する数式でいくつかの方法を定義します。通常のメソッドを作成したり、匿名関数を使用したり、ラムダ式の使用をより簡潔にすることができます。もちろん、あなたがこれらの上に立っていないなら、あなたは少しの研究をする必要があるでしょう。例えば変換式: -

public static ConversionFormula FahrenheitToCelcius = t => ((t - 32) * 5/9); 
public static ConversionFormula FahrenheitToKelvin = t => ((t -32)/1.8) + 273.15 

次に、私は、次の方法有するTemperatureConverterというクラス作成: - 私は、適切な変換デリゲートと共に変換する温度に渡す

public static double ConvertTemperature(double temperatureValue, ConversionFormula formula) 
{   
    return conversionFormula(temperatureValue); 
} 

およびプレストちょっと必要な結果が得られます。

関連する問題