Es ist wahr, was sie über Designmuster sagen, dass sie einfach die Verkörperung von Techniken sind, die bereits allgemein verwendet werden. Ich verwende das Active Record Pattern seit 1985.Best Practices für Active Record Pattern und die Verwendung von statischen Methoden für Gruppenoperationen
Eines der Attribute dieses Musters ist die Verwendung von statischen Mitgliedern in der Implementierung, um Suchen durchzuführen, die Sammlungen der zugrunde liegenden Daten zurückgeben.
class Customer {
static Customer FindCustomerById(int Id) { ... }
static Customer[] FindActiveCustomers() { ... }
}
In vielen Fällen, in denen ich viel mehr Flexibilität muss ich brechen Kapselung und umfassen ein Verfahren, wie
static Customer[] FindCustomers(string criteria) { ... }
wo man es als
Customer[] customers = Customer.FindCustomers("LastName = 'Smith'");
Natürlich nennen würde dies eine ist von diesem Zeitpunkt an, als ich dieses Muster in C verwendet habe, ist eindeutig keine Best Practice, und in den falschen Händen kann SQL-Injektion und andere Probleme führen.
Gibt es ein geeignetes Muster oder eine Praxis, die angewendet werden könnte, damit die Kundenklasse ein "Kriterium" für eine solche Suche werden könnte?
Zum Beispiel nehme ich mag Kunden, dessen Nachnamen zu finden war Smith, halte ich könnte eine Implementierung wie das Schreiben:
static Customer[] FindCustomers(Customer customer) { ... }
genannt zu werden als (mit dem entsprechenden Konstruktor natürlich):
Customer[] customersnamedsmith =
Customer.FindCustomer(new Customer("Smith"));
Oder ist es besser, eine Co-Klasse zu erstellen, die die Kriterien definieren würde?
Ich glaube nicht, dass es die Einkapselung bricht, solange die möglichen Kriterien auf die exponierten Attribute beschränkt sind. – Pesto
Ich gab an, dass die Kapselung bei Verwendung generischer SQL WHERE-Syntaxkriterienzeichenfolgen unterbrochen wurde. In diesem Fall basieren die Kriterien nicht auf den Mitgliedsfeldern der Klasse. Indem der Benutzer der Klasse aufgefordert wird, SQL zu verwenden, um die Kriterien anzugeben, überlasse ich die Implementierungsdetails. – Bill