2011-01-11 7 views
1

Wann sind Prädikate geeignet und was ist das beste Muster für die Verwendung? Was sind die Vorteile von Prädikaten?Wann sind Prädikate geeignet und was ist das beste Muster für die Verwendung?

Es scheint mir wie die meisten Fälle, in denen ein Prädikat verwendet werden kann eine enge Schleife die gleiche Funktionalität erreichen würde?

Ich sehe nicht ein Wiederverwendbarkeitsargument, vorausgesetzt, Sie werden wahrscheinlich nur ein Prädikat in einer Methode richtig implementieren?

Sie sehen gut aus und fühlen sich gut an, aber abgesehen davon scheinen sie, als würden Sie sie nur einsetzen, wenn Sie einen schnellen Hack in den Sammelklassen brauchen?

UPDATE

Aber warum würden Sie die engen Schleife wieder und wieder umzuschreiben?

In meinem Kopf/code, wenn es um Sammlungen kommt ich am Ende immer mit so etwas wie

Class Person 
End Class 

Class PersonList 
    Inherits List(Of Person) 

    Function FindByName(Name) as Person 
     tight loop.... 
    End Function 
End Class 

@Ani

Mit derselben Logik ich die Methode als solche

implementieren könnte
Class PersonList 
    Inherits List(Of Person) 

    Function FindByName(Name) as PersonList 
    End Function 

    Function FindByAge(Age) as PersonList 
    End Function 

    Function FindBySocialSecurityNumber(SocialSecurityNumber) as PersonList 
    End Function 
End Class 

Und nennen Sie es so

Dim res as PersonList = MyList.FindByName("Max").FindByAge(25).FindBySocialSecurityNumber(1234) 

und das Ergebnis zusammen mit der Menge an Code und seine Wiederverwendbarkeit ist weitgehend die gleiche, nein?

Ich streite nicht nur versuchen zu verstehen.

+0

Warum würden Sie SQL verwenden, anstatt die Tabellen selbst in einer engen Schleife zu durchlaufen? Es sieht aus und fühlt sich gut an, aber abgesehen davon scheint es, als würden Sie es nur einsetzen, wenn Sie einen schnellen Hack in einer Datenbank benötigen. –

+2

(In Erwiderung auf Ihr Update) - Für ein realistisches Szenario, warum nicht * implementieren * die enge Schleife? Also, warum nicht 'FindByName',' FindByAge', 'FindBySocialSecurityNumber' schreiben? Was ist, wenn der Benutzer Personen zwischen 24 und 34 Jahren suchen möchte? Kannst du jeden möglichen Filter schreiben? Was wäre, wenn die Schleifenlogik komplexer wäre? – Ani

Antwort

2

Einer der Hauptvorteile von Prädikaten ist die Zusammensetzbarkeit. Zum Beispiel habe ich in meinem Projekt für natürliche Sprache komplexe Datumszeitabfragen, die aus der Eingabe natürlicher Sprache erzeugt werden, z. "Jeden Donnerstag im Mai 2010", die zu Datenbankabfragen werden, indem eine Reihe von Prädikaten zusammengestellt wird.

Prädikate werden in Kombination mit Expressions noch leistungsfähiger, da die Verarbeitung bis zur Laufzeit aufgeschoben und möglicherweise sogar an ein anderes System zur Ausführung übergeben werden kann (z. B. Linq an Entitäten).

Prädikate sind auch der Schlüssel zur funktionalen Programmierung.

+0

+1 Wenn ein Entwickler niemals eine funktionale Programmierung durchgeführt hat, versteht er die Konzepte des Pipelining nicht so gut und funktioniert als Daten beim Codieren. – Achilles

1

Es scheint mir, wie bei den meisten Fällen, in denen ein Prädikat kann eine enge Schleife eingesetzt werden, würde die gleiche Funktionalität erreichen?

Die Idee ist, dass Sie die gleiche „tight“ Schleife immer und immer wieder in „samt-same but different“ Szenarien unterschiedlicher nur der „Bedingung“ einen Teil davon zu schreiben werden. Warum verwenden Sie nicht die eingebaute Fähigkeit des Frameworks, diese Bedingung in Succint-Manier anzugeben, diese als Argument an die "Looping" -Methode zu übergeben und damit fertig zu werden?

1

Die Idee/das Muster hinter Prädikaten ist, wenn Sie eine Reihe von Bedingungen auf eine Reihe von Daten anwenden müssen, um die Daten zu transformieren.Sie können eine Schleife schreiben, um das gleiche Endziel zu erreichen, aber normalerweise werden Sie nur die Daten für einige Bedingungen abfragen und dann die qualifizierenden Teile davon in einer Liste sammeln. Durch die Verwendung der Frameworks-Funktion zur Unterstützung von Prädikaten muss ein neuer Entwickler, der den Code erweitert, die zum Sammeln der qualifizierten Daten verwendeten Mechanismen nicht neu erstellen.

Verwandte Themen