Должен ли я перейти на scala для создания системы с правилами перезаписи?

1

У меня есть некоторые классы, которые я разработал, которые я использую в приложении для Android. У меня в этом ядре около 6-7 классов, некоторые из них - абстрактные классы с абстрактными методами. Эти классы были созданы для предоставления API для расширения моего приложения для Android.

Теперь я хочу создать расширяемую систему, которая принимает правила перезаписи. Эти правила полезны для замены некоторых компонентов во время выполнения. Представьте себе систему с математическими операциями, где вы увидите все суммы, умножения и т.д. Теперь вы можете уменьшить масштаб, и я хочу упростить некоторые операции, зависящие от уровня масштабирования.

Моя система была построена в Java, но я верю, что scala с совпадением шаблонов упростит мою проблему. Тем не менее, каждый раз, когда я смотрю на scala, я вижу много времени, которое мне нужно потратить, и много головных гарнитур, настраивающих IDE...

Мои классы созданы для создания таких структур:

Изображение 174551

Я хочу иметь возможность писать правила, которые создают блок, содержащий другие блоки. Что-то вроде:

Integer Provider + Integer Provider -> Sum Provider
Sum Provider + Sum -> Sum Provider

Правила могут быть созданы программистами. Любой элемент моей структуры также может быть создан программистами. Я не знаю, упрощает ли scala эта система движка правила, но я знаю, что этот движок в java может быть скучным для сборки (вероятно, будет создано множество ошибок, я забуду некоторые случаи и т.д.).

Должен ли я изменить всю свою систему на scala? Или вам нужно использовать только эту особенность scala? Стоит ли это того?

PS: Для получения дополнительной информации о структуре см. Это сообщение в User Experience.

  • 0
    Поддержка Android для Scala все еще не очень хороша. Если вы собираетесь работать на Android, я бы не советовал использовать Scala.
  • 1
    Да, я знаю это ... Хотя в последнее время были сделаны улучшения в производительности: scalandroid.blogspot.pt
Теги:
architecture

3 ответа

2
Лучший ответ

Да, в 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
}

Важными элементами здесь являются классы случаев, экстракторы и сопоставление образцов.

  • 0
    Спасибо, что показали мне, как может выглядеть решение. Это действительно заманчиво, чтобы превратиться в скалу. Однако я попробую другой аккуратный подход. Я буду использовать движок пролога, а в прологе правила будут фактами :). Если это не сработает, вероятно, я перейду на Scala. Возможно, я могу создать эти функции в Scala, экспортировать их в банку и использовать эту банку в своем ядре?
  • 0
    @Tiago Scala поставляется с библиотекой, которая для мобильных стандартов довольно велика. Для приложения Scala это так, как есть, но это делает затраты на добавление небольшой функциональности в другие Java-программы довольно большими. Кроме того, инструментарий Scala, в частности SBT и его плагины, заботится о многих трудностях мобильной разработки. Если вы оставите это, вам придется воспроизвести всю эту работу. Если вы используете SBT в качестве инструмента для сборки, вы будете гораздо больше инвестировать в Scala.
0

Scala - одинокий разработчик, выразительный и мощный, поэтому после освоения может быть приятно писать меньше и делать больше - менее шаблонный код, более компактные идиомы.

Тем не менее, сила Scala действительно стоит дорого: это совершенно другой язык, с разными (и я бы сказал, более сложными) идиомами и синтаксисом Java. Java была разработана, чтобы быть преднамеренно простой, с идеей в том, что в более крупных организациях с большим количеством кода, предоставляемого разработчиками, простота объяснения и синтаксиса более ценна, чем блестяще сжатый код.

Java сделала преднамеренный выбор, чтобы предоставить меньший набор инструментов, чтобы сделать его максимально быстрым и легким, чтобы один разработчик мог забрать место, где еще остался, поэтому в этом смысле он ориентирован на развитие команды. Scala, тем не менее, дает вам немного больше веревки, чтобы сделать краткие, но менее сразу очевидные конструкции, что может быть минусом для крупных корпоративных сред.

В настоящее время Scala также имеет меньший пул разработчиков, чем Java, что означает меньшее количество примеров и меньший пул талантов, если вы когда-либо намереваетесь нанять команду разработчиков.

Но, как одинокий разработчик в сольном проекте или в небольшой сплоченной команде, Scala может быть веселым и быстрым, чтобы скомпоновать, как только вы перейдете через значительный горный учебник.

-1

Если вы переключитесь на Scala, переключитесь на него для всего, что сможете. В Java нет смысла.

Стоит ли инвестировать? Из того, что можно прочитать в Интернете (и моего собственного впечатления), вы не станете быстрее с Scala, но вы многое узнаете.

Поэтому, если вас интересует только скорость разработки: игнорировать Scala.

Если вы хотите узнать: Scala - отличный выбор в качестве следующего языка для изучения и использования.

  • 0
    Все еще не уверен в статусе / полноте / простоте использования Scala с Android, хотя, что было бы неплохо. В прошлый раз, когда я проверял, это было возможно , но я не знал, насколько это было завершено.
  • 0
    Однако в этом случае я считаю, что сопоставление с образцом на самом деле ускорит эту часть. Делать что-то с шаблоном соответствия scala в Java - это утомительно и скучно. Мои классы связаны, и у меня будут правила, такие как: если classA соединен с classB, тогда создайте classC, который можно перевести в classA + classB -> classC. С сопоставлением с образцом я верю, что это будет легко. Я хотел знать наверняка. Может быть, я приведу пример.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню