2010-12-31 7 views
0

Ich erstelle einen URL-Router für ein Web-Framework. Versuchen, so benutzerfreundlich wie möglich zu machen. Die API sieht ungefähr so ​​aus:Url-Router API Design-Frage

Route[] Routes = { 
    new Route(@"/user:(?<id>\d+)", "UserController.View") 
}; 

Wo es würde Route jede URL, die dieses regex dieser Methode übereinstimmt, die wie folgt aussehen könnte:

public class UserController : Controller 
{ 
    public void View(int id) 
    { 
     // code here 
    } 
} 

Es behandelt die Art Guss automatisch.

Es gibt eine Korrelation zwischen (?<id>...) und den Argumenten, die die Methode verwendet. Die View() Funktion muss alle Argumente akzeptieren, die von den Namenserfassungen bereitgestellt werden. Es kann jedoch weitere Argumente akzeptieren, solange sie optional sind. Zum Beispiel würde diese Regex auch die Funktion View(int id, int extraArg=2) entsprechen, da wir die extraArg nicht wirklich brauchen, um die Funktion aufzurufen.

Die Frage ist, ob diese Route auch die Funktion View() - ohne Argumente? Die id Aufnahme kann leicht verworfen werden und wir können die Funktion immer noch gut nennen. Oder sollte es eine Ausnahme (wie es derzeit tut) werfen?

Antwort

1

Nehmen Sie den besten Programmieransatz: Sie möchten nicht, dass der Benutzer irgendwelche Fehler findet. Da der Benutzer in jeder Phase versehentlich/absichtlich zusätzliche Parameter eingeben kann, nehme ich einfach die notwendigen Parameter und ignoriere den Rest.

+0

Sind wir sicher, dass der Benutzer keine Fehler sehen soll? Ist es nicht ein Fehler, mehr Argumente in das Muster einzufügen, als tatsächlich akzeptiert werden? Ja, Fehler sind unangenehm, aber es könnte ihm auch zukünftige Kopfschmerzen ersparen, die versuchen zu jagen ... nun, eigentlich wäre es ziemlich einfach zu sehen, welche Variablen fehlen, aber es eröffnet ein weiteres Problem. Wenn wir loses Matching wie dieses zulassen, würde es * sowohl * View() 'als auch' View (int id) 'entsprechen, was eine gültige Überladung ist. Was sollte es dann wählen? – mpen

+0

Interessantes Problem, aber ich bezog mich auf den Endbenutzer, als ich das sagte. Vielleicht etwas mehr CodeIgniter Stil versuchen: Die Controller-Methode akzeptiert eine Klasse, die Informationen über den Aufruf der Seite enthält, einschließlich der bereitgestellten Variablen, und lassen Sie den Controller, um sich selbst zu sortieren. –

Verwandte Themen