最有效的面向对象的4路温度转换器方法

时间:2010-11-22 17:47:42

标签: c# oop

所以,我正在尝试使用温度转换器将任何华氏温度,摄氏温度,开尔文温度或兰金源温度转换为华氏温度,摄氏温度,开尔文温度或朗肯温度。

现在,我正在尝试遵循最佳面向对象实践指南(C#)。

我很早就遇到了障碍,我需要一些关于如何继续的建议。

我有一个类TempConvert,目前正在处理程序的接口和实现。

然后,我有一个Main.cs文件,它实际上会执行Main()方法。

这是一个控制台程序,请注意。

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个不同的比例)和不同的目标温度。

我上面的代码无法工作,至少我认为,因为当我将10作为SourceTemp值传递,20作为TargetTemp值传递时,没有确定最终用户所希望的规模的方法。

也许,我可以传递第三个参数,int,其中包含值1,2,3或4.然后,使用条件,调用某个转换方法,因为每个整数都对应于一定规模。

4 个答案:

答案 0 :(得分:3)

你想要这样的东西:

interface ITemperatureConverter {
    double Convert(double temperature);
}

class FahrenheitToCelciusConverter : ITemperatureConverter {
    // details elided
}
  

也许,我可以传递第三个参数,一个int,其中包含值1,2,3或4.然后,使用条件,调用某个转换方法,因为每个整数将对应一定的比例。

你可以更进一步说:

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

class TemperatureConverterFactory {
    // details elided

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

您需要让CreateConverter方法返回相应的ITemperatureConverter

已编辑回复您的问题:

  

感谢您的回复,但您能从n00by的角度解释一下吗?我在解释你的第二段代码时遇到了一些麻烦。

OOP中的一个关键原则是single responsibility principle。单一责任原则的一个表现是每个班级都应该只有一个责任。

您正在构建的程序中的一项特定任务是执行温度转换。这就是接口ITemperatureConverter和具体实现的重点,例如FahrenheitToCelciusConverter。请注意,FahrenheitToCelciusConverter仅将华氏温度转换为摄氏温度。这是它的唯一责任。

另一项责任是在给定转换温度标度和转换为温度标度的情况下查找适当的转换对象。因此,当我们孤立一个责任时,我们应该有一个与这个责任相对应的阶级。这是类TemperatureConverterFactory的要点:给定转换的温度标度和转换为温度标度将产生适当的ITemperatureConverter

  

继承ITemperatureConverter的界面让我做什么?它是否允许我在.NET中使用温度转换的一些内置函数?

我们没有谈到继承接口,我们谈论实现它们。接口是契约,实现接口的类是其实例服从合同的类。考虑一个实现接口FahrenheitToCelciusConverter的类(例如ITemperatureConverter),说“我知道如何转换温度”。

据我所知,.NET Framework中没有任何内置的温度转换例程。

答案 1 :(得分:3)

我只是将任何输入转换为例如摄氏度。然后回到你想要的规模。

答案 2 :(得分: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虚拟或抽象或使用接口。

答案 3 :(得分:0)

我刚刚创建了温度转换器,我非常依赖代表。

创建一个可代表转换公式的委托,即

public delegate double ConversionFormula(double temperature);

这个委托的形状规定它需要一个双精度,即一个温度,并返回一个双倍,这将是转换后的值。

请注意,委托等同于实现单个方法接口的类。

使用要转换的公式定义一些方法。你可以创建一个普通的方法,使用匿名函数或者我发现使用Lambda表达式更简洁。当然,如果你不了解这些,你可能需要做一些研究。示例转换公式: -

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);
}

然后我将温度传递给适当的转换代表转换,嘿,你得到你需要的结果。