我有一些我开发的类,我正在Android应用程序中使用它们。我在这个核心中有大约6-7个类,其中一些是带有抽象方法的抽象类。创建这些类是为了提供API来扩展我的Android应用程序。
现在我想创建一个接受重写规则的可扩展系统。这些规则对于在运行时替换某些组件很有用。想象一个有数学运算的系统,你可以看到所有的和,乘法等。现在你可以缩小,我想要简化一些依赖于缩放级别的操作。
我的系统是用java构建的,但我相信使用模式匹配的scala会简化我的问题。然而,每次我查看scala时,我发现我必须花费大量的时间和精力来配置IDE……
我的类是用来创建这样的结构的:

我希望能够编写规则来创建包含其他块的块。类似于:
Integer Provider + Integer Provider -> Sum Provider
Sum Provider + Sum -> Sum Provider规则可以由程序员创建。我的结构中的任何元素也可以由程序员构建。我不知道scala是否简化了这个规则引擎系统,但我知道这个引擎,在java中,构建起来可能会很无聊(问题是会产生很多but,我会忘记某些情况,等等)。
我应该把我所有的系统都换成scala吗?还是只能使用scala的这个特性?这值得吗?
PS:有关该结构的更多信息,请参阅User Experience上的这篇文章。
发布于 2012-03-28 02:03:24
是的,在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类、提取器和模式匹配。
发布于 2012-03-27 23:28:26
作为一个单独的开发人员,Scala的表现力和功能都很强大,所以一旦掌握它,就可以满足于少写多做--更少的样板代码,更紧凑的习惯用法。
然而,Scala的强大是有代价的:它是一种完全不同的语言,使用了与Java不同(我想说更复杂)的习惯用法和语法。Java被设计为故意简单,其思想是在开发人员之间共享更多代码的大型组织中,显式和语法简单性比出色的简洁性代码更有价值。
Java有意选择提供一个较小的工具集,以便让一个开发人员尽可能快速、轻松地从另一个开发人员停止的地方接过它,因此从这个意义上讲,它是面向团队开发的。然而,Scala为您提供了更多的线索来创建简洁但不那么明显的构造,这对于大型企业环境来说可能是个缺点。
目前,Scala的开发人员池也比Java小,这意味着如果你打算雇佣开发团队,那么示例更少,人才库也更小。
但是,作为一个单独项目或小型紧密团队中的独立开发人员,一旦您克服了重要的学习障碍,使用Scala编写代码可能会很有趣,而且速度很快。
发布于 2012-03-27 22:37:37
如果您要切换到Scala,请尽可能地切换到Scala。使用Java几乎没有意义。
这样的投资值得吗?从网上可以读到的东西(以及我自己的印象)看,使用Scala不会变得更快,但你会学到很多东西。
因此,如果您只关心开发速度:忽略Scala。
如果你想学习: Scala是学习和使用下一种语言的一个很好的选择。
https://stackoverflow.com/questions/9891638
复制相似问题