C++ Software Architektur



  • Schönen Morgen euch,

    ich arbeite schon eine ganze Weile mit C#. Nun möchte ich mich wieder ein bisschen mit C++ beschäftigen. In C# verwendete Architekturen und Patterns kann ich sicherlich nicht 1 zu 1 in C++ übernehmen. Bestes Beispiel wäre DI, da C++ ab Werk keine Reflection-Api hat, kann man nur über Umwege DI benutzen, bzw. heißt das ganze unter C++ nicht DI, so jedenfalls habe ich es gelesen.
    Mir ist zwar klar, dass sich eine Software-Architektur meist nicht Sprachabhängig ist, jedoch die implementation wird sich sicherlich unterscheiden.
    Nehmen wir an, ich möchte auf eine Multi-Tier-Architektur bauen, darunter zählen: UI/Service/Server, Business, DataAccess, CrossCutting. In C# würde ich dafür jeweils eigenes Assemblys anlegen und via DI darauf verweißen (auf die einzelnen Klassen in dieser), doch wie wird sowas in C++ implementiert. Ich stelle es mir relativ Umständlich vor, dafür extra eigene DLL's zu erstellen, ich würde das ganze eher virtuell machen, sprich Klassen mit Ordnern abstrahieren. Jedoch verfällt dann der eigentliche Sinn der Architektur, meiner Meinung nach.
    Hat jemand zu diesem Thema ein bisschen Lesestoff, oder ein Paar Tipps?

    Grüße Marcel



  • repac3r schrieb:

    Jedoch verfällt dann der eigentliche Sinn der Architektur, meiner Meinung nach.

    eigentlich erstellt man erst die anforderungen und dann findet man die passende architectur dafuer. Es ist menschlich bewehrtes immer wieder zu verwenden, aber wie du siehst, fragst du dich dann wie du dasselbe in c++ machen kannst wie in c#.

    vielleicht waere es dacher besser von nicht hinten anzufangen ala "Ich benutze xyz um meine anforderungen zu befriedigen" sondern erstmal aufzulisten was genau du erreichen willst.

    wir koennen dir sicherlich tipps geben DI in c++ zu emulieren etc. aber das heisst nicht, dass das der loesungsweg waere fuer deine anforderung.



  • Okay, natürlich du hast recht.
    Es geht um einen TCP-basierenden Server. Dieser Server soll in der Lage sein, mehrere Anfragen von Clients zu verwalten. Der Client hat die möglichkeit entweder Text, oder Datei(en) dem Server zu übergeben. Diese werden dann je nach dem auf dem FileSystem oder in einer MySql-Datenbank hinterlegt. In dieser stehen selbstverständlich noch weitere Daten, auf diese der Client gerne zugreifen möchte. Der Client selbst hat sich auf den Server einzuloggen, dies geschicht über einen exterenen Dienst. Die Verbindung sowie der Server wird mithilfe von SSL verschlüsselt und authentifiziert. Dateien und Text werden optional via Rijandel verschlüsselt, dies erledigt aber der Client. Das ganze soll eine Applikation darstellen, mit dieser man seinen Zwischenspeicher verschiedener Geräte synchronisieren kann. Client sowie Server wurden schon vollständig in C# implementiert. Nun möchte ich gerne den Server in C++ neu implementieren. Dies hat eigentlich nur den Grund, da ich gerne wissen möchte, wie soetwas in C++ aussieht, bzw. mich wieder mit C++ beschäftigen. Ich habe ein solides Verständnis von C++ und der Verwendung von QT, müsste zwar einige Dinge erneut nachschlagen, doch den grundlegenden Teil, denke ich, könnte ich sicher implementieren.

    Grüße Marcel



  • hmm, tcp file/db-server mit ssl der andere services kommuniziert. hmm, das klingt nicht so aufwendig wenn man nicht gerade ssl selbst implementieren moechte.

    moechtest du jetzt vorschlaege welche libs du nutzen solltest? oder wie du das moeglichst sicher aufbaust? oder welche services du nutzen koenntest? oder wie du das moeglichst gut multithreadest? oder?



  • Nein. Ich möchte eher wissen wie solch eine Architektur in C++ aussieht. In C# habe ich das ganze mittels der Multi-Tier-Architektur gemacht, sprich Assemblys für: Server, Business, DataAccess und CrossCutting angelegt. Nun möchte ich wissen wie man sowas in der C++-Welt macht. Dort gibt es bestimmt auch Software-Architekturen, insbesondere die N-Tier, bzw. Layer-Architekur. Um es ein bisschen verständlicher zu sagen: Klar könnte ein viele viele Klassen in mehrere Ordner verteilen, doch ist das richtig?

    Grüße Marcel



  • Hört sich wie dummes Zeug an. Man programmiert es einfach. Fertig. Da braucht man keine "Architektur".

    Achte darauf, dass möglichst viele der Komponenten in Isolation testbar sind. Gruppiere Komponenten, die eng zusammengehören, in statische Bibliotheken. Der Rest ergibt sich.



  • Ack. Vermutlich wird das alles in C++ recht ähnlich gemacht, nur kann man sich hier das Overengineering sparen, sofern hinter diesen Microsoft-Buzz-Words mehr als heiße Luft stecken sollte.
    Du bekommst keinen Vorteil, das ganze noch mal in C++ zu machen, es sei denn, du willst es mal auf andere Systeme als Windows portieren. Ansonsten benutzt du eben nicht .NET, sondern irgendwelche nativen APIs, i.e. WinAPI/WinSock, COM oder Libraries wie MFC, Boost etc.



  • Mir ist durchaus bewusst, dass mir das ganze keine Vorteile bringt. Hätte ich das Ziel gehabt, den bisherigen Server auf andere System zum laufen zu bringen, hätte ich Mono benutzt. Mono ist stellenweise sogar effektiver als .Net selbst. Mir geht es alleine darum C++ wieder zu entdecken.
    Ich bin jetzt ziemlich irritiert, dass man in C++ sowas wie Architekturen nicht benutzt.

    Evtl. drücke ich mich auch einfach total dämlich aus, um konkrete Beispiele zu nennen, ich meine sowas wie (MVC, MVVM, 3-Tier, bzw. 3-Layer-Architektur), dass sind doch sicherlich Begriffe die auch in C++ auftauchen?

    Grüße Marcel



  • Jein. Nicht unbedingt in der Form und nicht so, wie du dir das wahrscheinlich vorstellst. Im Java und .NET Umfeld ist es sehr Buzz Word behaftet.
    Natürlich benutzt man auch in C++ MVC, Schichtentrennung usw. Das ergibt sich aber mehr oder weniger automatisch, indem man sinnvolle Komponenten definiert und eben Schichtentrennung macht. Du brauchst aber nichts besonderes, um die Schichten zu trennen. Schreib einfach sinnvolle Klassen und Komponenten.



  • Mechanics schrieb:

    Das ergibt sich aber mehr oder weniger automatisch, indem man sinnvolle Komponenten definiert und eben Schichtentrennung macht. Du brauchst aber nichts besonderes, um die Schichten zu trennen. Schreib einfach sinnvolle Klassen und Komponenten.

    Ja.
    Man muss nur dran denken beim Softwaredesign.
    Denn "von selbst" ergibt es sich nicht. Also nur wenn man "von selbst" speziell auch darauf achtet. Was aber viele nicht tun.

    @repac3r
    Schichtent sind ne feine Sache.
    In den einzelnen Schichten nochmal klar definierte Module/Komponenten/Services rausfactoren ist auch gut.
    Auf Abhängigkeiten zwischen diesen Modulen achten usw.

    Das sind alles Sachen die ich unter "Software-Design" einreihen würde, aber die du vermutlich mit dem Begriff Architektur verbindest. Zumindest wenn ich dein Beispiel mit .NET und der Aufteilung in mehrere Assemblies richtig verstanden habe.

    Wie du diese Trennung dann forcierst, also verhinderst dass "unerlaubte" Dependencies entstehen, ist im Prinzip wurst.
    Du kannst z.B. statische LIBs nehmen wie schon vorgeschlagen wurde oder DLLs.
    Das einzige was ich nicht empfehlen würde wäre "einfach aufpassen". Weil das nicht funkioniert 😉



  • Okay, danke für eure Hilfe.
    Dann habe ich wohl das Wort Architektur mit Design verwechselt, gut zu wissen.

    Grüße Marcel



  • repac3r schrieb:

    Nein. Ich möchte eher wissen wie solch eine Architektur in C++ aussieht. In C# habe ich das ganze mittels der Multi-Tier-Architektur gemacht, sprich Assemblys für: Server, Business, DataAccess und CrossCutting angelegt.

    Assemblys, dlls, libs oder sogar seperate hardware instanzen sind fuer das design der software in schichten nicht wirklich relevant. du kannst auch software schreiben die auf ein paar dlls verteilt ist und trotzdem ein einziger mess ist.

    Nun möchte ich wissen wie man sowas in der C++-Welt macht. Dort gibt es bestimmt auch Software-Architekturen, insbesondere die N-Tier, bzw. Layer-Architekur. Um es ein bisschen verständlicher zu sagen: Klar könnte ein viele viele Klassen in mehrere Ordner verteilen, doch ist das richtig?

    entsprechend kannst du der einfachheit halber ein projekt anlegen und darin all deinen source code unterbringen und immer nur ein binary bauen. das wird die software architektur nicht veraendern, nur den build bzw linkage.

    das gilt nicht nur fuer die c++ welt. 😉



  • repac3r schrieb:

    Schönen Morgen euch,

    ich arbeite schon eine ganze Weile mit C#. Nun möchte ich mich wieder ein bisschen mit C++ beschäftigen. In C# verwendete Architekturen und Patterns kann ich sicherlich nicht 1 zu 1 in C++ übernehmen. Bestes Beispiel wäre DI, da C++ ab Werk keine Reflection-Api hat, kann man nur über Umwege DI benutzen, bzw. heißt das ganze unter C++ nicht DI, so jedenfalls habe ich es gelesen.
    Mir ist zwar klar, dass sich eine Software-Architektur meist nicht Sprachabhängig ist, jedoch die implementation wird sich sicherlich unterscheiden.
    Nehmen wir an, ich möchte auf eine Multi-Tier-Architektur bauen, darunter zählen: UI/Service/Server, Business, DataAccess, CrossCutting. In C# würde ich dafür jeweils eigenes Assemblys anlegen und via DI darauf verweißen (auf die einzelnen Klassen in dieser), doch wie wird sowas in C++ implementiert. Ich stelle es mir relativ Umständlich vor, dafür extra eigene DLL's zu erstellen, ich würde das ganze eher virtuell machen, sprich Klassen mit Ordnern abstrahieren. Jedoch verfällt dann der eigentliche Sinn der Architektur, meiner Meinung nach.
    Hat jemand zu diesem Thema ein bisschen Lesestoff, oder ein Paar Tipps?

    Grüße Marcel

    alles in ein Projekt, sinnvoll in Unterordner/Namespaces aufteilen und fertig. Man kann ja zwischen Basiskomponenten und projektspezifischer Logik unterscheiden, sodass man die Basiskomponenten bei verschiedenen Projekten verwenden kann.

    Habe schon öfters erlebt dass gewisse Leute eine tolle "Trennung der Komponenten" (sei es nun über DLL oder Netzwerkstack) machen wollten, was dann letztlich 10mal unübersichtlicher war als alles in ein Projekt reinpacken.



  • xxxxxxxxxxxxxx schrieb:

    Habe schon öfters erlebt dass gewisse Leute eine tolle "Trennung der Komponenten" (sei es nun über DLL oder Netzwerkstack) machen wollten, was dann letztlich 10mal unübersichtlicher war als alles in ein Projekt reinpacken.

    Häufiger ist aber wohl dass die Entwickler meinen "Trennung" sei was für Pussies und dann im Endeffekt ein riesen Wollknäul aus dem Projekt wird.
    Was irgendwie witzig ist, weil Pussies ja gerne mit Wollknäulen spielen.


Anmelden zum Antworten