有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我应该改成scala来创建一个具有重写规则的系统吗?

我开发了一些类,我正在Android应用程序中使用它们。我在这个核心中有大约6-7个类,其中一些是带有抽象方法的抽象类。创建这些类是为了提供一个API来扩展我的Android应用程序

现在我想创建一个接受重写规则的可扩展系统。这些规则对于在运行时替换某些组件很有用。想象一个有数学运算的系统,你可以看到所有的和,乘法,等等。现在你可以缩小,我想根据缩放级别简化一些运算

我的系统是用java构建的,但我相信scala和模式匹配可以简化我的问题。然而,每次我看scala的时候,我都会看到我要花很多时间和很多头痛

我的类用于创建如下结构:

an example of what I can build with my classes

我希望能够编写规则,创建包含其他块的块。比如:

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

规则可以由程序员创建。我的结构中的任何元素也可以由程序员构建。我不知道scala是否简化了这个规则引擎系统,但我知道在java中构建这个引擎可能会很无聊(可能会产生很多bug,我会忘记一些情况,等等)

我应该把所有系统都改成scala吗?还是只有scala的这一功能可以使用?值得吗

PS:有关结构的更多信息,请参见本帖User Experience


共 (2) 个答案

  1. # 1 楼答案

    如果你要切换到Scala,尽你所能切换到它。使用Java几乎没有意义

    值得投资吗?从网上阅读的内容(以及我自己的印象)来看,使用Scala不会更快,但会学到很多东西

    所以,如果你只关心开发速度:忽略Scala

    如果你想学习:Scala是下一个学习和使用的语言

  2. # 2 楼答案

    是的,在Scala中编写这样的规则很容易,事实上,Scala中的规则重写系统在堆栈溢出方面存在一些问题。此外,有一些库可能会在这方面帮助您,与战略编程和nlp相关,但我没有使用它们,所以我不能发表太多评论

    现在,我不知道这些课程是从哪里来的。如果您正在解析和构建它们,parser combinator库可以轻松地处理它:

    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
    }
    

    这里的重要元素是案例类提取器模式匹配