2012-03-27 9 views
1

Ich habe einige Klassen, die ich entwickelt habe, die ich in einer Android-Anwendung verwende. Ich habe ungefähr 6-7 Klassen in diesem Kern, einige von ihnen sind abstrakte Klassen mit abstrakten Methoden. Diese Klassen wurden erstellt, um eine API zur Erweiterung meiner Android-Anwendung bereitzustellen.Sollte ich zu scala wechseln, um ein System mit Rewrite-Regeln zu erstellen?

Jetzt möchte ich ein erweiterbares System erstellen, das Rewrite-Regeln akzeptiert. Diese Regeln sind nützlich, um einige Komponenten zur Laufzeit zu ersetzen. Stellen Sie sich ein System mit mathematischen Operationen vor, wo Sie alle Summen, Multiplikationen usw. sehen. Jetzt können Sie verkleinern und ich möchte einige Operationen abhängig von der Zoomstufe vereinfachen.

Mein System wurde in Java gebaut, aber ich glaube, dass Scala, mit Mustervergleich, mein Problem vereinfachen wird. Doch jedes Mal wenn ich an scala aussehen sehe ich viel Zeit habe ich zu verbringen und viele headches IDEs Konfiguration ...

Meine Klassen gebaut Strukturen zu schaffen, wie diese:

an example of what I can build with my classes

Ich möchte in der Lage sein, Regeln zu schreiben, die einen Block erstellen, der andere Blöcke enthält. Etwas wie:

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

Regeln können von Programmierern erstellt werden. Jedes Element meiner Struktur kann auch von Programmierern erstellt werden. Ich weiß nicht, ob scala dieses Regel-Engine-System vereinfacht, aber ich weiß, dass diese Engine, in Java, langweilig zu bauen sein kann (wahrscheinlich werden viele Bugs erstellt, ich werde einige Fälle vergessen, usw.).

Sollte ich alle meine System zu scala ändern? Oder ist es weg, nur diese Eigenschaft von scala zu verwenden? Lohnt es sich?

PS: Weitere Informationen zur Struktur finden Sie in diesem Beitrag unter User Experience.

+0

Android-Unterstützung für Scala ist immer noch nicht gut. Wenn Sie beabsichtigen, auf Android zu laufen, würde ich Scala nicht empfehlen. – Jus12

+1

Ja, ich weiß das ... Obwohl in letzter Zeit Verbesserungen an der Performance vorgenommen wurden: http://scalandroid.blogspot.pt/ –

Antwort

2

Ja, es ist einfach, solche Regeln in Scala zu schreiben, und tatsächlich gab es einige Fragen zu Stack Overflow in Bezug auf Regelumschreibsysteme in Scala. Außerdem gibt es einige Bibliotheken, die dir dabei helfen können, im Zusammenhang mit strategischer Programmierung und nlp, aber ich habe sie nicht benutzt, daher kann ich nicht viel sagen.

Jetzt weiß ich nicht genau, woher diese Klassen kommen. Wenn Sie das Parsen und bauen sie, kann der Parser combinator Bibliothek es trivialer handhaben:

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 
} 

Wenn Sie diese Klassen in einer anderen Art und Weise haben und Vereinfachungen anwenden, können Sie es wie dies tun könnte:

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 
} 

Die wichtigen Elemente sind hier Fallklassen, Extraktoren Muster und entsprechen.

+0

Danke, dass Sie mir gezeigt haben, wie die Lösung aussehen könnte. Es ist wirklich verlockend, sich in Scala zu verwandeln. Ich werde jedoch einen anderen sauberen Ansatz versuchen. Ich werde eine Prolog-Engine verwenden und die Regeln werden Fakten in Prolog sein :). Wenn das nicht funktioniert, werde ich zu Scala wechseln. Probly Kann ich diese Funktionen in Scala erstellen, sie in ein Glas exportieren und dieses Glas in meinem Kern verwenden? –

