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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

21

13.10.2011, 12:52

Was die Sache mit den reinen Managerklassen angeht, so ist meine Erfahrung allerdings auch, dass man sowas in einem guten Design kaum sieht. Ich hab praktisch nie eine Klasse, deren wirklich einzige Aufgabe es ist, Objekte zu "managen". Wenn man wirklich keinen besseren Namen dafür finden kann, sollte man imo doch zumindest mal drüber nachdenken, ob die Klasse so eigentlich sinnvoll ist, oder ob sie nicht doch nur aus Verlegenheit existiert, weil man nicht so recht weiß, wohin mit dem ganzen Kram.

Java ist aufgrund der primitiven Datentypen nicht _rein_ objektorientiert - Integer sind in Java keine Objekte (auch C++ ist nicht _rein_ objektorientiert)

Man hört das Argument oft, aber ich seh da eigentlich kein Problem. Es stimmt, dass die Schnittstelle syntaktisch nicht wirklich einer herkömmlichen OO Schnittstelle entspricht, aber imo erfüllt ein Java oder C++ int eigentlich alle Voraussetzungen eines Objektes im Sinne der OOP.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

22

13.10.2011, 13:30

versuche doch mal eine Integer Variable Polymorph zu verwenden (also versuch darin etwas anderes zu speichern, als einen Integer oder versuche einen Integer in einer anders typisierten Variable zu speichern)
welche Attribute und/oder Methoden sind diesen denn zugeordnet?

wenn man das mal mit C# vergleicht: dort gibt es keine primitiven Datentypen und int ist lediglich ein Alias auf die Klasse Int32, welche von ValueObject abgeleitet ist
somit kann man in einer Object-Variable einen Integer Wert speichern (Polymorphie)
und diese Klasse besitzt Methoden (wie ToString)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

23

13.10.2011, 14:03

Versuch mal einen C# int polymorph zu verwenden. Dass du einen int in ein System.Object packen kannst, liegt daran, dass C# (im Gegensatz zu Java) vernünftiges Boxing kennt. Das ist dann gleichwertig mit sowas:

C#-Quelltext

1
2
3
4
class BoxedInt : Object
{
  int i;
}

Nur dass .NET das eben implizit und automatisch für dich bastelt. Das ist dann aber eben eigentlich kein int mehr. C# versteht am Ende nur von selbst, was man in Java mit int und Integer händisch machen muss.

Ein Objekt ist charakterisiert dadurch dass es
  • Eindeutig identifizierbar ist (eine Adresse hat)
  • Einen Zustand (Daten) hat
  • Ein Verhalten hat, also Operationen auf diesen Daten zur Verfügung stellt
imo erfüllt ein int in praktisch jeder mir bekannten Sprache alle 3 Punkte.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (13.10.2011, 14:18)


Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

24

13.10.2011, 14:40

Dass du einen int in ein System.Object packen kannst, liegt daran, dass C# (im Gegensatz zu Java) vernünftiges Boxing kennt.
das liegt daran, dass in Java ein int etwas ganz anderes ist, als eine Instanz einer Klasse
während in C# jeder Integer ein Objekt einer Klasse ist, siehe http://msdn.microsoft.com/de-de/library/…0(v=vs.80).aspx
auf der Seite steht auch, dass int in C# nur ein Alias ist (genauso wie string und object dies für String und Object sind)

Das ist dann gleichwertig mit sowas:

C#-Quelltext

1
2
3
4
class BoxedInt : Object
{
  int i;
}

Nur dass .NET das eben implizit und automatisch für dich bastelt.
das wird nicht automatisch gemacht, sondern ist (nicht unbedingt exakt so) im .NET Framework bereits vorhanden (die Klasse heißt Int32)
Das ist dann aber eben eigentlich kein int mehr.
einen anderen int gibt es in C# nicht

Ein Objekt ist charakterisiert dadurch dass es
  • Eindeutig identifizierbar ist (eine Adresse hat)
  • Einen Zustand (Daten) hat
  • Ein Verhalten hat, also Operationen auf diesen Daten zur Verfügung stellt
imo erfüllt ein int alle 3 Punkte.
Quelle?
in Java erhält man niemals Zugriff auf die Adresse der einzelnen Objekte, geschweige denn man kann sie darüber ansprechen
ein int in Java und C++ erfüllt den 3. Punkt aber nicht


C#-Quelltext

1
2
3
4
5
6
7
8
static void Main(string[] args)
{
    int integer = 32;
    Object objekt = integer;
    Console.WriteLine(integer.GetType());
    Console.WriteLine(objekt.GetType());
    Console.ReadLine();
}

dieser Code gibt 2 Mal das gleiche aus
wäre der integer nach dem zuweisen an objekt kein integer mehr, dann hätte sich die Ausgabe verändert ;)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

25

13.10.2011, 15:12

das wird nicht automatisch gemacht, sondern ist (nicht unbedingt exakt so) im .NET Framework bereits vorhanden (die Klasse heißt Int32)

http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx. Ein int ist keine class, sondern ein struct in C#. class und struct in C# reflektieren aber natürlich nur die fundamentale Unterscheidung zwischen Referenz- und Werttyp, die eine der Grundfesten (und imo eine der ganz großen Stärken gegenüber Java) von .NET ist. Dass int nur ein Alias für Int32 ist, ändert da nix dran. Du kannst ja einfach mal versuchen, von einem int abzuleiten. Aber es stimmt, dass im Typsystem alles von System.Object abgeleitet ist. Mein Argument war ja aber auch nicht dagegen, dass in C# alles ein Objekt ist, sondern dafür, dass ein int auch in Java oder C++ den Eigenschaften eines Objekts im Sinne der OOP genügt, auch ohne dass dort alles von einem grundlegen Typ Object abgeleitet ist.

Ein Objekt ist charakterisiert dadurch dass es
  • Eindeutig identifizierbar ist (eine Adresse hat)
  • Einen Zustand (Daten) hat
  • Ein Verhalten hat, also Operationen auf diesen Daten zur Verfügung stellt
imo erfüllt ein int alle 3 Punkte.
Quelle?

"Identität, Zustand und Verhalten" gehört eigentlich zu den ersten Dingen, die jeder Student in einer Vorlesung über Objektorientierte Programmierung so zu hören bekommt. Da ich grad keine Lust hab die Uni-Bibliothek zu durchforsten, mach ichs mir mal einfach: http://en.wikipedia.org/wiki/Object_(com…es_of_an_Object ;)

in Java erhält man niemals Zugriff auf die Adresse der einzelnen Objekte, geschweige denn man kann sie darüber ansprechen

In Java gibt es dafür eben Referenzen. Und ein int ist in Java immer noch über einen Namen ansprechbar.

ein int in Java und C++ erfüllt den 3. Punkt aber nicht

Meiner Meinung nach schon, es gibt Opertaionen, die ich auf Objekten vom Typ int durchführen kann. Die sind in den meisten Sprachen eben in Form von Operatoren wie +, -, *, /, ... fix eingebaut.

C#-Quelltext

1
2
3
4
5
6
7
8
static void Main(string[] args)
{
    int integer = 32;
    Object objekt = integer;
    Console.WriteLine(integer.GetType());
    Console.WriteLine(objekt.GetType());
    Console.ReadLine();
}

dieser Code gibt 2 Mal das gleiche aus
wäre der integer nach dem zuweisen an objekt kein integer mehr, dann hätte sich die Ausgabe verändert ;)

Interessantes Argument. Ich bin mir ehrlich gesagt nicht ganz sicher, wieso das so ist. Vermutlich ist es aber auf den Boxing-Mechanismus zurückzuführen. Unabhängig davon, was nun der genaue Grund sein mag, widerlegt das auch nicht meine eigentliche Aussage, dass int auch in Sprachen wie Java und C++ die Kriterien eines Objektes erfüllt.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (13.10.2011, 15:20)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

26

13.10.2011, 15:52

dieser Code gibt 2 Mal das gleiche aus
wäre der integer nach dem zuweisen an objekt kein integer mehr, dann hätte sich die Ausgabe verändert ;)


.NET versucht den Vorgang natürlich transparent zu halten. Dennoch ist objekt kein wirklicher Werttyp mehr sondern ein Referenztyp welches sich im Managed Heap befindet. Im Gegesatz zu integer welches auf dem Stack liegt. Beide Objekte sind auch unabhängig voneinander:

C#-Quelltext

1
2
3
4
int integer = 32;
Object objekt = integer;
integer = 42;
Console.Write(integer+ " " + objekt);
@D13_Dreinig

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

27

13.10.2011, 17:04

ich wollte mit dem Alias darauf hinaus, dass es in Java sowohl einen primitiven Datentyp, als auch eine Klasse gibt
ja, im .NET Framework sind dies keine Klassen, sondern Strukturen (und eigentlich hätte ich das besser wissen müssen... :S )
zum Unboxing: über dieses Verhalten hätte ich auch ein wenig besser bescheid wissen sollen (allerdings waren mir dennoch diverse Folgen aus dem Verhalten bekannt, wie dass sie nicht null annehmen können oder dass ihr Wert bei einem Funktionsaufruf kopiert wird)
woran das liegt ist wieder eine andere Sache (vielleicht nicht richtig gelernt/eingeprägt oder zu lange nicht so direkt damit zu tun gehabt)

die Identität als Merkmal eines Objekts erschließt sich mir (als einziges von den 3 Punkten) nicht
da alles, was im Arbeitsspeicher automatisch über eine Adresse verfügt und (je nach Programmiersprache) darüber angesprochen werden kann, ist dieses Kriterium für jedes Datum, welches auf dem Arbeitsspeicher abgelegt wird, erfüllt
gibt es eine Programmiersprache, die ein Element besitzt, auf welches dieser Punkt nicht zutrifft?

da die Integer in C++ den Anforderungen eines Objekts genügen sollen, kann man sagen, dass es Objekte sind
woraus man folgern kann, dass C, welches die gleichen Integer (und anderen Datentypen) verwendet, ebenfalls mit Objekten arbeitet und deshalb eine rein objektorientierte Programmiersprache ist, oder?
allerdings wird C dennoch nicht als objektorientierte Sprache bezeichnet, was dann an einem anderem Grund liegen muss
(und vielleicht liege ich ja mit meiner Meinung falsch, dass man (u. a.) die primitiven Datentypen aus Java nicht als Objekte Bezeichnen kann, vielleicht, weil ich es falsch gelehrt bekommen habe)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

28

13.10.2011, 18:31

allerdings wird C dennoch nicht als objektorientierte Sprache bezeichnet, was dann an einem anderem Grund liegen muss
(und vielleicht liege ich ja mit meiner Meinung falsch, dass man (u. a.) die primitiven Datentypen aus Java nicht als Objekte Bezeichnen kann, vielleicht, weil ich es falsch gelehrt bekommen habe)


Die Bezeichnung Objektorientierte Sprache ermisst sich i.d.R. daran inwieweit das Konzept von der Sprache unterstützt wird (s. z.B. wiki). Allerdings lassen sich natürlich auch mit C alle OOP Techniken umsetzen. Ganz interessant: Object-oriented Programming with ANSI-C
@D13_Dreinig

29

13.10.2011, 21:52

Wie scharfsinnig das mit dem Listener zu erwähnen. Bei dieser Geschichte geht es NICHT um vernünftige Namen oder so etwas. Einen Manager nur anders zu benennen ist
damit nicht gemeint. Sondern vielmehr, dass es keinen Grund gibt für solche Klassen.
Seltsamerweise denken viele Leute bei OOP geht es NUR um Klassen und deren Methoden. Kaum einer denkt mal daran, dass Methoden auch außerhalb von Klassen existieren können und vor allem auch sollten.
In solch einem Manager sind oft Methoden drin, die eigentlich gar nicht in eine Klasse gehören. Darum die Aussage, keine Klassen mit "er". Natürlich gibt es Ausnahmen, da es ja englische Worte gibt, die auf er enden (siehe Listener, Player usw.).
In C gibt es den struct um Daten zu einer logischen Einheit zusammenzufassen. Das OOP Konzept stellt die logische Erweiterung dieser struct dar und fügt noch Methoden zu structs hinzu (darum kann man auch class und struct gleich verwenden). Das war seinerzeit die Idee hinter den Klassen und das grundlegende von C++.
Dennoch existieren weiterhin Methoden, die NICHT zu einer Klasse gehören. Da viele aber das Konzept nicht verstehen, entstehen plötzlich Manager/Helper etc. Klassen.
Aber nur weil sie denken, dass eine Methode schließlich in irgendeine Klasse rein MUSS. Das ist aber falsch.
Dieses Mißverständnis eisenhart durchgezogen führt dann zu Performance Problemen.
Also was shiroto schreibt, ist natürlich vollkommen falsch. Ein falsch angewendetes OOP Design kann zu Performance Problemen führen.
Grundsätzlich der Ansatz, ich fang einfach an und dann refactore ich bei Bedarf ist auch etwas schräg. Man sollte schon vorher ein bisschen drüber nachdenken.
Dann kann man sich direkt viel Refactoring ersparen. Aber dazu bedarf es vor allem viel Erfahrung.
"Vollkommen falsch", da hält sich aber jemand für besonders schlau. Ich habe geschrieben, dass ICH es so mache, nicht dass es der einzig richtige Ansatz ist. Bei mir hat die Erfahrung gezeigt, dass Spiele ziemlich schwer zu planen sind, weil ich im vornherein gar nicht alles im Detail weiß. Und da fang ich lieber an als mir noch Wochen Gedanken darüber zu machen was ich denn vergessen haben könnte. Denn vergessen tut man immer etwas, oder einem fällt später noch nen feature ein, was man vlt nicht ohne weiteres einbauen kann. Da ist es besser sein Design nicht in Zement zu gießen sondern etwas flexibler zu halten, unter anderem durch ständiges Refactoring. Meinetwegen kannst du deine Projekte nach dem Wasserfallmodell bestreiten, ich habe mich anders entschieden.
Und bitte wo steht, dass es zum OOD gehört Methoden außerhalb von Klassen zu haben? Das würd ich gern mal sehen.
OO kostet IMMER Performance/Speicher. Denkst du ernsthaft, du bekommst das ganze hübsche Design und die Übersichtlichkeit umsonst? OO ist eine weitere höhere Form der Verwaltung von Daten, und die kostet immer.


C#-Quelltext

1
2
3
4
5
6
7
8
static void Main(string[] args)
{
    int integer = 32;
    Object objekt = integer;
    Console.WriteLine(integer.GetType());
    Console.WriteLine(objekt.GetType());
    Console.ReadLine();
}

dieser Code gibt 2 Mal das gleiche aus
wäre der integer nach dem zuweisen an objekt kein integer mehr, dann hätte sich die Ausgabe verändert ;)

Interessantes Argument. Ich bin mir ehrlich gesagt nicht ganz sicher, wieso das so ist. Vermutlich ist es aber auf den Boxing-Mechanismus zurückzuführen. Unabhängig davon, was nun der genaue Grund sein mag, widerlegt das auch nicht meine eigentliche Aussage, dass int auch in Sprachen wie Java und C++ die Kriterien eines Objektes erfüllt.
Weil structs von Object erben. Zu lesen hier: http://msdn.microsoft.com/en-us/library/ah19swz4(v=vs.71).aspx

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

30

13.10.2011, 22:19

Also, C++ ist oft genauso performanter wie C, teilweise sogar performanter. Trotz OOP wurde darauf geachtet den Overhead klein zu halten. Bedeutet: Nur weil es OOP ist, ist es nicht weniger Performant, das ist ein Gerücht das sich gut hält, aber nicht wirklich stimmt.

Werbeanzeige