Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

31.07.2014, 08:46

Sinn und nutzen von Anonymen Methoden / Lambda Expressions

Guten Morgen,

ich bin gerade bei dem Thema Anonyme Methoden / Lambda Expression und Delegaten.

Delegaten und Events habe ich mittlerweile verstanden und sehe auch den Sinn davon.

Ausserdem wenn ich es richtig verstanden habe. Sind Lambda Expressions eigentlich das gleiche wie Anonyme Methoden nur eben eine einfachere Schreibweise?

Gut dennoch verstehe ich nicht wieso ich dieses Feature benutzen sollte. Da meiner Meinung nach der Code unleserlicher wird wenn ich eine Methode in eine Methode packe.
Weil ich genauso einfach eine neue Methode in der Klasse anlegen könnte und habe somit meinen Code schön unterteilt.

Natürlich gehe ich davon aus das es sehr gute Nutzen für dieses Sprach Feature gibt, deswegen würde ich mich freuen wenn mir jemand mal ein simples Beispiel in der Spieleprogrammierung zeigen könnte damit ich vielleicht den Nutzen von Lambdas verstehe.

Vielen Dank im Voraus.

Grüße

WhySoSad

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

31.07.2014, 08:59

Mal vom Syntax-Sugar abgesehen, dass viel schneller ein var y = myList.Find(x => x.Age > 15 ); geschrieben ist als eine externe Methode, ist eine Methode eigentlich eine Fähigkeit der Klasse, der sie angehört. Eine Methode nach dem Motto "AgeEquals(SomeOtherClass c, int age)" ist aber nur eine Helper-Methode und hat für die Klasse selbst eigentlich keinen Nutzen und stellt auch keine Fähigkeit so eines Objekts dar. Sie gehört sogar statisch und am besten noch in eine reine Helper-Klasse rein, damit sie eben die Klasse nicht mit nicht semantisch zugehörigen Methoden verseucht. Das ist natürlich totaler Overkill.

Was ist also wirklich schöner? Ein internes verstecktes Implementierungsdetail über Lambda oder eine Helper-Klasse mit einer für den Rest des Programms eigentlich eher unnützen Methode?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

3

31.07.2014, 09:02

Ein simples Beispiel waere z.b. eine Waffe zu konfigurieren, wie sie auf Gegner wirkt. Du schreibst eine allgemeine Funktion, diese ist wendet erst eine Funktion auf alle Gegner an, um zu bestimmen, welche getroffen wurden und dann eine zweite, welche auf jeden getroffenen Gegner aufgerufen wird. Eine Railgun uebergibt dann z.b. eine Lamda um alle Gegner in einer Linie auszuwaehlen und eine zweite die jeder Gegner instant toetet. Eine andere Waffe waehlt z.b. alles im Umkreis von 10 Einheiten aus und verlangsamt diese Gegner auf 50%.

xTr1m

1x Rätselkönig

Beiträge: 47

Wohnort: Rheinland-Pfalz

Beruf: Softwareentwicklung

  • Private Nachricht senden

4

31.07.2014, 09:13

Ich komme aus der C# Welt, dennoch sind meine Aussagen auch für jede Sprache mit Lambdas zutreffend (bis auf die Codebeispiele weiter unten).
Aus meiner persönlichen Erfahrung macht es in mindestens zwei Fällen Sinn: 1) Die anonyme Methode ist so kurz, dass sie 3x größer wäre, wenn sie nicht anonym wäre; 2) Beim lesen des codes muss man nicht zur Methode hin und zurück springen um zu schauen wie sie funktioniert.
Beispiel zu 1: Liefere mir die Namen aller Personen:

Quellcode

1
    return m_People.Select(p => p.Name);

Im vergleich zur nicht anonymen Methode:

Quellcode

1
2
3
4
5
6
    return m_People.Select(GetNameFromPerson);
//...
    string GetNameFromPerson(Person p)
    {
        return p.Name;
    }

Beispiel zu 2: asynchrone Operationen! Wenn viele methoden void zurückliefern und eine "OnComplete" action als Argument wollen, ists sehr schwer sich im Code beim lesen zu orientieren, wenn man keine lambdas nutzt:

Quellcode

1
2
3
4
5
6
7
public void SubmitFile(string file, Action onComplete)
{
    repository.Update(() => 
    repository.CheckOut(file, () => 
    repository.RevertIfUnchanged(() =>
    repository.Submit(onComplete))));
}