+0

@Tiago Scala kommt mit einer Bibliothek, die für mobile Standards ziemlich groß ist. Für eine Scala-Anwendung ist das genau so, aber es macht die Kosten für das Hinzufügen von nur einer kleinen Funktionalität zu einem ansonsten Java-Programm ziemlich groß. Auch Scalas Werkzeug, insbesondere SBT und seine Plugins, kümmern sich um viele Probleme durch die mobile Entwicklung. Wenn Sie es aufgeben, müssen Sie all diese Arbeit reproduzieren. Wenn Sie SBT als Build-Tool verwenden, werden Sie viel mehr in Scala investieren. –

-1

Wenn Sie zu Scala wechseln, wechseln Sie für alles, was Sie können. Es gibt kaum einen Punkt in der Verwendung von Java.

Ist es die Investition wert? Von dem, was man im Internet lesen kann (und von meinem eigenen Eindruck), wirst du mit Scala nicht schneller werden, aber du wirst viel lernen.

Also, wenn Sie nur mit Entwicklungsgeschwindigkeit betroffen sind: Scala ignorieren.

Wenn Sie lernen möchten: Scala ist eine gute Wahl als nächste Sprache zu lernen und zu verwenden.

+0

Noch immer nicht sicher über den Status/Vollständigkeit/Leichtigkeit der Verwendung von Scala mit Android, was aber wäre nett. Das letzte Mal, als ich nachgesehen habe, war es möglich, aber ich wusste nicht, wie komplett es war. –

+0

Aber in diesem Fall glaube ich, dass Mustererkennung tatsächlich diesen Teil beschleunigen würde. Etwas tun scala's Mustervergleich in Java ist mühsam und langweilig. Meine Klassen sind verbunden und ich werde Regeln haben wie: Wenn KlasseA mit Klasse B verbunden ist, dann erzeuge eine KlasseC, die in KlasseA + KlasseB -> KlasseC übersetzt werden kann. Mit dem Mustervergleich glaube ich, dass das einfach wäre. Ich wollte es genau wissen. Vielleicht werde ich ein Beispiel geben. –

+0

Scala-Code wird viel kürzer sein, aber das ist nicht, wo die Zeit in der Softwareentwicklung geht. Scala ist großartig, aber es ist keine Wunderwaffe. –

0

Als einsamer Entwickler ist Scala ausdrucksstark und leistungsfähig, so dass einmal gemeistert werden kann, um weniger zu schreiben und mehr zu tun - weniger Vortex-Code, kompaktere Idiome.

Allerdings hat die Leistung von Scala ihren Preis: Es ist eine völlig andere Sprache, mit anderen (und ich würde sagen komplexeren) Idiomen und Syntax von Java. Java wurde bewusst absichtlich einfach gestaltet, mit der Idee, dass in größeren Organisationen, in denen mehr Code zwischen Entwicklern ausgetauscht wird, die Einfachheit und Syntax-Einfachheit wertvoller sind als brillanter Code.

Java hat sich bewusst für ein kleineres Toolset entschieden, um es einem Entwickler so schnell und einfach wie möglich zu machen, wo andere aufhören, also in diesem Sinne auf die Teamentwicklung ausgerichtet ist. Scala bietet Ihnen jedoch ein wenig mehr Möglichkeiten, um prägnante, aber weniger augenfällige Konstrukte zu erstellen, was für große Unternehmensumgebungen ein Nachteil sein kann.

Derzeit hat Scala auch einen kleineren Entwicklerpool als Java, was weniger Beispiele und einen kleineren Talentpool bedeutet, wenn Sie jemals ein Entwicklungsteam einstellen möchten.

Aber als Einzelentwickler in einem Solo-Projekt oder in einem kleinen, engmaschigen Team kann Scala Spaß machen und schnell mit dem Code umgehen, sobald man den signifikanten Lernhöcker überwunden hat.

Verwandte Themen