Должен ли я перейти на scala для создания системы с правилами перезаписи? - PullRequest
1 голос
/ 27 марта 2012

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

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

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

Мои классы созданы для создания структур, подобных этой:

an example of what I can build with my classes

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

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

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

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

PS: Для получения дополнительной информации о структуре, пожалуйста, смотрите этот пост на Пользовательский опыт .

Ответы [ 3 ]

2 голосов
/ 27 марта 2012

Да, такие правила легко написать в 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
}

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

0 голосов
/ 27 марта 2012

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

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

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

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

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

0 голосов
/ 27 марта 2012

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

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

Так что, если вас интересует только скорость разработки: игнорируйте Scala.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...