2010-04-29 7 views
6

Angenommen ich eine Klasse a haben:C++ OOP: Welche Funktionen in die Klasse zu legen?

class a 
{ 
public: 
    void load_data(); 
private: 
    void check_data(); 
    void work_data(); 
    void analyze_data(); 
} 

Diese Funktionen alle etwas tun, mit der Klasse oder eines seiner Mitglieder.

jedoch diese Funktion:

bool validate_something(myType myData) 
{ 
    if (myData.blah > 0 && myData.blah < 100) 
    { 
     return true; 
    } 
    return false; 
} 
  • wird der Klasse verwandt und wird nur durch sie aufgerufen werden, so dass es nirgendwo sonst

  • tut nichts benötigt mit der Klasse oder ihren Mitgliedern - nur eine kleine "Dienstprogramm" -Funktion

Wo zu setzen validate_something? Innerhalb oder außerhalb der Klasse?

+0

Sie können es zu einem statischen Mitglied machen – Tim

Antwort

4

Machen Sie es zu einem privaten statischen Klassenmitglied. Ich tendierte dazu, diese Nicht-Klassenmitglieder zu machen und sie in einen namenlosen Namensraum in der Implementierungsdatei zu legen, aber es scheint, dass sie fast immer Klassenmitglieder sein müssen (oder anderswo verschoben werden müssen - vielleicht zu einer Validierung) Bibliothek, in Ihrem Beispiel), so wie der Code sich ändert, so mache ich sie fast immer zu statischen Mitgliedern.

Bitte beachten Sie die Verwendung von „fast“ als Qualifier in dieser Antwort :-)

+1

Warum sollte eine Funktion * * ein statisches Mitglied sein, im Gegensatz zu einem namenlosen Namespace in der impl-Datei? Oder tun Sie das nur, um Arbeit zu sparen, wenn es um Zustandsdaten geht? –

+0

Und warum machen Sie sie "statische" Mitglieder und nicht einfach nur Mitgliedsfunktionen? –

+0

@John Es ist meine Erfahrung, dass Hilfsfunktionen in der Implementierungsdatei fast immer am Ende in die Klasse migriert werden müssen. Das ist reine Zweckmäßigkeit. –

0

Wenn diese Methode ein Dienstprogramm ist, das nur von der Klasse verwendet wird, würde ich es zu einer privaten Methode der Klasse machen. Auf diese Weise wird Ihre öffentliche API verkapselt und nicht "verschmutzt".

0

Unter der Annahme, dass myType ist auch eine Struktur/Klasse, warum Sie nicht ein Verfahren zum myType machen validate_something?

0

Wie ich verstehe, ist es keine Methode. Legen Sie die Definition einfach in die cpp-Datei, über die Definitionen der Methoden, die sie verwenden. Wenn Sie alle Ihre Methodendefinitionen in Ihre Klasse eingebunden haben, müssen Sie den Prototyp der Funktion in die Kopfzeile über der Klassendefinition einfügen, aber die Definition kann immer noch in einer cpp-Datei sein.

10

Wenn eine Funktion ist

  • nicht außerhalb der Klasse erforderlich ist, und,
  • braucht keine Klasse Member zuzugreifen (oder vielleicht Sinn macht als freie Funktion mit den Mitgliedern als Parameter)

dann tendiere ich dazu, es zu einer freien Funktion in einem privaten Namespace in der Implementierungsdatei zu machen. Ich bevorzuge es, keine privaten Funktionen zu verwenden, da sie Implementierungsdetails in der Header-Datei offen legen (und Neil's Problemen noch nicht begegnet sind), und ich bevorzuge es, Neukompilierungen für Implementierungsänderungen zu vermeiden.