Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

11

02.09.2004, 11:30

Mit der Zeit und Erfahrung packt man (fast)alles automatisch in Klassen. Es vereinfacht vieles. :huhu:

12

04.09.2004, 01:29

In meinem aktuellen Projekt war es mir auch sehr wichtig alles im OOD zu halten und ja keine globale Variable, keine defines usw.
Oft tut man sich damit keinen Gefallen, sonder kompliziert die Geschichte eher, als sie zu vereinfachen.
Seit drei Tagen arbeite ich an professionellem Code oder sagen wir an Code eines kommerziellen Spiels und ich war erstaunt in wie Weit dort vom OOD abgewichen wird. Dadurch erlangt man aber viele Vorteil, wie sichere Initialisierung, schnelleren Zugriff auf Komponenten usw.

Nach dieser Erfahrung muss ich meine OOD Philosophie wirklich überdenken und vielleicht lieber "wohl überlegt" an die Sache gehen, als einfach auf einem Design zu pochen, was mehr schlecht als Recht ist.

Man sollte immer dort die Technik anwenden, die für das Projekt die meisten Vorteile bringt und nicht versuchen eine Technik durchzusetzen, egal mit welchen Verlusten.

Und mit diesem Post wiederspreche ich fast allen anderen Post, die ich jemals in diesem Forum und in jedem Anderen gemacht habe. Aber man lernt eben nie aus und man muss auch lernen wollen.

Osram

Alter Hase

  • »Osram« ist der Autor dieses Themas

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

13

04.09.2004, 08:57

blueEye schrieb:

Zitat


In meinem aktuellen Projekt war es mir auch sehr wichtig alles im OOD zu halten


Gut! (Wenn alles heißt ">= 80%").

Zitat


und ja keine globale Variable,


Gar keine? Das ist übertrieben.

Zitat


keine defines usw.


Ok, ich weiss, dass ich jetzt total gegen den Strom schwimme, aber ich sehe defines nicht als übel an. Immer schön viele Klammern setzen und man ist auf der sicheren Seite.

Zitat


Seit drei Tagen arbeite ich an professionellem Code oder sagen wir an Code eines kommerziellen Spiels und ich war erstaunt in wie Weit dort vom OOD abgewichen wird.


Von welchem, wenn man fragen darf? Ich weiss nicht von vielen kommerziellen Spielen, deren Source verfügbar ist: BoB, MA, EECH (alle von Empire :)), Quake 2, Nolf, Freelancer, mit Einschränkungen HL2 und F4.

Dadurch erlangt man aber viele Vorteil, wie sichere Initialisierung, schnelleren Zugriff auf Komponenten usw.

Zitat


Nach dieser Erfahrung muss ich meine OOD Philosophie wirklich überdenken und vielleicht lieber "wohl überlegt" an die Sache gehen, als einfach auf einem Design zu pochen, was mehr schlecht als Recht ist.


Das sicher. Wie oben gesagt ist es ein Werkzeug, d.h. dazu da, einen Zweck wie Wiederverwendung, Interfaces, weniger Bugs zu erreichen. Wenn es nicht dazu führt, ist es nichts Wert.

Um nochmal auf die Regeln zurückzukommen, die ich im 1. Post geschreiben habe:

Zitat


Wenn ich von verschiedenen Philosophien rede, dann meine ich unter anderem Regeln wie keine einzige globale Variable, kein einziges Define, alle Programm sollen OO benutzen, alle Programmteile sollen OO benutzen, Netzwerkzugriff muss transparent


Meine Meinungen sind (sorry, keine Zeit läömnger zu schreiben warum)
"alle Programm sollen OO benutzen" - Ja bis auf evtl(!) sehr sehr kleine.

"alle Programmteile sollen OO " - nicht unbedingt, aber die meisten

"Netzwerkzugriff muss transparent sein" - Ich habe erst vor kurzem einen Verriss dieser "heiligen Regel" von einem Top-programmierer (Joel Sponsky) gelesen.

Leider ist das Software Engineering immer noch total in den Anfängen :(. Man muss die Regeln die es gibt selber kritisch hinterfragen. Und man muss im Einzelfall nochmal hinterfragen, ob die Regel an der Stelle Sinn macht.
"Games are algorithmic entertainment."

14

04.09.2004, 22:43

Zitat von »"Osram"«

Gar keine? Das ist übertrieben.
Übertrieben ja. Aber die meisten kann man sehr leicht umgehen. Das Prob an globalen Variablen ist das es sehr schnell unübersichtlich werden kann.

Zitat von »"Osram"«

Ok, ich weiss, dass ich jetzt total gegen den Strom schwimme, aber ich sehe defines nicht als übel an. Immer schön viele Klammern setzen und man ist auf der sicheren Seite.
Das sehe ich auch so. Allerdings kann man durch Templates und echten Konstanten (keine #define - Konstanten) eine bessere Typ-Sicherheit erreichen.
Aber manchmal gibt es einfach nichts besseres. Z.b. bei der Automatischen Erstellung einer Exception.

Zitat von »"Osram"«

Von welchem, wenn man fragen darf? Ich weiss nicht von vielen kommerziellen Spielen, deren Source verfügbar ist: BoB, MA, EECH (alle von Empire ), Quake 2, Nolf, Freelancer, mit Einschränkungen HL2 und F4.

Dadurch erlangt man aber viele Vorteil, wie sichere Initialisierung, schnelleren Zugriff auf Komponenten usw.
Nur wenn er gut ist. Hab schon den ein oder anderen Code gesehen und ich muss sagen das die alle sehr schlecht zu lesen waren. Von Kommentaren oder Dokumentation keine Spur. Und die Struktur ist auch sehr oft nicht grad die beste.

Zitat von »"Osram"«

"Netzwerkzugriff muss transparent sein" - Ich habe erst vor kurzem einen Verriss dieser "heiligen Regel" von einem Top-programmierer (Joel Sponsky) gelesen.
Kenne zwar das Buch nicht aber ich glaub es dir auch so :) Gerade bei dingen wie die Netzwerkprogrammierung ist ein Transparenter Code einfach ein musss. Da man hier so Arbeiten muss als würde man mit mehreren Threads Arbeiten.
Hierzu kann ich gleich ein Aktuelles Beispiel liefern. Ich integriere in meine Engine gerade ein Message System. Dazu habe ich ein Server Interface und ein Client Interface. Die Integration in die Nachrichtenbehandlung über das Netzwerk brauch ich das Net Client Interface nur vom Nachrichten Client ableiten und schon stehen allen Rechnern alle Tore zu allen Interfaces offen. Dadurch das mein Msg System in einem eigenen Thread läuft ist es auch gleich Syncronisiert.


An den meisten stellen kann man sagen das die Vorteile eines OOD die Performanceverluste aufwiegen.

Es viel auch des öfteren schon die Anmerkung: "professioneller Code". Ich denke ein Code ist dann professionell wenn er einheitlich ist. Man muss sich von Anfang an auf einen Standard festlegen. Egal ob bestehnder oder eigener. Hauptsache dieser Standard wird dann konsequent durchgezogen und der Code gut Dokumentiert. Das erleichtert dann auch gleich die Wartung des Codes.

Hier haben wir dann auch gleich einen weiteren Aspekt von OOD. Die Wartung des Codes. Ein OO Code erleichtert nämlich auch genau dies sehr gut, in dem Funktionen und Daten die alle für einen Zweck (z.B. das händeln von Netzwerkdaten) implementiert wurden, zu einem Objekt zusammengefasst werden. Dies erhöht die übersicht und fördert so die Wartung des Codes.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Osram

Alter Hase

  • »Osram« ist der Autor dieses Themas

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

15

04.09.2004, 23:04

Zitat


Übertrieben ja. Aber die meisten kann man sehr leicht umgehen. Das Prob an globalen Variablen ist das es sehr schnell unübersichtlich werden kann.


Ja klar, ich bin auch für möglichst wenige. Eine Funktion verändert ja normalerweise nur übergebene Variablen (je nach dem, wie sie übergeben wurden) sowie den Rückgabewert und, wenn es eine Member-Funktion ist, die Membervariablen. Insofern kann man eine Veänderung oder Abhängigkeit mit einer globalen Variablen leicht übersehen.

Zitat


Das sehe ich auch so. Allerdings kann man durch Templates und echten Konstanten (keine #define - Konstanten) eine bessere Typ-Sicherheit erreichen.
Aber manchmal gibt es einfach nichts besseres. Z.b. bei der Automatischen Erstellung einer Exception.


Ja, stimmt, wo man Typsicher arbeiten kann, sollte man es auch tun. Ich bin erst vor kurzen gebissen worden, weil C(++) an der Stelle typ-unsicher ist. Es hatte allerdings nichts mit defines zu tun.

Zitat


Nur wenn er gut ist. Hab schon den ein oder anderen Code gesehen und ich muss sagen das die alle sehr schlecht zu lesen waren. Von Kommentaren oder Dokumentation keine Spur.


Ja, das ist schon war. Umso größer ist die Herausforderung ;).

Zitat


Kenne zwar das Buch nicht aber ich glaub es dir auch so


http://www.joelonsoftware.com/

Eine Super Seite! Insbesondere das "komplete Archive".
"Games are algorithmic entertainment."

helium

Treue Seele

Beiträge: 180

Wohnort: NRW, Burscheid (nahe Köln)

  • Private Nachricht senden

16

15.09.2004, 09:43

Zitat

M.E. sollten alle Programme OO sein bis auf sehr sehr kleine.


Ich habe mich bemüht, aber eine konkrete Begrünbdung habe ich nicht gefunden. Lediglich, dass du der meinung bist, dass es der Bugvermeidung dient.
Allerings verstehe ich das jetzt nicht. Warum sollten funktionale oder logische Vorgehensweisen schneller zu Bugs führen, als eine objektorientierte?
In der Regel sind funtkionale Programme bei dem gleichen Algorithmus deutlich kürzer und übersichtlicher und gewinnen dabei sogar an Ausdrucksstärke. Solch ein Code lässt sich leichter lesen und besser warten. Und wenn man so ein mächtiges Typ-System hat, wie beispielsweise in SML kann das auch nur von Vorteil sein. Und solche System findet man bisher nur in funktionalen oder Mischsprachen (ich meine funktional/oo).

Oder logische Sprachen. Wenn der Compiler für mich nachdenkt ist das doch sicherlich nur von Vorteil, wenn es ums vermeiden von Bugs geht, denn irren ist Menschlich. Der Compiler wird (sofern ordentlich programmiert) keine Fehler machen. Da ich üer weniger selber nachdenken muss, habe ich weniger Möglichkeiten Fehler zu machen

OO als Allheilmittel zu verkaufen ist IMO falsch. Es ist schön für gewisse Dinge, aber nicht generell perfekt.
Jedes Paradigma hat eine gewisse Berechtigung, auch wenn sie beim prozeduralen Programmieren vielleicht nur die ist, in gewissen Situationen das letzte Quäntschen Geschwindigkeit herauszuquetschen.

Osram

Alter Hase

  • »Osram« ist der Autor dieses Themas

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

17

15.09.2004, 12:55

Nuja, neben Bugvermeidung und auch -Suche sind Wiederverwendung und Interfaces schon weitere Vorteile ;) .

