Problem mit Software Architektur (C++)
-
std::swap
-
Nein, jetzt bitte nicht noch eine Diskussion ob und wann nun Zeiger oder Referenzen sinnvoller sind :p
-
Ishildur schrieb:
brigens: Wieso gibst du bei GetName das std::string Objekt als Zeiger zurück? Ist auch einer der Indikatoren, dass du anscheinend ziemlich viel mit new anlegst.
Nein ich will nur nicht, dass der string jedes Mal kopiert wird, wenn ich einen Namen abfrage
Schon mal davon gehört, dass man Referenzen auf konstante Objekte zurückgeben kann?
class MyObject { private: std::string m_name; public: std::string const& getName() { return m_name; } };
Und schon findet keine Kopie satt. Zudem verwenden gewisse Bibliotheken bei
std::string
COW (Copy-On-Write). Und nicht zuletzt, ist es recht fragwürdig, wie stark diese Kopie wirklich ins Gewicht der Performance fällt, da ich mal vermutet, dass du es deswegen nicht machen möchtest.Zudem, du gibst immer einen Zeiger auf ein nicht-konstantes Objekt zurück, wodurch man den Namen von Aussen verändern kann. Bye Bye Kapselung ...
Grüssli
PS: Ich ziehe mich vorerst zurück. Muss noch ein paar Schnittstellenspezifikationen erstellen, dieser Thread geht mir gerade ein wenig zu schnell vorwärts
-
@Dravere
Ja ich werde mich jetzt einmal umfassend mit dem Thema Mehrfachvererbung auseinandersetzten bevor ich nochmal ins Messer laufeVielen Dank an alle für die vielen Tips in diesem Thread!
-
Ishildur schrieb:
@Shade Of Mine
Hahaha, in den Java Foren jammern sie, mein Code sehe wie C/C++ Code aus :pHast du einen Link dazu? Würde mich einfach nur interessieren was Java Programmierer darunter verstehen.
-
Shade Of Mine schrieb:
Ishildur schrieb:
@Shade Of Mine
Hahaha, in den Java Foren jammern sie, mein Code sehe wie C/C++ Code aus :pHast du einen Link dazu? Würde mich einfach nur interessieren was Java Programmierer darunter verstehen.
http://www.ibm.com/developerworks/java/library/j-noaccent.html
-
SeppJ schrieb:
Shade Of Mine schrieb:
Ishildur schrieb:
@Shade Of Mine
Hahaha, in den Java Foren jammern sie, mein Code sehe wie C/C++ Code aus :pHast du einen Link dazu? Würde mich einfach nur interessieren was Java Programmierer darunter verstehen.
http://www.ibm.com/developerworks/java/library/j-noaccent.html
Das geht leider nur auf C ein...
-
Shade Of Mine schrieb:
SeppJ schrieb:
Shade Of Mine schrieb:
Ishildur schrieb:
@Shade Of Mine
Hahaha, in den Java Foren jammern sie, mein Code sehe wie C/C++ Code aus :pHast du einen Link dazu? Würde mich einfach nur interessieren was Java Programmierer darunter verstehen.
http://www.ibm.com/developerworks/java/library/j-noaccent.html
Das geht leider nur auf C ein...
Die letzten paar Punkte sind C++ und ein paar der C Punkte treffen auch auf C++ zu. Aber insgesamt sind es eher Kleinigkeiten. Vermutlich meinen die Leute in Ishildurs Java-Forum noch viel stärkere Stilunterschiede. So wie man hier ehemalige Java-Programmierer daran erkennt, dass sie alles auf den Heap legen. Wobei das umgekehrt in Java natürlich nicht geht, einen C++ Programmierer an der Stack-Nutzung zu erkennen. Eventuell ist gemeint, dass C++ Programmierer in Java hinter sich sauber aufräumen, anstatt sich auf die Garbage-Collection zu verlassen.
-
@Shade of Mine
Hast du einen Link dazu?
Hehe das war nicht so ernst gemeint
Es war eher so eine Anspielung darauf, dass jemand der viele Sprachen kennt (wenn auch nicht bis ins kleinste technische Detail) schliesslich überall zu hören bekommt, dass er von irgend einer anderen Sprache "verdorben" sein.
Ich persönlich kenne ein wenig Assembler,C,C++,C#,Java,Delphi,Lisp,SQL sowie zahlreiche Scriptsprachen wie PHP, Javascript, Matlab,Maple usw... Mit "ein wenig kennen" meine ich allerdings nicht, "einmal ein Tutorial gemacht" oder so, sondern damit mindest. ein halbes Jahr gearbeitet. In fast jeder dieser Sprachen habe ich interessante und zunächst zwar oft fremdartige, jedoch elegante Ansätze zur Lösung von Problemen gesehen und schliesslich Wege gesucht, diese neu gewonnenen Konzepte in zukünftigen Projekten auch in anderen Sprachen umzusetzen, was bei den entsprechenden Szeneleuten eigentlich selten gut ankommt.Ich habe bspw. während der Berufslehre ein Jahr lang ein Praktikum als Delphi Entwickler gemacht. Die sind mir regelrecht an die Gurgel gegangen, als ich da anfing mit Vererbung zu arbeiten (Ich war eben "verdorben" durch meinen Umgang mit C/C++), und selbst als ich anhand von Beispielen zeigen konnte, wie elegant man damit gewisse Sachen lösen kann, wollte einfach niemand etwas davon hören (Man würde ja vom Meister zum Schüler werden). Delphi ist zwar Objektorientiert, jedoch wurde dieses Feature in dieser Firma eigentlich nie verwendet, man verwendetete fast auschliesslich HasA und keine IsA Beziehungen. Als ich einem Java Professor an unserer Uni Bitmasken näherbringen wolle, verdrehte er nur die Augen und benutzt lieber eine ArrayList mit 20 Booleans und 20 Setter und Getter Methoden. Eine Bitmaske ist total LowLevel und so...
Unser Lisp Professor behauptet, dass rein funktionale Konzepte (ausschliesslich Substitution, keine States) auf jeden Fall und immer besser und vor allem eleganter seien, als eine böse Statemachine (selbst ein von mir geschriebenes C Programm, welches durch dynamische Programmierung O(n) eine grosse Fibonacci Zahl in wenigen ms berechnen konnte, während der "rein funktionale" O(2^n) Approach in Lisp mehrere Stunden dafür benötigte, vermochte nicht zu überzeugen "Rekursiv ist trotzdem eleganter, bessär, eine Statemaschine ist trotzdem böse!!"
Noch während der Berufslehre hatte ich einen beleidigend einfachen Javatest.
Die Aufgabe war, eine Liste von Objekten auf eine Reihe von Anforderungen hin zu überprüfen und schliesslich all diejenigen Objekte, welche sämtliche Anforderungen erfüllten auf den Bildschirm auszugeben. Ich schrieb das etwa so:while HasNext begin
if not Anforderung1 then continue;
if not Anforderung2 then continue;
if not Anforderung2 then continue;
print Element
endDas gabe ein "Ungenügend", das sei keine "strukturierte Programmierung", sonst solle ich ihm das mal in einem PAP oder in einem Nassi-Shneiderman darstellen.
Korrekt wäre gewesen:boolean b1
boolean b2
boolean b3while HasNext begin b1 = false b2 = false b3 = false if Anforderung1 then b1 = true if Anforderung2 then b2 = true if Anforderung2 then b3 = true if b1 == true and b2 == true and b3 == true then print Element end
Auch die Argumentation dass es doch IMHO keinen Sinn macht, die letzten 2 Eigenschaften zu überprüfen, wenn bereits die erste nicht erfüllt ist, war nicht von interesse, es musste einfach "strukturierte Programmierung" sein, alles Andere war falsch (böse)!
Das meinte ich damit, dass man als Allrounder eigentlich in jedem Forum irgendwann gegen eine Wand läuft
Ich persönlich finde, jeder der mal Assembler programmiert hat, programmiert anschliessend anders C, jeder der schon mal Java programmiert hat, programmiert anschliessend anders C++, jeder der schon mal C++ programmiert hat, programmiert anschliessend auch anders Java usw...
-
dass C++ Programmierer in Java hinter sich sauber aufräumen, anstatt sich auf die Garbage-Collection zu verlassen.
Hehe, ja in einem PHP Forum wurde ich mal zur Schnecke gemacht, weil ich ein Image Handles explizit freigegeben habe, nachdem ich es nicht mehr benutzt habe, anstatt dies vom Script automatisch erledigen zu lassen.
Und stimmt jetzt fällt mir wieder das eine oder andere ein. In einem XNA Forum (Ich programmierte ein xbox 360 Spiel mit C# und XNA als Projektarbeit im 4. Semester) hatte ich die Frechheit, mich nach Referenz Counting im Resourcen Manager zu erkundigen. Da hiess es, ich solle endlich aufhören so komplett veraltete Konzepte zu verfolgen, das brauche heutzutage niemand mehr, dafür sei der Garbage Collector da, es müsse endlich ein Umdenken stattfinden usw...
-
Habe übrigens noch gerade ein IMHO gutes Beispiel, warum Interfaces keine member variablen haben sollten:
class IVideoService{ }; class OpenGLVideoService:public IVideoService{ }; class Direct3DVideoService:public IVideoService{ };
Wetten der OpenGLVideoService hat nicht dieselben Members wie der Direct3DVideoService? Wetten eine Direct3D TextureResource hat komplett andere Members als eine OpenGl TextureResource?
-
Ishildur schrieb:
Noch während der Berufslehre hatte ich einen beleidigend einfachen Javatest.
Die Aufgabe war, eine Liste von Objekten auf eine Reihe von Anforderungen hin zu überprüfen und schliesslich all diejenigen Objekte, welche sämtliche Anforderungen erfüllten auf den Bildschirm auszugeben. Ich schrieb das etwa so:while HasNext begin
if not Anforderung1 then continue;
if not Anforderung2 then continue;
if not Anforderung2 then continue;
print Element
endDas gabe ein "Ungenügend", das sei keine "strukturierte Programmierung", sonst solle ich ihm das mal in einem PAP oder in einem Nassi-Shneiderman darstellen.
Korrekt wäre gewesen:boolean b1
boolean b2
boolean b3while HasNext begin b1 = false b2 = false b3 = false if Anforderung1 then b1 = true if Anforderung2 then b2 = true if Anforderung2 then b3 = true if b1 == true and b2 == true and b3 == true then print Element end
Auch die Argumentation dass es doch IMHO keinen Sinn macht, die letzten 2 Eigenschaften zu überprüfen, wenn bereits die erste nicht erfüllt ist, war nicht von interesse, es musste einfach "strukturierte Programmierung" sein, alles Andere war falsch (böse)!
Besser:
while hasNext begin if (Anforderung1) and (Anforderung2) and (Anforderun3) print Element end
Keine ekligen continues.
-
@Janjan
Hehe, es waren dann schon ein wenig komplexere Anforderungsprüfungenresp. eben auch eine Liste (habe das da zu einfach dargestellt) Es war dann eine zur Kompilezeit unbekannte Anzahl von Überprüfungen.
-
Unser Lisp Professor behauptet, dass rein funktionale Konzepte (ausschliesslich Substitution, keine States) auf jeden Fall und immer besser und vor allem eleganter seien, als eine böse Statemachine (selbst ein von mir geschriebenes C Programm, welches durch dynamische Programmierung O(n) eine grosse Fibonacci Zahl in wenigen ms berechnen konnte, während der "rein funktionale" O(2^n) Approach in Lisp mehrere Stunden dafür benötigte, vermochte nicht zu überzeugen "Rekursiv ist trotzdem eleganter, bessär, eine Statemaschine ist trotzdem böse!!"
Also Haskell als echt rein-funktionale Sprache kriegt das auch problemlos in O(n) hin... . Und ja, da ist das sogar ein 1-Zeiler der, wenn man ihn mal verstanden hat (was meiner Meinung nach nicht trivial ist), wesentlich eleganter ist als alles was du mit c hinkriegst.
Ich kenne Lisp nicht, und weiß nicht ob es dort die eleganten Möglichkeiten von Haskell gab, wenn ja, dann war der Prof vielleicht nicht ganz so gut wie er meinte :). Wenn nicht, dann wars wahrscheinlich trotzdem eleganter
-
Türlich geht das auch in Lisp schnell. Was ich nicht vestehe, ist wie man O(n^2) hinkriegt. O(1.61^n) klar. O(n) auch. (Addition gilt doch als O(1)?)
-
Ishildur schrieb:
@Janjan
Hehe, es waren dann schon ein wenig komplexere Anforderungsprüfungenresp. eben auch eine Liste (habe das da zu einfach dargestellt) Es war dann eine zur Kompilezeit unbekannte Anzahl von Überprüfungen.
Dann mach es so:
boolean checkRequirements(MyObject obj) { for(/* ... */) { if(!requirement) { return false; } } return true; } void foo() { // ... while(iter.hasNext()) { MyObject obj = iter.next(); if(checkRequirements(obj)) { print(obj); } } // ... }
Sieht doch besser aus, nicht?
Grüssli
-
Ishildur schrieb:
Ich habe folgende Struktur:
class IService{ public: virtual const char *GetName(void) const = 0; }; class IResourceService:public IService{ // einige zusätzliche Dinge... }; class AbstractService:public IService{ // implentiert gewisse Verwaltungsaufgaben die in den allermeisten Services anfallen... }; class ResourceService:public AbstractService,public IResourceService{ const char *GetName(void) const; };
Ist diese Architektur Schrott oder was?
Ja, Schrott.
-
@Dravere
Das ist auch nicht "strukturierte Programmierung", du wärst an dieser Prüfung auch durchgefallen :p Mehrere Returns... Pfui... :p (Ich brauche das auch oft aber eben, es gibt viele Leute, für die ist das "schlechter Stil")@volkard und otze
Könnt ihr mir erklären, wie eine Fibonacci Zahl ohne das Speichern von Zwischenresultaten in O(n) berechnet werden kann? (Das ist eine ernstgemeinte Frage, ich kanns mir wirklich grad nicht vorstellen)
Natürlich kriege ich das auch in Lisp problemlos in O(n) hin, aber IMHO nicht ohne das Zwischenspeichern von Werten. Es ging auch nicht um die Frage, ob man es in Lisp rekursiv definieren kann oder nicht, sondern ob es dann auch wirklich rein rekursiv berechnet wird (OHNE das Speichern von Zwischenresultaten, AUCH NICHT LOKAL oder so sondern rein durch Substitution wie beim Lambda Kalkül)
Und Otze kannst du mir diesen 1 Zeiler mal zeigen, ich bin gespannt, da kann ich was lernen.@fallsesnochkeinergesathat
Kannst du mir auch eine bessere Lösung zeigen oder ist "Ja, Schrott" dein ganzer Beitrag zu diesem Thema?
-
Ishildur schrieb:
@volkard und otze
Könnt ihr mir erklären, wie eine Fibonacci Zahl ohne das Speichern von Zwischenresultaten in O(n) berechnet werden kann?Das da http://en.literateprograms.org/Fibonacci_numbers_(Lisp) meinte ich wohl. Oder den http://stackoverflow.com/questions/627382/the-lisp-way-to-solve-fibonnaci mit fib_tr.
-
Ich lese mich schnell ein...