Eine Designfrage - Funktion oder Funktor



  • Hallo Forum,

    Ich möchte eine Gruppe von Algorithmen zur Turnierauslosung schreiben. Die Signatur aller dieser Algorithmen ist absolut identisch; das habe ich mir so gedacht, damit ich später per std::tr1::function darauf zugreifen kann, ohne tatsächlich zu wissen, welcher Algorithmus nun gerade verwendet wird. Wenn ich später einmal eine GUI dazu schreibe (was ich schon fest vorhabe), dann wäre es für den User aber dennoch wissenswert, welcher Algorithmus gerade verwendet wird, und was er für Eigenschaften hat.

    Wie würdet ihr eine Gruppe von Algorithmen realisieren, die a) alle die selbe Signatur haben und die b) Informationen über sich selbst bereitstellen sollen?
    Meine Denkansätze sind die hier:

    • Funktoren, die neben dem op() weitere Methoden wie getName() usw. haben
    • Funktionen (wobei ich hier noch keine Idee habe, wie ich denen Informationen über sich mit auf den Weg geben soll)

    Was sagt ihr dazu? Ist der Weg über die Funktoren der "bessere"?



  • daersc schrieb:

    Hallo Forum,

    Ich möchte eine Gruppe von Algorithmen zur Turnierauslosung schreiben. Die Signatur aller dieser Algorithmen ist absolut identisch; das habe ich mir so gedacht, damit ich später per std::tr1::function darauf zugreifen kann, ohne tatsächlich zu wissen, welcher Algorithmus nun gerade verwendet wird. Wenn ich später einmal eine GUI dazu schreibe (was ich schon fest vorhabe), dann wäre es für den User aber dennoch wissenswert, welcher Algorithmus gerade verwendet wird, und was er für Eigenschaften hat.

    Wie würdet ihr eine Gruppe von Algorithmen realisieren, die a) alle die selbe Signatur haben und die b) Informationen über sich selbst bereitstellen sollen?
    Meine Denkansätze sind die hier:

    • Funktoren, die neben dem op() weitere Methoden wie getName() usw. haben
    • Funktionen (wobei ich hier noch keine Idee habe, wie ich denen Informationen über sich mit auf den Weg geben soll)

    Was sagt ihr dazu? Ist der Weg über die Funktoren der "bessere"?

    Klingt nach dem Strategy Pattern.

    class IAlgo
    {
     public:
      virtual void doAlgo() = 0;
      std::string getName() const = 0;
    };
    
    class IAlgoOne : public IAlgo
    {
     public:
      virtual void doAlgo()
      {
       // Do Algorithmus
      }
    
      std::string getName() const { return "IAlgoOne"; }
    };
    
    class IAlgoTwo : public IAlgo
    {
     public:
      virtual void doAlgo()
      {
       // Do Algorithmus
      }
    
      std::string getName() const { return "IAlgoTwo"; }
    };
    


  • hjkhjk schrieb:

    Klingt nach dem Strategy Pattern.

    Danke! Habs gerade gegoogelt und bin wieder einmal hier im Magazin gelandet 😃
    Ich sollt die ganzen Artikel wirklich mal lesen, dann kommen solche Fragen gar nicht erst auf...


Anmelden zum Antworten