Weitere (sorry für den Telegrammstil):
- Es gibt Tools, z.B. zur Anzeige der Members oder UML Tools.
- Austausch von "Daten mit Funktionalität" zwischen Programmiersprachen oder verschiedenen Rechnern. Beispiele für das erstere sind .Net oder "Python for Delphi".
- Abstrakte Daten Typen (ADT), d.h. selber neue Datentypen kreieren.
- "Verstecken" von Code, z.B. Polymorphie. Ist m.E. ein zweischneidiges Schwert, aber es gibt Fälle, wo es hilft.
- M.E. logische, rückblickend gesagt fast zwingende Weiterentwicklung der Strukturierten Programmierung.
- Man kann besser über ein OO Programm reden, d.h. die Zusammenarbeit im Team ist leichter. Es ist besser, Bücher zu schreiben, wenn ich auf die einzelnen Klassen und Objekte des Programmes eingehen kann als auf Strukturen und Funktionen.

Zitat


Allerdings verstehe ich das jetzt nicht. Warum sollten funktionale oder logische Vorgehensweisen schneller zu Bugs führen, als eine objektorientierte?


Vieles kommt weiter unten, z.B. mehr Klarheit und Übersicht hilft natürlich auch, fehler erst gar nicht entstehen zu lassen.

Es gitb auch Klassen, die sich selber testen.

