2017-02-25 6 views
-1

Ich hörte von Funktionen, die mit Klassen, aber außerhalb der Klassen waren. Ich meine, diese sind nützlich für die Klassenimplementierung, weil sie sie benutzt, aber sie ist nicht im Klassenkörper, sie ist draußen, verloren im Nirgendwo. Also, ich frage mich, was ist der Sinn, eine freie Funktion zu schreiben, anstatt nur eine Memberfunktion zu schreiben?Was ist der Sinn von freien Funktionen?

Vielen Dank für Ihre Antworten.

+0

Was sollte sagen, "std :: malloc" sollte ein Mitglied in Ihrem imaginären besseren Paralleluniversum sein, und wie würde das den Softwareentwurf verbessern? –

Antwort

5

Freie Funktionen bieten eine weit bessere Entkopplung und Übersichtlichkeit der Schnittstellen. Wenn der Großteil Ihrer algorithmischen Logik durch freie Funktionen bereitgestellt wird, müssen Ihre Datenstrukturen klare Zwecke und geeignete Schnittstellen haben. Das Ergebnis ist ein Code, der die Kopplung minimiert, was einfacher zu verstehen ist, zu testen und davon abhängig zu sein.

Im Allgemeinen sollten Datenstrukturen so klein wie möglich und so groß wie nötig sein, um einen bestimmten Zweck zu erfüllen; Datenstrukturen sollten über Komposition kombiniert werden, und Logik sollte durch freie Funktionen bereitgestellt werden, die so weit wie möglich auf die öffentlichen Schnittstellen der Daten zugreifen.

Member-Funktionen können bequem sein, und natürlich ist es notwendig, einige Mitgliederfunktionen auf die oben genannte Schnittstelle zur Verfügung zu stellen, aber es ist ein rutschiger Abhang, und wenn falsch gemacht, Sie am Ende mit etwas wie std::string.

+0

Ich verstehe nicht den letzten Teil Ihrer Nachricht: o – FeelZoR

+2

@FeelZoR 'std :: string' ist die Zombie-Apokalypse in Bezug auf seine endgültige Schnittstelle und die Vermeidung von Staat Unordnung. –

+0

Bedeutet das, wir sollten es vermeiden und ein Char-Array bevorzugen? – FeelZoR

2

Wenn eine Funktion den Status nicht beibehalten muss, gibt es keinen Grund, sie zu einer Klasse zu machen. Betrachten

int add(int a, int b) { return a + b; } 

Die Funktion macht seinen Job fein auf seinem eigenen, es keine Notwendigkeit für ein Klasse-Objekt hat.

+0

Mmh, okay, danke, ich sehe ^^ – FeelZoR