# Scala und Aspekte



## hemeroc (20. Jul 2010)

Hi,
ich hab gerade angefangen mir Scala ein wenig anzusehen und bin auf verschiedene Aussagen über AOP und Scala gestoßen. Unter anderem das Traits gleichwertig zu Aspekten sind.
Allerdings habe ich nirgends wirklich brauchbare Codebeispiele gefunden.
Ist es möglich über Traits zum Beispiel vor jeder Funktion ein logging zu machen wie es über Aspekte möglich ist?
LG
Hemeroc


----------



## Siassei (20. Jul 2010)

hemeroc hat gesagt.:


> Ist es möglich über Traits zum Beispiel vor jeder Funktion ein logging zu machen wie es über Aspekte möglich ist?


Ja und nein 

Im ernst. Scala zeichnet sich dadurch aus, dass es die Objekt-Orientierte-Welt und das Funktionale-Programmieren in einem vereint. Damit lässt sich sehr vieles anstellen und eröffnet neue Wege.

Schildere doch bitte einmal, welcher Grund/Anwendungsfall dich zu dieser Frage getrieben hat.
Ansonsten sehe ich deine Fragestellung als stümper haft an und ordne sie unter Trollversuch ein.

Gruß,
  Thomas


----------



## Marco13 (20. Jul 2010)

Siassei hat gesagt.:


> Ansonsten sehe ich deine Fragestellung als stümper haft an und ordne sie unter Trollversuch ein.



???:L :noe:


----------



## hemeroc (20. Jul 2010)

Siassei hat gesagt.:
			
		

> Im ernst. Scala zeichnet sich dadurch aus, dass es die Objekt-Orientierte-Welt und das Funktionale-Programmieren in einem vereint. Damit lässt sich sehr vieles anstellen und eröffnet neue Wege.


Ich weiß schon wodurch sich Scala auszeichnet, deshalb will ich es ja nutzen ich möchte wie gesagt nur wissen ob man damit auch Aspektorientiert arbeiten kann.


			
				Siassei hat gesagt.:
			
		

> Ansonsten sehe ich deine Fragestellung als stümper haft an und ordne sie unter Trollversuch ein.


Ich sehe zwar hier keinen Trollversuch (ich denke Marco13 wird mir da zustimmen) aber du kannst mich gerne aufklären und wenn du meine anderen Posts ein wenig verfolgt hast dann wüsstest du schon das ich nicht trolle aber ok,...


			
				Siassei hat gesagt.:
			
		

> Schildere doch bitte einmal, welcher Grund/Anwendungsfall dich zu dieser Frage getrieben hat.


Ein Beispiel für einen konkreten Anwendungsfall wäre:
Ich möchte eine Library mit Tracing versehen das geht indem ich entweder die komplette Lib unter Anwendung eines LoggingFrameworks teilweise neu schreibe oder besagten Klassen mit einem Tracing Aspect ausstatte.
Der Vorteil des Aspekts liegt klar auf der Hand, nichts neu schreiben und genauso leicht hinzuzufügen wie zu entfernen, mal ganz abgesehen von der verminderten Code redundanz.

So in etwa würde das mit AspectJ aussehen:

```
//Quelle: de.wikipedia.org/wiki/Aspektorientierte_Programmierung#Einf.C3.BChrendes_Beispiel

public aspect Tracing {
    pointcut traceCall():
        call(* AOPDemo.*(..));
 
    before(): traceCall() {
        System.out.println("Betrete \"" + thisJoinPoint + "\"");
    }
 
    after(): traceCall() {
        System.out.println("Verlasse \"" + thisJoinPoint + "\"");
    }

}
```

Und bevor du fragst warum ich nicht AspectJ verwende, ganz einfach ich will mit Scala arbeiten ich will im Prinzip früher oder später komplett auf Scala umsteigen da mir gerade das funktionale in Java fehlt. Allerdings mag ich die Vorzüge des Aspektorientierten Programmierens deshalb die Frage ob sich so etwas mit Scala realisieren lässt.

LG hemeroc


----------



## Siassei (20. Jul 2010)

hemeroc hat gesagt.:


> Ich sehe zwar hier keinen Trollversuch (ich denke Marco13 wird mir da zustimmen) aber du kannst mich gerne aufklären und wenn du meine anderen Posts ein wenig verfolgt hast dann wüsstest du schon das ich nicht trolle aber ok,...


Entschuldige, leider lese ich öfters so allgemeine Fragestellungen zu Themen, die mit viel Emotionen diskutiert werden.

Mit Traits bzw. Mixin lassen sich Aufgabenstellungen, die aus Aspekte stammen, eleganter zu schreiben als das in Java (Sprache) der Fall ist. Der Aufwand ist dennoch größer, als die Verwenung von JAspect. Hier findest du einen, meiner Meinung nach, guten Vergleich zwischen Scala und Aspects.
Traits vs. Aspects in Scala
Da Scala eine Sprache für Java (Framework / JVM) ist, kannst du auch in Scala mit JAspects arbeiten. Du musst lediglich auf ein paar Namensgebungen achten. z.B. bei "def +(i:Int) = ...."

Was kann man mit Traits noch so anstellen?
A Tour of Scala: Mixin Class Composition | The Scala Programming Language
A Tour of Scala | The Scala Programming Language

Anmerkung: Traits sollten nur Methoden enthalten, die noch nicht existieren!
Ungetestet.

```
trait Geschlecht { def name:String = "Frei" }
trait Mann extends Geschlect { override def name = "Mann" }
trait Frau extends Geschlecht { override def name = "Frau" }

class Mensch extends Frau { }
class Tier extends Mensch with Mann { }

def abc() = {
  val a = new Mensch
  Console.println(a.name)
  val b = new Mensch with Mann
  Console.println(b.name)
  val c = new Tier with Mann
  Console.println(c.name)
}
```


----------

