The most efficient object-oriented approach to a 4-way temperature converter

So, I am trying to work with a temperature converter that converts the temperature of a Fahrenheit, Celsius, Kelvin or Rankin source to Fahrenheit, Celsius, Kelvin or Rankin.

Now I am trying to do this (in C #) in accordance with the recommendations of OO best practices.

I came across a roadblock early on, though, and I need some advice on how to proceed.

I have a class TempConvertthat is currently processing the interface and implementation of the program.

Then I have a file Main.csthat will actually execute the method Main().

This will be a console program, mind you.

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

Now I do not know if this is a good start or not.

, ( 4 , ) .

, , , , 10 SourceTemp 20 TargetTemp, , .

, , int, 1, 2, 3 4. , , , .

+3
4

- :

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? .

. , .

, , . ITemperatureConverter , FahrenheitToCelciusConverter. , FahrenheitToCelciusConverter . .

- . , , , . TemperatureConverterFactory: ITemperatureConverter.

ITemperatureConverter? .NET?

, . - , , , - , . (, FahrenheitToCelciusConverter), ITemperatureConverter " , ".

, .NET Framework .

+3

, . . .

+3
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);

, , , .

, , .

. , , . , , , , . : -

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

Then I turn to temperature to convert with the appropriate conversion delegate and, if you need, you will get the desired result.

0
source

Source: https://habr.com/ru/post/1776277/


All Articles