"Cross-Framework" (kp wie ich mein Problem abkürzen soll xD)

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

"Cross-Framework" (kp wie ich mein Problem abkürzen soll xD)

Beitrag von Glocke » Mi Jul 03, 2013 9:33 am

Hi, ich habe keine Ahnung, wie ich mein Problem richtig abkürzen soll :D

Zum eigentliche Problem: Ich habe ein kleines Server-Client-Framework gebaut, das aktuell auf SFML-Network basiert. Zukünftig möchte ich diese Dependency lösen und alternativ auch SDL_net und Boost::Asio unterstützen. Aktuell überlege ich, wie ich das realisiere. Mein bisheriger Ansatz wäre:

Ich verwende eine Art "settings.hpp", in der ich mittels Präprozessor definiere, welches Framework als Grundlage verwendet wird. Also der Art:

Code: Alles auswählen

#define SDL_NET

#ifdef SDL_NET
    #include <SDL/SDL_net.h>
#elif defined SFML_NETWORK
    #include <SFML/Network.hpp>
#elif defined BOOST_ASIO
    // boost-includes (hab die jetzt nicht genau im Kopf)
#endif
Die erste Zeile müsste dann entsprechend auf SFML_NETWORK oder so geändert werden, um SFML-Network zu verwenden etc. Der nächste Schritt wäre ein Wrapper für meine Sockets. Je nachdem ob SDL_NET, SFML_NETWORK oder BOOST_ASIO definiert wurde, würde ich dann die Socket-Implementierung durchführen, d.h.

Code: Alles auswählen

class BaseSocket {
    // Deklaration des gemeinsamen Interfaces
    // sicherheitshalber, um zu garantieren, dass
    // alle Socket-Varianten nach außen identisch sind.
};

#ifdef SDL_NET
class Socket: public BaseSocket {
    // Implementierung mittels SDL_NET
};
#elif defined SFML_NETWORK
class Socket: public BaseSocket {
    // Implementierung mittels SFML-Network
};
#elif defined BOOST_ASIO
class Socket: public BaseSocket {
    // Implementierung mittels Boost::Asio
};
#endif
Die Verwendung des Präprozessors könnte ich ggf. auch "weiter reinschachteln", d.h. einmal bei der Deklaration des "eigentlichen Sockets" und dann jeweils pro Methode verwenden. Das ist dann ja nur noch eine Feinheit.

Anschließend kann ich (sofern eines der drei Symbole definiert wurde) meine class Socket wie eine Blackbox verwenden. Die Verwendung des gemeinsamen Interfaces könnte man auch weglassen - das war jetzt nur eine erste Idee (siehe Kommentar).

Was haltet ihr davon?
@Xin: Was "häl[t]st" du davon? :D

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: "Cross-Framework" (kp wie ich mein Problem abkürzen soll

Beitrag von Xin » Mi Jul 03, 2013 9:56 am

Glocke hat geschrieben:Hi, ich habe keine Ahnung, wie ich mein Problem richtig abkürzen soll :D
Portablität wäre das Stichwort, würde ich sagen.

Ich würde ein Define rauslegen FRAMEWORK_MODUS. Du kannst die Variable per Compileraufruf setzen. Wenn sie nicht definiert wurde, setzt Du sie auf ein Default-Framework.
Anschließend fragst Du im Code ab, welches Framework Du verwenden willst und setzt anhand dieser Variable die Includes bzw. machst drei Implementationen, von der je nach Variable nur eine den passenden Quelltext für Deine Socket-Class enthält. Der Header der Klasse ist aber für alle gleich, lediglich die Implementierung unterscheidet sich.
Glocke hat geschrieben:Anschließend kann ich (sofern eines der drei Symbole definiert wurde) meine class Socket wie eine Blackbox verwenden. Die Verwendung des gemeinsamen Interfaces könnte man auch weglassen - das war jetzt nur eine erste Idee (siehe Kommentar).
Wenn Du das gemeinsame Interface weglässt, gibt es keine Portablität mehr.
Glocke hat geschrieben:Was haltet ihr davon?
Warum programmierst Du dreimal das gleiche? Als Übung, dann sehr gut.
Für eine Produktivanwendung reicht eins.
Glocke hat geschrieben:@Xin: Was "häl[t]st" du davon? :D
Du lernst auf jedenfall dazu :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: "Cross-Framework" (kp wie ich mein Problem abkürzen soll

Beitrag von Glocke » Mi Jul 03, 2013 10:52 am

Xin hat geschrieben:Ich würde ein Define rauslegen FRAMEWORK_MODUS. Du kannst die Variable per Compileraufruf setzen. Wenn sie nicht definiert wurde, setzt Du sie auf ein Default-Framework.
Anschließend fragst Du im Code ab, welches Framework Du verwenden willst und setzt anhand dieser Variable die Includes bzw. machst drei Implementationen, von der je nach Variable nur eine den passenden Quelltext für Deine Socket-Class enthält. Der Header der Klasse ist aber für alle gleich, lediglich die Implementierung unterscheidet sich.
Die Idee klingt super :)
Xin hat geschrieben:Warum programmierst Du dreimal das gleiche? Als Übung, dann sehr gut.
Für eine Produktivanwendung reicht eins.
Ich habe das Netzwerk-Framework auf GitHub hochgeladen und möchte möglichen interessierten Leuten nicht die Hände zusammenbinden und zu SFML zwingen :) Wobei dann wahrscheinlich die Boost::Asio-Lösung am elegantesten wäre, oder?

LG Glocke

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: "Cross-Framework" (kp wie ich mein Problem abkürzen soll

Beitrag von Xin » Mi Jul 03, 2013 11:00 am

Glocke hat geschrieben:
Xin hat geschrieben:Warum programmierst Du dreimal das gleiche? Als Übung, dann sehr gut.
Für eine Produktivanwendung reicht eins.
Ich habe das Netzwerk-Framework auf GitHub hochgeladen und möchte möglichen interessierten Leuten nicht die Hände zusammenbinden und zu SFML zwingen :) Wobei dann wahrscheinlich die Boost::Asio-Lösung am elegantesten wäre, oder?
Ich vermute, dass Boost zukünftigen C++-Standards am nächsten liegt...
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten