Frage

Schnell Hintergrund: Ich bin Programmierung in PHP, habe ich ein Domain-Modell mit einem separaten Datenzugriffsschicht (DAO-Klassen), die zum Abrufen von Daten aus der DB verantwortlich ist und Domain-Klassen zu schaffen

.

Lassen Sie uns sagen, dass ich eine DAO Klasse verantwortlich für die Erstellung von Gruppe und Gruppenliste Objekte. Sie können die Gruppen als Bestandteil eines sozialen Netzwerks vorstellen; obwohl es nicht wirklich wichtig, was sie für diese Frage sind.

Ich muss in der Lage sein, die DAO zu bitten, mir verschiedene machen Gruppenliste Objekte basierend auf verschiedenen Kriterien:

  • die zuletzt hinzugefügten Gruppen
  • die beliebtesten Gruppen
  • Gruppen, die als "funktionsfähigen" von einem Administrator
  • Gruppen mit einem bestimmten Tag versehen
  • Gruppen ein bestimmtes Keyword passende
  • Gruppen innerhalb einer bestimmten Kategorie
  • Gruppen von einer bestimmten Person erstellt
  • Gruppen an einem bestimmten Tag erstellt

Einige davon ich nicht wirklich tun müssen, gerade jetzt, aber ich kann Art vorstellen, ich sie, bevor das Projekt benötigen getan. Nun begann ich mit einer schönen einfachen DAO-Methode aus: Createlist . Das hat super funktioniert. Sie können als der Pseudo-Code denken:

find out how many groups
create SQL query to fetch group details
loop through results
{
   create group object
   add to group list object
}

Als meine Anwendung fortgeschritten, habe ich dann eine neue Methode createFeaturedList . Das hat super funktioniert. Aber es war wirklich sehr, sehr ähnlich wie Createlist , mit einer etwas anderen Abfrage. Viele der Rest der ~ 150 Zeilen Code identisch waren.

So ... Was soll ich alles tun, um die etwas andere Fälle, die ich brauche? Die meiste Zeit will ich wirklich nur filtern und sortieren Sie die Liste nach bestimmten Kriterien. Die Frage ist - sollte ich:

a) erstellen viele konzentriert creational Methode wie:

  • Createlist ()
  • createCategoryList (categoryObject)
  • createUsersList (Benutzerobjekt)
  • createTagList (tag)
  • createPopularList ()

oder

b) ein BIG-Methode erstellen, der alles kann:  - Createlist (searchString-, orderBy, filterByCategoryObject = null, filterByUserObject = null)

Ich mag die Idee von (a), weil mein DAO-Schnittstelle ist einfacher und weniger wahrscheinlich ändern müssen (zB: das Hinzufügen einer weiteren Parameters, wenn ich plötzlich in einem Datum geben muß vergleichen gegen ) Die Schwierigkeit kommt, wenn man Sachen wie Suchbegriffen, die Sie mit anderen Parametern kombinieren zu können, wollen; zB: gesuchte Liste Kategorie, gesucht beliebte Liste gesucht Tag-Liste etc ... (a) ist eine Art, was ich mit angefangen habe aus

.

Ich habe einen Flirt mit Refactoring (b) hatte, aber ich kann meine Methode sehen sehr groß wird und sehr komplex ziemlich schnell, viele „wenn“ s und „wählen Sie“ s mit den verschiedenen Fälle zu behandeln, wenn der Bau SQL, und viele der Parameter, die in das Verfahren eingespeist werden. Aber zumindest ist es alles an einem Ort. Und Sie können Dinge kombinieren; zB: ein Benutzergruppen, mit blah getaggt, passende Keywords bla.

War es hilfreich?

Lösung

Sie können eine private Methode machen, dass alle öffentlichen Methoden in rufen. IE

private function _createList ( searchString, orderBy, ... )
{
    ...
}

public function createList()
{
    return $this->_createList('...', 'id');
}

public function createCategoryList()
{
    return $this->_createList('...', 'category_id');
}

Auf diese Weise, wenn Ihre _createList Funktion geändert werden muss, um später nur Sie die öffentlichen Methoden in diesem DAO Refactoring müssen nicht alle Klassen, die diese DAO verwenden.

Andere Tipps

Ich glaube nicht, es ist streng ein entweder oder Situation. Option a ist eine schöne nutzbare Schnittstelle für Ihre DAO freizulegen, so denke ich, dass halten sollte. Für mich Option b scheint wirklich wie die Implementierung spezifische Logik. Wenn also die BIG-Methode Ihre Zwecke paßt, würde ich sagen, es zu verwenden, um die tatsächliche Verarbeitungslogik auszuführen, während eine der Schnittstelle wie in Option ausgesetzt wird.

Das heißt, wenn die BIG Verfahren zu gewunden wird und kompliziert und die Wiederverwendung von Code ist der Code Komplexität tatsächlich erhöht und Anwendung Wartbarkeit abnehmend dann könnten Sie separate SQL-Anweisungen für jede Interface-Methode zu halten Refactoring wollen, aber haben die Helfer-Methode ausführen die gemeinsame Logik der die Ergebnisse Parsen.

Die groß Methode in Option B ist fast garantiert die Wiederverwendung von Code zu verringern und die Komplexität und Wartungszeit zu erhöhen.

Persönlich (und nach Code Complete) Methoden sollte eine Sache tun und versuchen, es gut und nicht alles in stopfen. Vermeiden Sie in Zukunft Refactoring mit und tut Smart es das erste Mal.

Programmierung Grundlagen: Es ist eine gute Übung Ihre Codes in Abschnitte oder Funktionen zu brechen

.

Ich werde für die Option gehen (a); Sie müssen den Code zu erhalten und zu debuggen. Und wenn Sie einen Fehler machen, werden Sie sehr glücklich sein, dass Sie Ihren Code in verschiedene Methoden aufgespalten haben werden.

Darüber hinaus den Methodennamen Schreiben hilft Ihnen, zu verstehen, was Sie tun.

vergleichen diese:

Option (a)

$obj->AddNewList( /* params */ );
$obj->UpdateList( /* params */ );

und folgt aus:

Option (b)

$obj->parse( /* first set of params */ );
$obj->parse( /* second set of params */ );

Es spart Zeit als Menschen von links nach rechts gelesen. Deshalb Funktion und Methodennamen sind immer auf der linken Seite.

Wenn eine Leistung kein großes Problem ist, oder die Gruppen ändern ausreichend langsam Query-Caching zu aktivieren, nützlich sein Sie Filterfunktionen schreiben könnte und übergeben die in. Wenn Sie durch Gruppen sind Looping und eine optionale Anordnung von Filtern Methoden, um Ihre Schleife würde:

for(group in group) {
    cont = true
    for(f in functions) {
        if ! f(group) {cont = false; continue;}
    }
    if(cont) Continue
    add group to list
}

Auf diese Weise könnten Sie die Filter params zu ändern, ohne die Schleife zu verändern, nur zu schreiben oder eine Funktion zu verändern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top