Im Vergleich ohne Lambdas:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
string m_sFile;
Action m_onComplete;
public void SubmitFile(string file, Action onComplete)
{
    m_sFile = file;
    m_onComplete = onComplete;
    repository.Update(SubmitFile_CheckOut);
}
private void SubmitFileCheckOut()
{
    repository.CheckOut(m_sFile, SubmitFile_RevertIfUnchanged);
}
private void SubmitFile_RevertIfUnchanged()
{
    repository.RevertIfUnchanged(SubmitFile_Submit);
}
private void SubmitFile_Submit()
{
    repository.Submit(m_onComplete);
}


Für lambdas sprechen bessere Lesbarkeit und höhere Entropie.

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

5

31.07.2014, 09:35

Naja, letztendlich fügen die Lambdas ja keine Funktionalität hinzu, oder? Korrigiert mich wenn ich da Mist erzähle, ihr seid da eindeutig besser informiert als ich, aber Functor-Objekte können ja auch den gleichen Zweck erfüllen. Bloß sind die halt unnötig "komplex" bzw mit Arbeit verbunden, die man bei Lambdas einfach nicht hat.. Ich finde es persönlich mit Lambdas auch intuitiver.
WIP Website: kevinheese.de

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

31.07.2014, 09:57

Ein Lambda fügt keine weitere Funktionalität zur Klasse als solches hinzu. Eine Methode statt einem Lambda würde das aber tun.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

31.07.2014, 11:06

Das mit der Lesbarkeit ist auch so eine Sache. Jetzt grad ist das ganze neu für dich und du findest es eher unleserlich weil ungewohnt. Du wirst dich aber fix daran gewöhnen und dann wirst du es vermutlich auch nicht mehr so unleserlich finden. Das hat man schon mal wenn man neue Sprachfeatures kennen lernt. Alles andere wurde meiner Meinung nach ja schon gesagt. Ansonsten frag noch mal genauer nach.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

8

31.07.2014, 12:05

Um mal nochmal auf die Ursprüngliche Frage zurück zu kommen, weil die eigentlichen anonymen Methoden hier bisher irgendwie verschwiegen wurden.
Ja, Lambdas sind in C# reiner Syntax-Sugar. Um nochmal das Beispiel von BlueCobold aufzugreifen...
Mit Lambdas die erst in 3.x hinzugefügt wurden:
= myList.Find(x => x.Age > 15);

Bereits zuvor (und auch heute noch) gibt es den Syntax der anonymen Methode:
= myList.Find(delegate(TYPE x) { x => x.Age > 15 }); (Typ bitte einsetzen... ;))

Der Unterschied ist, dass die neue Variante besonders bei so Simpelbeispielen etwas kompakter ist weil das Schlüsselwort "delegate" nicht mehr notwendig ist und die geschweiften Klammern weggelassen werden können. Außerdem kann das Lambda zusätzlich die Typen automatisch ermitteln, man kann es auch explizit angeben. Vom Syntax abgesehen, gibt es aber keine weiteren Unterschied. Die große Neuheit ist es also nicht, nur ganz praktisch.

Besonders in C++ verwende ich Lambdas inzwischen auch sehr gerne als Nested Functions Ersatz, wie andere Sprachen wie zum Beispiel D das auch direkt unterstützen. Das ist sehr praktisch einfach auf lokale Variablen zugreifen zu können, Lokalität zu waren und speziell in C++ nicht den Header "vollzumüllen".

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (31.07.2014, 12:12)


Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

9

31.07.2014, 12:50

Wenn es rein danach gehen würde "fügt keine weitere Funktionalität hinzu", dann würde man eine ganze Menge aus C# rauswerfen. Properties? Fügt keine Funktionalität hinzu.
LINQ? Sowieso nicht. yield? Man kann den Enumerator auch zu Fuß implementieren. Usw.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

10

31.07.2014, 13:00

Legend da hast du glaube ich was falsch verstanden. Das wurde eigentlich als Vorteil genannt. Man fügt der Klasse keine neue Funktionalität hinzu. Darum geht es. Wenn du zum Beispiel eine Ordnungsfunktion für die Sortierung von Elementen hast dann kannst du im Code direkt eine anonyme Funktion nutzen und musst der umschließenden Klasse keine Methode hinzufügen die ihr logisch nicht gehören sollte. Weiterhin brauchst du keine Hilfsklasse schreiben die nur solche Methoden hält. Du nimmst einfach die anonyme Methode bzw die Lambda Expression und hast an keiner Stelle eine Methode die eigentlich niemand wirklich haben möchte. Hierbei ging es also eher um einen Vorteil.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige