У меня есть некоторые классы, которые я разработал, которые я использую в приложении для Android. У меня в этом ядре около 6-7 классов, некоторые из них - абстрактные классы с абстрактными методами. Эти классы были созданы для предоставления API для расширения моего приложения для Android.
Теперь я хочу создать расширяемую систему, которая принимает правила перезаписи. Эти правила полезны для замены некоторых компонентов во время выполнения. Представьте себе систему с математическими операциями, где вы увидите все суммы, умножения и т.д. Теперь вы можете уменьшить масштаб, и я хочу упростить некоторые операции, зависящие от уровня масштабирования.
Моя система была построена в Java, но я верю, что scala с совпадением шаблонов упростит мою проблему. Тем не менее, каждый раз, когда я смотрю на scala, я вижу много времени, которое мне нужно потратить, и много головных гарнитур, настраивающих IDE...
Мои классы созданы для создания таких структур:
Я хочу иметь возможность писать правила, которые создают блок, содержащий другие блоки. Что-то вроде:
Integer Provider + Integer Provider -> Sum Provider
Sum Provider + Sum -> Sum Provider
Правила могут быть созданы программистами. Любой элемент моей структуры также может быть создан программистами. Я не знаю, упрощает ли scala эта система движка правила, но я знаю, что этот движок в java может быть скучным для сборки (вероятно, будет создано множество ошибок, я забуду некоторые случаи и т.д.).
Должен ли я изменить всю свою систему на scala? Или вам нужно использовать только эту особенность scala? Стоит ли это того?
PS: Для получения дополнительной информации о структуре см. Это сообщение в User Experience.
Да, в Scala легко написать такие правила, и на самом деле были некоторые вопросы о переполнении стека, связанные с системами перезаписи правил в Scala. Кроме того, есть некоторые библиотеки, которые могут помочь вам в этом, связанные со стратегическим программированием и nlp, но я их не использовал, поэтому я не могу много комментировать.
Теперь я точно не знаю, откуда эти классы. Если вы разбираете и строят их, библиотека комбинаторных парсеров может тривиально справиться с этим:
sealed trait Expr { def value: Int }
case class Number(value: Int) extends Expr
case class Sum(e1: Expr, e2: Expr) extends Expr { def value = e1.value + e2.value }
object Example extends scala.util.parsing.combinator.RegexParsers {
def number: Parser[Expr] = """\d+""" ^^ (n => Number(n.toInt))
def sum: Parser[Expr] = number ~ "+" ~ expr ^^ {
case n ~ "+" ~ exp => Sum(n, exp)
}
def expr: Parser[Expr] = sum | number
}
Если у вас есть эти классы другим способом и применяются упрощения, вы можете сделать это следующим образом:
def simplify(expr: List[Expr]): Expr = expr match {
case expr :: Nil =>
List(expr) // no further simplification
case (n1: NumberProvider) :: Plus :: (n2: NumberProvider) :: rest =>
simplify(SumProvider(n1, n2) :: rest)
case (n: NumberProvider) :: Plus :: (s: SumProvider) :: rest =>
simplify(SumProvider(n, s) :: rest)
case (s: SumProvider) :: Plus :: (n: NumberProvider) :: rest =>
simplify(SumProvider(s, n) :: rest)
case other => other // no further simplification possible
}
Важными элементами здесь являются классы случаев, экстракторы и сопоставление образцов.
Scala - одинокий разработчик, выразительный и мощный, поэтому после освоения может быть приятно писать меньше и делать больше - менее шаблонный код, более компактные идиомы.
Тем не менее, сила Scala действительно стоит дорого: это совершенно другой язык, с разными (и я бы сказал, более сложными) идиомами и синтаксисом Java. Java была разработана, чтобы быть преднамеренно простой, с идеей в том, что в более крупных организациях с большим количеством кода, предоставляемого разработчиками, простота объяснения и синтаксиса более ценна, чем блестяще сжатый код.
Java сделала преднамеренный выбор, чтобы предоставить меньший набор инструментов, чтобы сделать его максимально быстрым и легким, чтобы один разработчик мог забрать место, где еще остался, поэтому в этом смысле он ориентирован на развитие команды. Scala, тем не менее, дает вам немного больше веревки, чтобы сделать краткие, но менее сразу очевидные конструкции, что может быть минусом для крупных корпоративных сред.
В настоящее время Scala также имеет меньший пул разработчиков, чем Java, что означает меньшее количество примеров и меньший пул талантов, если вы когда-либо намереваетесь нанять команду разработчиков.
Но, как одинокий разработчик в сольном проекте или в небольшой сплоченной команде, Scala может быть веселым и быстрым, чтобы скомпоновать, как только вы перейдете через значительный горный учебник.
Если вы переключитесь на Scala, переключитесь на него для всего, что сможете. В Java нет смысла.
Стоит ли инвестировать? Из того, что можно прочитать в Интернете (и моего собственного впечатления), вы не станете быстрее с Scala, но вы многое узнаете.
Поэтому, если вас интересует только скорость разработки: игнорировать Scala.
Если вы хотите узнать: Scala - отличный выбор в качестве следующего языка для изучения и использования.