Я пытаюсь решить проблему, которая обрабатывает преобразование из одной единицы температуры в другую (Цельсия, Кельвина, Фаренгейта).Функциональный способ реализации стратегического шаблона
В Java Мне нужно создать интерфейс и предоставить несколько реализаций, которые инкапсулируют тип ввода и возвращают результат как единицу типа вывода. например, Кельвина до Цельсия или Цельсия до Фаренгейта и т. д. Я переработал свой код в scala до следующего, но все же я чувствую, что он нарушает принцип открытого закрытого типа, поскольку в случае, если мне нужно добавить другой тип, мне нужно изменить существующий код. сохранить код функциональной, а также приверженцем ОТКРЫТО зАКРЫТО принцип Просьба игнорировать логику для преобразования
object TempConverter extends App {
object UnitType extends Enumeration {
type EnumType = Value
val cel, fah, kel = Value
}
def convert(x: Double, i:UnitType.Value,o:UnitType.Value) = {
strategy(i,o)(x)
}
def strategy(inputType: UnitType.Value, outputType: UnitType.Value) = {
inputType match {
case UnitType.cel => celsius(outputType)
case UnitType.kel => kelvin(outputType)
case UnitType.fah => fahrenheit(outputType)
}
}
def celsius(outputType: UnitType.Value) = {
outputType match {
case UnitType.fah => x: Double => x * 1.8 + 32
case UnitType.kel => x: Double => x * 1.8 + 32
}
}
def kelvin(outputType: UnitType.Value) = {
outputType match {
case UnitType.cel => x: Double => x - 273.5
case UnitType.fah => x: Double => x * 1.8 + 32
}
}
def fahrenheit(outputType: UnitType.Value) = {
outputType match {
case UnitType.cel => x: Double => x * 1.8 + 32
case UnitType.fah => x: Double => x * 1.8 + 32
}
}
println(convert(32.0, UnitType.cel, UnitType.fah))
}