Normalerweise hatte ich implicit
Konvertierungen in einem Objekt, das deutlich signalisiert, dass das, was es importiert wird, eine implicit
Umwandlung ist. Wenn ich beispielsweise eine Klasse com.foo.bar.FilthyRichString
habe, würden die impliziten Konvertierungen in com.foo.bar.implicit.FilthyRichStringImplicit
gehen. Ich weiß, dass die Namen ein bisschen lang sind, aber deshalb haben wir IDEs (und die Scala-IDE-Unterstützung wird immer besser). So wie ich das tue ist es wichtig, dass alle impliziten Konvertierungen klar in einer 10 second code review angesehen werden können. Ich konnte auf den folgenden Code aussehen:
// other imports
import com.foo.bar.FilthyRichString
import com.foo.bar.util.Logger
import com.foo.bar.util.FileIO
import com.foo.bar.implicits.FilthyRichStringImplicit._
import com.foo.bar.implicits.MyListImplicit._
// other implicits
und auf einen Blick alle impliziten Konvertierungen sehen, die in dieser Quelldatei aktiv sind. Sie würden auch alle zusammen gesammelt, wenn Sie die Konvention verwenden, dass Importe nach Paketen gruppiert sind, mit einer neuen Linie zwischen verschiedenen Paketen.
Entlang den Zeilen des gleichen Arguments möchte ich kein Catch-All-Objekt, das alle impliziten Konvertierungen enthält. Würden Sie in einem großen Projekt wirklich alle der impliziten Konvertierungen in allen Ihren Quelldateien verwenden? Ich denke, dass dies eine sehr enge Kopplung zwischen verschiedenen Teilen Ihres Codes bedeutet.
Auch ein Catch-All-Objekt ist nicht sehr gut für die Dokumentation. Wenn Sie explizit alle impliziten Konvertierungen schreiben, die in einer Datei verwendet werden, können Sie einfach Ihre Importanweisungen ansehen und sofort zur Dokumentation der impliziten Klasse springen. Im Falle eines Catch-All-Objekts müsste man das Objekt betrachten (was in einem großen Projekt sehr groß sein kann) und dann nach der impliziten Konvertierung suchen, nach der es suchen soll.
Ich stimme oxbow_lakes zu, dass die implizite Umwandlung in trait
s ist schlecht wegen der Versuchung, davon zu erben, was, wie er sagte, schlechte Praxis ist. In diesem Sinne würde ich die Objekte, die die impliziten Konvertierungen enthalten, einfach so machen, dass die Versuchung gänzlich vermieden wird. Seine Idee, sie möglichst nahe an den Einsatz zu bringen, ist ebenfalls sehr hilfreich, wenn implizite Konvertierungen nur wenig im Code verwendet werden.
-- Flaviu Cipcigan
Was ist daran implizit? –
Ich nehme an, dass alle Definitionen in ihm implizit sein sollten? –
Jetzt repariert, danke! –