Ist es eine gute Übung, den Konstruktor explizit zu machen?

7

Ist es beim Erstellen einer öffentlichen API empfehlenswert, den Konstruktor als explizit zu definieren?

%Vor%

Oder soll ich eine implizite Konvertierung zulassen, damit der Benutzer meine API mit weniger Eingaben aufrufen kann?

    
Cheok Yan Cheng 15.09.2010, 09:44
quelle

5 Antworten

9

Der Konstruktor sollte explizit sein, es sei denn, eine implizite Umwandlung macht semantisch Sinn (z. B. was bedeutet die Umwandlung eines int in ein A ?). Weniger Tippen sollte nicht das Kriterium sein, um diese Entscheidung zu leiten. Denken Sie an die Lesbarkeit (die das Hauptargument für das implizite Casting ist) und daran, wie gut Ihr Code zu verstehen ist. Eine implizite Besetzung, die nicht intuitiv ist, wird die Leser des Codes ihren Kopf kratzen lassen.

P.S .: Ich kann mir im Moment kein gutes Beispiel einfallen lassen, daher wird jede Hilfe geschätzt.

    
Björn Pollex 15.09.2010, 09:49
quelle
5

Ja, standardmäßig jeder Konstruktor, der mit einem Argument aufgerufen werden kann sollte explizit sein. Durch die Einhaltung dieser Regel werden kleine Fehler vermieden extrem schwer zu finden.

Natürlich gibt es Ausnahmen von dieser Regel:

  • Implizite Konvertierung könnte wünschenswert sein, wenn Ihre Klasse die Semantik eines Wrappers um den Typ eines Parameters.

  • Kopierkonstruktoren sollten nicht explizit sein (sonst verlieren Sie die Möglichkeit für Pass-by-Value-Aufrufe).

Ralph 15.09.2010 10:11
quelle
4

Das habe ich in einer Resonanz von "Daniel Krügler gefunden "

  

Wenn wir C ++ entwickelt hätten   Von heute an gibt es ein gutes   Zufall, dass alle Konstruktoren und   Konvertierungsfunktionen waren "explizit"   standardmäßig, aber ein Benutzer könnte die   "implizit". Leider kann die Zeit nicht sein   zurückgekehrt und wir müssen damit leben   der aktuelle Zustand. Das bedeutet, dass wir   Seien Sie vorsichtig in Bezug auf   implizite Konstruktoren (außer für die   Konstruktor kopieren / verschieben). Es ist sicherer   Regel, um Konstruktoren explizit zu machen,   wo eine Form der Konvertierung ist   beteiligt (d. h. jeder Konstruktor mit   eine Argumentart U, die sich von der unterscheidet   tatsächlicher Typ T).

    
Chubsdad 15.09.2010 10:05
quelle
1

Explizite Konstruktoren werden in Klassen verwendet, die signifikante Ressourcen wie Speicher, Konstruktionszeit usw. verbrauchen, um zu verhindern, dass Benutzer Instanzen solcher Klassen versehentlich erstellen. Es liegt an Ihnen zu entscheiden, ob Ihre Klasse "schwer" genug ist, um expliziten Konstruktor zu verwenden.

    
Alex F 15.09.2010 09:50
quelle
1

Es hängt von den Kosten ab, sowohl semantisch als auch performant. Wenn die Erstellung Ihrer Klasse teuer ist, sollten Sie verhindern, dass sie versehentlich instanziiert wird. Wenn es eine billige Klasse zu erstellen ist, kann die implizite Konstruktion die Arbeit für den API-Benutzer erheblich vereinfachen.

    
Puppy 15.09.2010 09:51
quelle

Tags und Links