Заменить условные логики c на шаблон стратегии - PullRequest
0 голосов
/ 05 апреля 2020

У меня длинная условная логика c. Хотелось иметь эффективный способ сделать это.

(city, country) match {

("USA","NewYork") => someVal=1.0
("USA","SomeOther")=> someVal =2.0
....
}

У меня есть эта справочная логика c внутри l oop, как правильно ли я это делаю. Может быть многоключевая карта или шаблон состояния в Scala

1 Ответ

1 голос
/ 05 апреля 2020

У вас есть несколько способов сделать это. Помимо одного использованного вы можете попробовать также:

val map1: Map[(String, String), Double]
map1((country, city)): Double // or
map1.get((country, city)): Option[Double]

или

val map2: Map[String, Map[String, Double]]
map2(country)(city): Double
map2.get(country).flatMap(_.get(city)): Option[Double]

Какой из них быстрее? Я не знаю. Вы должны будете сделать тесты для вашего варианта использования. Map, вероятно, быстрее, чем match, но без тестов никто не может сказать, сколько. Какая карта быстрее? map1 или map2? Мы могли бы догадаться, но без тестов для ваших вариантов использования, это просто догадка.

К сожалению, пока вы не запустите что-то вроде JMH и сравните результаты, это может быть просто результаты для холодной JVM .

И, пока вы используете String в качестве ключей, было бы трудно предложить какое-либо решение, например Strategy или что-нибудь из GoF, et c, потому что они полагаются на возможность добавьте некоторое свойство / метод к классу, чтобы сделать вычисления более дешевыми и / или из-за того, что существует конечное число возможностей, которое открывает некоторые оптимизации.

...