Gehen die Verkettung von Methoden und Fehlerbehandlung

Ich möchte eine Methode erstellen, die die Verkettung API Gehen. In allen Beispielen, die ich finden kann die verkettete Vorgänge scheinen immer erfolgreich zu sein, das kann ich nicht garantieren. Deshalb will ich versuchen zu erweitern, zum hinzufügen von Fehler-Rückgabewert.

Wenn ich es so mache

package main

import "fmt"

type Chain struct {
}

func (v *Chain)funA() (*Chain, error ) {
    fmt.Println("A")
    return v, nil
}
func (v *Chain)funB() (*Chain, error) {
    fmt.Println("B")
    return v, nil
}
func (v *Chain)funC() (*Chain, error) {
    fmt.Println("C")
    return v, nil
}

func main() {
    fmt.Println("Hello, playground")
    c := Chain{}
    d, err := c.funA().funB().funC() //line 24
}

Der compiler sagt mir chain-err-test.go:24: multiple-value c.funA() in single-value context und nicht kompiliert wird. Ist es ein guter Weg, so funcA, funcB und funcC kann einen Fehler melden und zu stoppen, die Kette?

  • Sie können Panik, aber natürlich bedeutet dies, müssen Sie zum wiederherstellen auf jede Methode oder an der Wurzel. Sie können auch die Chain Objekt stateful mit einem Fehler, und überprüfen Sie es für jede Methode.
  • stimmt, aber ich Frage mich, ob es eine gute idiomatische Weise, dies zu tun. In meiner Welt Fehlerbedingungen sind überall, und an einigen Orten (z.B. Operatoren wie golangpatterns.info/object-oriented/operators ) eine solche Verkettung sollte eine gute API. (das erste Beispiel auf dieser Seite also ist das nicht eine gute API - entweder Sie haben Tonnen von Funktionen für alle Typen oder einen Schalter, wo falsche Typen sind nicht vom compiler erkannt)
  • Ich erinnere mich an eine schönere API mit Funktionen zurückgeben Funktionen, wie in dave.cheney.net/2014/10/17/functional-options-for-friendly-apis (nach commandcenter.blogspot.com.au/2014/01/...). Ist es nicht genau das "chaining", obwohl.
  • Ich Tat etwas ähnlich, aber verwendet Kanälen-chain-output-streams und eine Fehlermeldung schließt sich einfach der Kanal, Abwicklung des gesamten Kette. Es ist wahrscheinlich nicht das, was Sie brauchen obwohl.
  • Ich weiß, das ist nicht die Antwort, die du suchst, aber die idiomatische Sache ist zu vermeiden Verkettung. Es ist nichts falsch mit Verkettung, aber es ist eine Konsequenz aus dem Vokabular der Verwendung einer error-Werte anstelle von exceptions.
  • auch wenn es keinen guten Weg, dann ist Ihre Antwort unten könnte gut sein, meine Hoffnung war, dass habe ich übersehen, eine Sache noch Recht unerfahren in Gehen.
  • Ich denke, das ist, was Sie finden. Gehen an Orte, Sprache Einfachheit sehr hoch, und "klug" workarounds zu verhängen, um andere Idiome sind oft schwierig, auch wenn das Ergebnis weniger boilerplate (und das ist auch richtig so; idiomatische boilerplate ist noch viel mehr lesbar als "clever", nicht-idiomatische Lösung). Wieder, dies bedeutet nicht, dass die Verkettung von Methoden ist eine schlechte Praxis--es ist einfach nicht gut Gehen.

InformationsquelleAutor johannes | 2014-12-04
Schreibe einen Kommentar