Oder denk an Konstrutoren und Destruktoren. ich bekomme kein Objekt ohne CTor Aufruf, d.h. wenn mir ein Parameter fehlt, weil z.B. die Klasse gar nicht passt, so fällt das auf. Und bei einem lokaln Objekt wird der DTor autoatisch aufgerufen. Wenn darin etwas nicht triviales gemacht wird, kann ich das bei Funktionaler Programmierung leicht vergessen.


Zitat



In der Regel sind funtkionale Programme bei dem gleichen Algorithmus deutlich kürzer und übersichtlicher und gewinnen dabei sogar an Ausdrucksstärke.


Kürzer, ja, meist. Das kommt u.a. von dem mehr an Deklarationen in OO. Diese helfen aber, Fehler zu vermeiden ;), da der Compiler Dinge abchecken kann.

Übersichtlicher: Nein. Ich empfinde OO als deutlich übersichtlicher als Funktionale Programmierung, da eben in einer Klasse alles zusammenghörige beieinander steht. Die Abgrenzung zu ausserhalb liegenden Daten/Funktionen ist sehr klar und wird vom Compiler geprüft.

Zitat


Solch ein Code lässt sich leichter lesen und besser warten.


Sehe ich genau anders rum, gerade das Warten. Dadurch, dass Funktionalität stark gekapselt ist, ist ein Ändern des Codes deutlich einfacher. Die beiden Standardfragen bei der Wartung sind doch: "Wie funktioniert der Code" ??? und "Wenn ich hier was ändere, was ist dann alles betroffen" ??? Bei der zweiten Frage kann OO helfen.

Zitat


Und wenn man so ein mächtiges Typ-System hat, wie beispielsweise in SML kann das auch nur von Vorteil sein. Und solche System findet man bisher nur in funktionalen oder Mischsprachen (ich meine funktional/oo).


Fragen wir mal anders rum: Welche reine OO Sprache hat ein schlechtes Typsystem?

Dass C++ ein katastrophales hat, ist ausser Frage, aber a) ist C++ eine Mischung und b) ist das ein problem mit C++ und nicht mit OO.

Zitat


Oder logische Sprachen. Wenn der Compiler für mich nachdenkt ist das doch sicherlich nur von Vorteil, wenn es ums vermeiden von Bugs geht, denn irren ist Menschlich.


Dann frage ich mal, warum die so selten eingesetzt werden. Das ist durchaus keine rhetorische Frage.

Zitat


OO als Allheilmittel zu verkaufen ist IMO falsch.


Ich sage, dass man OO bei allen Programmen (ausser sehr kleinen) einsetzen soll. Dann bleiben natürlich noch Probleme über, OO ist in diesem Sinne kein Allheilmittel.

Zitat


Es ist schön für gewisse Dinge, aber nicht generell perfekt.


Ich sage nicht dass es Perfekt ist. Aber es kann für die verschiedensten Dinge eingesetzt werden, Spiele, Simulationen, Datenbank Programme, Middleware, Bibliotheken, Applikationen, Clients, Server, Compilerm etc etc. Wieviele Anwendungsbereiche fallen Dir ein, wo es keinen Sinn macht? Soweit ich weiss werden heute selbst die meisten Treiber in OO geschrieben. Insofern bleibe ich bei meiner groben Aussage "es ist schön für alle Programmieraufgaben" :).

Zitat


Jedes Paradigma hat eine gewisse Berechtigung, auch wenn sie beim prozeduralen Programmieren vielleicht nur die ist, in gewissen Situationen das letzte Quäntschen Geschwindigkeit herauszuquetschen.


Das macht vielleicht für 5% des Codes Sinn. Und der ist evtl schon in einer Memberfunktion und muss nur "intern" schnell sein. Aber ich habe ja auch gesagt, dass man Teile eines Programmes weiterhin Funktional lassen kann.
"Games are algorithmic entertainment."

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

18

15.09.2004, 13:10

Naja bevor hier erstmal ein gewaltiger seriöser Flamewar ausbricht sag ich einfach mal:

Jeder muss sein OO Konzept für sich selber finden, egal ob man C++, Java, C usw. codet, solang man selbst damit zurecht kommt und sich damit identifizieren kann ist alles in Butter :)

helium

Treue Seele

Beiträge: 180

Wohnort: NRW, Burscheid (nahe Köln)

  • Private Nachricht senden

19

16.09.2004, 10:39

Also, C'- und D'toren sind nichts, was durch die OO erzwungen wird. in Objective-C muss ich beispielswiese den C'tor manuell aufrufen, ich kann es also vergessen (zumindest theoretisch) und Objective-C ist IMHO "objektorientierter", als z.B. C++.
D'toren gibt es in den wenigsten OO-Sprachen. Das ist also überhaupt kein Argument.

Aber in den meisten funktionalen Sprachen bekommst du auch kein "Objekt" ohne C'tor-Aufruf.

Zitat


Es gitb auch Klassen, die sich selber testen.


Aber normalerweise schreibt man extern sogenannte Unit-Tests.


Zitat


Das kommt u.a. von dem mehr an Deklarationen in OO.

Wo deklariere ich in Smalltalk, wo deklariere ich in SELF, wo ...

Nein. Es liegt vor allem an dem meist vorhandenen Patternmatching.

Quellcode

1
2
let map funktion [] = []
    map funktion (head::tail) = (funktion head :: map funktion tail)


C-/C++-Quelltext

1
2
3
4
5
6
7
8
template <typename T, typename F>
std::list<T> map (std::list<T> const & list, F f)
{
   std::list<T> result;
   for (std::list<T>::const_iterator it=list.begin(); it!=list.end(); ++it)
      result.push_back (f(*it));
   return result;
}


Was ist schöner? Was ist leichter zu lesen? In welchem Code findet man schneller einen Fehler, sollte einer vorhanden sein?

Selbst primitivste Beispiele arten in Sprachen wie C++ zu unübersichtlichen Monstern aus.

Quellcode

1
let mul x y = x * y


C-/C++-Quelltext

1
2
3
4
5
tempalte <typename T, typename U>
typeof(T() * U()) mul (T x, U y)
{
   return x * y;
}



Zitat


Ich empfinde OO als deutlich übersichtlicher als Funktionale Programmierung, da eben in einer Klasse alles zusammenghörige beieinander steht.

SML kennt sogenannte Strukturen (hat nichts mit C-Strukturen zu tun), wo du genau das erreichst: zusammengehöriges steht beienander.


Zitat


Fragen wir mal anders rum: Welche reine OO Sprache hat ein schlechtes Typsystem?


Entschuldige, in dem Fall habe ich mich total beschissen ausgedrückt. Die meisten OO-Sprachen sind dynamisch Typisiert, wie z.B. Smalltalk, Objective-C, Python, ... . Fehler werden erst zur Laufzeit gefunden.
Viele funktionale Sprachen sind statisch typisiert, wie z.B. SML, O'Caml, ... . Bieten aber ein tolles Type-Inference-System. Sowas, wie in Java oder C++ ist doch schon fast eine Zumutung.


Zitat


Dann frage ich mal, warum die so selten eingesetzt werden.

Ich weiß es natürlich nicht wirklich. Aber ich nehme mal an, dass ein punkt ist, dass das logische Programmieren noch so neu ist.
Prozedural programmieren wir schon immer, funktional seit den fünfzigern.


Zitat


Das macht vielleicht für 5% des Codes Sinn. Und der ist evtl schon in einer Memberfunktion und muss nur "intern" schnell sein. Aber ich habe ja auch gesagt, dass man Teile eines Programmes weiterhin Funktional lassen kann.

Hä? Das klingt ja so, als würdest du das funktionale (SML, Haskell, ...) und das prozedurale (BASIC, Pascal, C, ...) Paradigma durcheinanderwürfeln. Das ware aber ganz böse.

Osram

Alter Hase

  • »Osram« ist der Autor dieses Themas

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

20

16.09.2004, 12:25

Zitat


Also, C'- und D'toren sind nichts, was durch die OO erzwungen wird. in Objective-C muss ich beispielswiese den C'tor manuell aufrufen, ich kann es also vergessen (zumindest theoretisch) und Objective-C ist IMHO "objektorientierter", als z.B. C++.
D'toren gibt es in den wenigsten OO-Sprachen.


Interessant, das war mir nicht klar. D.h. wenn ich ein Objekt definiere, wird mir einfach nur der Speicher zur Verfügung gestellt?

Zitat


Aber normalerweise schreibt man extern sogenannte Unit-Tests.


Ja. Allerdings gibts das "Design by Contract", wo die "sich selbst testende Klasse" ein wesentlicher Gesichstpunkt ist.

<Vergleich mir Template in C++>

Mir gefällt die Template Syntax in C++ auch nicht.

In Deinem Beispiel ist das Gegenbeispiel auch in der Tat wahrscheinlich gut lesbar (wenn man die Sprache kann).

Zitat


Entschuldige, in dem Fall habe ich mich total beschissen ausgedrückt. Die meisten OO-Sprachen sind dynamisch Typisiert, wie z.B. Smalltalk, Objective-C, Python, ... . Fehler werden erst zur Laufzeit gefunden.


Von denen habe ich nur Python benutzt. Python ist eine Skriptsprache. Da ist all das Absicht. Man kann das veilleicht als Nachteil sehen und es ist bestimmt ein grosser Grund, warum ich keine grosse Applikation in einer Skriptsprache schreiben würde (auch wenn's einige machen, siehe z.B. Zope).

Ich sehe nicht, dass das was mit OO zu tun hat. Die Begriffe "OO" und "Skriptsprache" haben für mich nichts miteinander zu tun, es gibt alle 4 Kombinationsmöglichkeiten.

Zitat


Ich weiß es natürlich nicht wirklich. Aber ich nehme mal an, dass ein punkt ist, dass das logische Programmieren noch so neu ist.
Prozedural programmieren wir schon immer, funktional seit den fünfzigern.


Ich bin nicht überzeugt, dass es eine Zeitfrage ist und sich noch durchsetzen wird. Andererseits muss ich zugestehen, dass sich leider bei weitem nicht alles Gute durchsetzt.

Zitat


Das klingt ja so, als würdest du das funktionale (SML, Haskell, ...) und das prozedurale (BASIC, Pascal, C, ...) Paradigma durcheinanderwürfeln.


Ooops, stimmt

:pi_blush:

Ich kann mir vorstellen, dass sich ein Teil dieser Diskussion daraus ergibt, dass sich C++ (leider) durchgesetzt hat. Das bietet natürlich eine grosse Angriffsfläche gegen die meistbenutzte Sprache, die OO erlaubt.

Ich sehe es eben eher so, dass ich für meine Open Source Sachen C++ benutze, um mit anderen arbeiten zu können. Dann kann ich am meisten aus C++ "herausholen", indem ich OO benutze und nicht letztlich C schreibe, was ich dann vom C++ Compiler übersetzen lasse. Analoges gilt, wenn ich eine andere Mischsprache wie Python benutze.
"Games are algorithmic entertainment."

Werbeanzeige