c ++ Wrapping-Typen für semantische

8

Es ist eine lange Zeit seit meiner letzten Verwendung von C ++, von Java und Python zurückkommen, habe ich eine Frage über gute Praktiken auf C ++:

Ich wollte einen semantischen Code über einige wirklich einfache Objekte behalten, sagen wir, wir haben Objekte Tag und File, die beide nur std :: string sind und eine Klasse TagManager, die verschiedene Funktionen mit Tags und Dateien enthält.

Meine Frage ist, ist es besser, einen benutzerdefinierten Typ zu erstellen, der diese trivialen Objekte darstellt oder sie direkt für das zu verwenden, was sie sind?

Um genauer zu sein, könnte ich eine dieser Definitionen für eine Funktion haben:

%Vor%

Ich bevorzuge die erste Lösung, weil ich gerne einen semantischen Code aufbewahre, andererseits muss der Benutzer überprüfen, was diese Typen sind, und so die Einfachheit der Verwendung reduzieren.

Ich lese auch auf eine andere Frage ( Du sollst nicht von std :: vector ) 'Produziere keine neuen Entitäten, nur um etwas besser aussehen zu lassen.'

Was machst du in einer solchen Situation? Was empfiehlt die C ++ - Philosophie?

    
Antoine 24.11.2013, 11:56
quelle

5 Antworten

5

Normalerweise verwende ich typedef s in solchen Fällen:

  • Auch wenn typedef s keine neuen Typen oder unangenehmen Ableitungen von std::vector<> selbst einführen, können die Aliase dennoch für die Benutzer, die Ihren Code verwenden, möglicherweise lästige Abwege sein.
  • Andererseits könnten sie gut dargestellt und dokumentiert werden (ein Beispiel geben), so dass jeder sie von Anfang an benutzt.
  • Sie helfen, Leistungsunterbrecher zu vermeiden, falls der Typ geändert werden muss (vorausgesetzt, dass spezielle std::string -Features in Ihrem speziellen Fall nicht verwendet werden oder in dem Ersatz bereitgestellt werden).
  • Also, falls erforderlich, könnte ein typedef später geändert werden, um eine neue Klasse mit zusätzlichen Eigenschaften und Funktionen zu aliasieren oder nur für den Typ Sicherheit.
  • Sie ermöglichen die einfache Verfolgung von Verwendungsstellen sowie Refactoring in den meisten IDEs.
%Vor%     
Sam 24.11.2013, 12:11
quelle
2

Es nennt sich encapsulation (auch bekannt als Data Hiding). Wenn man das Konzept von File und a Tag verkapselt, fügt man Wert hinzu, dann mach weiter und tu es, sonst fügst du nur Komplexität hinzu. Es könnte sein, dass Sie später std::wstring anstelle eines einfachen std::string intern in den Klassen verwenden, was Sie leicht ändern können, wenn Sie die Klassen Tag und File und die Benutzer der Klassen am wahrscheinlichsten erstellen wird nicht beeinflusst.

Was das Erben von std :: vector anbelangt, ist das in der Tat etwas, das Sie vermeiden sollten. Aber denken Sie daran: Erben und Kapselung sind zwei völlig verschiedene Konzepte.

    
Brady 24.11.2013 12:04
quelle
1

Ich würde bevorzugen, was C ++ Ihnen zur Verfügung stellt, es sei denn wirklich ist notwendig, um einen Alias ​​zu machen. Warum benutzen Sie nicht einfach selbst sprechende Identifizierer? Meine Lösung würde wie folgt aussehen:

%Vor%     
xmoex 24.11.2013 12:20
quelle
1

Da ich der Typ Freak bin, schließe ich immer neue Typen ein.

Das Schreiben des Wrapper-Codes ist einfach:

%Vor%

Und das ist es!

typedef sind nett und alle, aber es ist zu einfach, sie zu mischen und Operationen zu verwenden, die keinen Sinn ergeben: Was bedeutet Tag::substr ?

    
Matthieu M. 24.11.2013 13:41
quelle
0

Es gibt einige gültige Anwendungsfälle für (einfache) Wrapping-Typen:

  • Arten unterscheiden sich. Zum Beispiel eine Kennung, die für einen bestimmten Kontext eindeutig ist.
  • Geben Sie einem Typ eine Einheit (US Gallone 3,79 vs. Imperial Gallone 4,546) - zum Beispiel boost :: unit. Die Einheit ist eigentlich eine zusätzliche Information.
  • ...

Für jeden Umbruch würden Sie eine eigene Klasse (Vorlage) erstellen, um die Typsicherheit zu gewährleisten. Ein einfacher Typdef würde nichts einkapseln, sondern nur die Verwendung verdeutlichen.

    
Dieter Lücking 24.11.2013 12:51
quelle

Tags und Links