2016-03-31 8 views
2

Ich habe ein starkes Gefühl gegen Methoden mehrere Ergebnisse für die weitere Mehrfachbelegung der Rückkehr, wie folgt aus:Gibt mehrere Ergebnisse ein Antipattern zurück?

class ImportUsersFromFile 
    def perform 
    ... 
    [imported_rows, errors] 
    end 
end 

, da es eine dunkle und inobvious Datenstruktur „ein Array einführt, erstes Element von denen diese Sache ist und das zweite ist das andere Ding ". Es wäre in Ordnung, wenn es offensichtlich wäre, dass die Methode eine solche Struktur zurückgeben sollte. Zum Beispiel ist es in Ordnung, drei Werte first_name, middle_name, last_name von einer Methode wie Person#name_parts zu erwarten.

Aber ich kann meine Meinung mit nichts außer meinen Wörtern unterstützen. Wird ein Mehrfachergebnis als ein Anti-Pattern- oder Code-Geruch angesehen? Würde gerne einige Links haben.

+0

Ihr Code gibt ein Array zurück, das mit der Destrukturierungsfunktion von Ruby mehrere Werte eingeben kann. Was ist falsch an einem Array? BTW: Warum nicht Fehler erhöhen, anstatt sie in die Rückgabewerte zu setzen? – sschmeck

+0

Ich erklärte in diesem Fall, was mit der Destrukturierung des Arrays falsch ist: die Schnittstelle ist nicht klar. Eine Sache ist zu erwarten, dass "perform" die Liste der importierten Benutzer zurückgibt, und andere Sache ist zu wissen, dass es wirklich ein Array von zwei Listen zurückgibt. In meinem Fall werden Fehler nicht ausgelöst, da sie nicht außergewöhnlich sind - wenn in einigen Zeilen Fehler auftreten, sollten trotzdem andere Zeilen importiert werden. – Hnatt

+0

Dann gibt Ihre Methodenschnittstelle zwei Buckets zurück, einen mit den guten Zeilen und einen mit dem schlechten. Es klingt vernünftig für mich, aber nicht wie ein Antipattern. Wenn die Fehlerfälle keine Rolle spielen, dann ignoriere sie explizit wie 'users, _ = importer.perform'. – sschmeck

Antwort

1

Für was es wert ist, bin ich nicht sicher, dass ich dies ein Antipattern nennen würde. Ich Ihren Punkt nehmen, aber die Tatsache, dass Ruby speziell seinen Dolmetscher beschäftigen sich mit der sehr Problem hat man darüber reden:

def foo 
    [1,2] 
end 

a = foo # -> a = [1,2] 
a,b = foo # -> a = 1, b = 2 
_,b = foo # -> b = 2 

So so weit es mich betrifft, dass die Methode/Funktion kehrt zu kennen zwei Werte ist nicht schlechter als zu wissen, dass Sie es zwei Werte übergeben.

Nachdem das gesagt wurde: wenn es Sie unzerstörbar macht, sollten Sie es auf jeden Fall vermeiden, es selbst zu tun. Daran ist nichts falsch.

+0

Mein Problem kann nicht mit 'foo's und' bar's dargestellt werden. Es geht mehr um Semantik. Wie gesagt, ich finde eine Methode 'Person # name_parts', die ein Array von drei Werten zurückgibt, deren Reihenfolge aus dem Namen hervorgeht, aber nicht so sehr eine imperative Methode, die einige Batch-Aktionen ausführt und die Anzahl der Erfolge und zurückgibt Fehler. Eingehende Parameter (ihre Namen und Reihenfolge) können in der Signatur der Methode gesehen werden. Um die Reihenfolge der zurückgegebenen Werte zu kennen, muss der Code der Methode gelesen werden. Das ist keine bequeme Schnittstelle für mich. – Hnatt

+0

@Hnatt In Ruby Ihre Schnittstelle ist idiomatisch, denke ich. Wenn es sich für Sie oder die Benutzer Ihres Codes falsch anfühlt, dann können Sie es ändern. Alternativen sind benutzerdefinierte _Value-Objekte_ oder benannte Werte, die von einem Ruby 'Hash' implementiert werden. – sschmeck

+0

@Hnatt, vergib mir. Aber wenn Ihr Problem nicht mit generischen, Beispielcode ("foos and bars") dargestellt werden kann und es ein Problem der Semantik ist, dann bin ich persönlich unsicher, ob es überhaupt ein Programmierproblem ist. Ist es nicht idiomatisch, dass semantische Programmierprobleme mit Beispielcode illustriert werden können? Nochmal: Wie muss die Reihenfolge der zurückgegebenen Werte anders sein als die Reihenfolge der Eingabeparameter? –

Verwandte Themen