Discussion:
Brettspiele Programmieren
(zu alt für eine Antwort)
Michael Metol
2005-10-15 07:45:20 UTC
Permalink
Hallo!

Gibt es eine allgemeine Technik, wie man Brettspiele programmiert?
Welche Datenstrukturen verwendet (2D Arrays) man da in der Regel?

Danke für eure Antworten.

Michael Metol
Stefan Matthias Aust
2005-10-15 08:11:37 UTC
Permalink
Post by Michael Metol
Gibt es eine allgemeine Technik, wie man Brettspiele programmiert?
Welche Datenstrukturen verwendet (2D Arrays) man da in der Regel?
Man implementiert das UI und das Modell. Das UI ist eine grafische
Repräsentation des Bretts mit seinem Spielsteinen. Das Modell ein
Objektrepräsentation mindestens der Spielsteine sowie eine Umsetzung der
Regeln.

Nehmen wir z.B. "Mensch ärgere dich nicht" als Beispiel.

Das Spielbrett hat ich-weiss-nicht-wie-viele Felder, die in einem Kreis
angeordnet sind. 4 Felder sind Startpunkte für die 4 Spieler. 4 andere
Felder bilden eine Abzweigung zu den 4 Zielfeldern der jeweiligen
Spieler. Es gibt Spielsteine. Das Spielbrett selbst muss ich nicht
modellieren. Damit ergibt sich folgendes mögliches Datenmodell:

class Player {
Piece[] pieces;
Field entry;
}

class Field {
Field next;
Piece piece;
}

class JunctionField extends Field {
Player owner;
Field exit;
}

class Piece {
Player owner;
Field position;
}

Alle Felder werden zu diesem Ring verknüpft, dazwischen hängen die
Weichen, die ein Spieler nehmen kann, wenn er es ist. Evtl. ist dies
eine dumme Modellierung und besser wäre, wenn der Spieler nicht nur den
Startpunkt kennen würde sondern auch einfach diese Weiche. Jeder
Spieler kennt seine (vier) Spielsteine und weiss, wo er den Ring
betritt. Ein Spielstein hat die Position "null", wenn er noch nicht auf
dem Ring ist.

Die Regeln in Prosa sind ungefähr so: Reihum wird gewürfelt. Bei einer
6 kann eine neue Figur auf das "entry"-Feld gesezt werden, wenn es noch
eine solche Figur ohne Position gibt und auf dem entry-feld nicht schon
eine eigene Figur steht. Andernfalls wird wie bei 1-5 verfahren. Im
Anschluss wird nach einer 6 nochmal gewürfelt und es geht von vorne los.
Bei 1-5 muss der Spieler eine seiner figure auf dem Brett wählen. Es
wird ein neues Zielfeld bestimmt und die Figur wird dort hin gesetzt.
Wird eine Figur gesetzt und dort befindet sich eine gegnerische Figur,
wird deren Position zurück auf null gesetzt. Ist dort eine eigene Figur,
war es ein illegaler Zug. Beim Bewegen wird die Weiche berücksichtigt.

Das würde ich in die folgenden Funktionen runterbrechen:

- Zahl würfeln
- prüfen, ob eine figur herausgesetzt werden kann
- figur raussetzen
- prüfen, ob eine figur ziehen kann
- ausgewählte figur ziehen

class Game {

int roll() { ... }

boolean enterAllowed(Player p, int die) {
return die == 6 && p.hasFreePieces() && p.entry.noPieceOf(p);
}

void enter(Player p) {
p.getFreePiece().setTo(p.entry);
}

boolean moveAllowed(Piece p, int die) {
return p.position.stepTimes(p.owner, die) != null;
}

void move(Piece p, int die) {
p.setTo(p.position.stepTimes(p.owner, die));
}
}

class Field {
Field stepTimes(Player p, int die) {
return next != null ? die > 0 ? next.stepTimes(p, die - 1) : this : null;
}
}

class Piece {
void setTo(Field f) {
if (position != null) position.piece = null;
if (f != null) {
if (f.piece != null) p.setTo(null);
f.pice = this;
}
position = f;
}
}

usw.
--
Stefan Matthias Aust // Ergo bibamus, ne sitiamus, vas repleamus!
Frank Buss
2005-10-15 12:32:57 UTC
Permalink
Post by Stefan Matthias Aust
class Player {
Piece[] pieces;
Field entry;
}
class Field {
Field next;
Piece piece;
}
class JunctionField extends Field {
Player owner;
Field exit;
}
class Piece {
Player owner;
Field position;
}
Warum die doppelten Verkettungen zwischen Piece und Field? Das Feld ist
klein genug, daß man da jeweils komplett durchgehen kann. Unten ein leicht
geänderter Entwurf. Statt Vererbung habe ich den Typ eines Feldes per
Strategy-Pattern ausgelagert (was für die meisten Felder sogar dasselbe
Objekt sein kann). Dadurch ist es flexibler, wenn man vielleicht mal den
Typ zur Laufzeit ändern möchte, da man dann nicht die Verkettungen anpassen
braucht. Man könnte auch für komplexere Spiele für verschiedene Aspekte
mehrere Typ-Felder verwenden, z.B. MovePolicyType, Building, Resources, was
bei Java mangels Mehrfachvererbung anders nur schwer möglich wäre.

Fürs GUI später wäre es wahrscheinlich noch sinnvoll, wenn man auch die
Depot-Felder, bei denen am Anfang die 4 Steine stehen, genauso behandelt
wie die restlichen Felder und in einer Board-Klasse alle Anfangsfelder der,
beim klassischen Mensch-Ärgere-Dich-Nicht, 5 Feldgruppen vermerkt.


class Field {
Player piece;
Player owner;
Type type;
Field nextField;
}

class Player {
Field firstDepotField;
Field entryField;
}

class Type {
Field getNextField(Field parent, Player currentPlayer);
}

class JunctionType extends Type {
Field firstExitField;
Field getNextField(Field parent, Player currentPlayer);
}

class Board {
LinkedList<Field> fieldGroups;
}


Ich werde das noch bei Gelegenheit in Lisp implementieren, muß jetzt
erstmal an dem Lua Player Vortrag für Mittwoch auf der EuroOSCON
weiterarbeiten und OpenGL einbauen:

http://conferences.oreillynet.com/cs/eurooscon/view/e_sess/7661
--
Frank Buß, ***@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Stefan Matthias Aust
2005-10-15 13:09:34 UTC
Permalink
Post by Frank Buss
Warum die doppelten Verkettungen zwischen Piece und Field?
Das erschien mir die einfachste Lösung als mir auffiel, dass ich sowohl
von einem Feld die Figur als auch von einer Figur ihr Feld wissen wollte.

Meine Klassendefinition möchte ich als eine Art textuelles UML
verstanden wissen und damit möchte ich einzig die Relationen zwischen
den Objekten bezeichnen.
Post by Frank Buss
Das Feld ist
klein genug, daß man da jeweils komplett durchgehen kann.
Das ist IMHO eine Optimierung, die man machen kann, oder auch nicht.
Entscheidend ist, dass Feld und Figur in einer Relation zueinander
stehen und sich gegenseitig kennen.
Post by Frank Buss
Statt Vererbung habe ich den Typ eines Feldes per
Strategy-Pattern ausgelagert (was für die meisten Felder sogar dasselbe
Objekt sein kann)
Empfinde ich als "over engineered". So böse ist Vererbung nun auch
nicht, dass man sie hier nicht für ein spezielles Feld - eben eines, bei
dem die Figuren eines bestimmten Spielers abzweigen und die anderen
Figuren vorbeilaufen - definieren könnte.
Post by Frank Buss
Dadurch ist es flexibler, wenn man vielleicht mal den
Typ zur Laufzeit ändern möchte, da man dann nicht die Verkettungen anpassen
braucht.
YAGNI
Post by Frank Buss
Fürs GUI später wäre es wahrscheinlich noch sinnvoll, wenn man auch die
Depot-Felder, bei denen am Anfang die 4 Steine stehen, genauso behandelt
Hatte ich auch kurz drüber nachgedacht, fand aber keinen Grund dafür.
Im reinen Modell reicht es mir, wenn ein Spieler die Figuren kennt.
Figuren, die nicht auf dem Feld (dem "Ring") stehen, müssen offenbar im
Depot sein.
Post by Frank Buss
class Field {
Player piece;
Du meinst hier "Piece piece", oder?
Post by Frank Buss
Player owner;
Warum hat jedes Feld einen Owner bei dir? Das Feld (ich meine, den
"member") ist doch dann fast immer "null", da fast alle - bis auf 4 -
Felder besitzerlos sind.
Post by Frank Buss
Type type;
Field nextField;
}
class Player {
Field firstDepotField;
Field entryField;
Ich mag ja keine Redundanzen in den Namen... Du machst doch aus einem

String name

auch kein

String nameString

warum also

Field firstDepotField
Field entryField

statt einfach

Field depot
Field entry
Post by Frank Buss
class Type {
Field getNextField(Field parent, Player currentPlayer);
}
Und die Felder stehen - wenn ich noch weiter kritisieren darf - nicht in
einer parent-child-relation, sodass ich hier previous (als Gegenstück
zum "next") oder "predecessor" benutzen würde, auch wenn parent laut
dict.leo.org ebenfalls Vorgänger und nicht nur Elt (Singular von Eltern)
heißt.
Post by Frank Buss
class Board {
LinkedList<Field> fieldGroups;
}
Wozu brauchst du dies? ich hatte da kurz drüber nachgedacht, dann aber
festgestellt, dass es reicht, die Spieler zu kennen, die ja dann die
Felder referenzieren. Eine extra Liste aller Felder sah ich nicht als
notwendig an.
Post by Frank Buss
Ich werde das noch bei Gelegenheit in Lisp implementieren, muß jetzt
erstmal an dem Lua Player Vortrag für Mittwoch auf der EuroOSCON
http://conferences.oreillynet.com/cs/eurooscon/view/e_sess/7661
Völlig OT:

Ist es nicht so, dass Sony eigentlich gar keine andere Software auf der
PSP haben will, und nur "dank" Fehlern in der Betriebssystemsoftware es
überhaupt möglich ist, da eigene Anwendungen einzuschummeln - gerade mal
so lange wie Sony braucht, eine neue Firmware-Version zu releasen, die
dann diese Lücke schließt?

Sollte das stimmen, würde ich ja auch nicht noch Sony indirekt
unterstützen, indem ich deren Hardware "cooler" mache, sondern ihnen
etwas sagen, das ich hier nicht aufschreiben möchte und mir ein Ziel
suchen, wo die Arbeit der Community auch honoriert wird.

Ansonsten aber viel Erfolg beim Vortrag :)


Und warum eigentlich kein Java? Die PSP-Hardware ist doch im Bereich
der üblichen Handys, deren J2ME-Interpreter auch spieletauglich sind.
--
Stefan Matthias Aust // Ergo bibamus, ne sitiamus, vas repleamus!
Frank Buss
2005-10-15 21:18:22 UTC
Permalink
Post by Stefan Matthias Aust
Das erschien mir die einfachste Lösung als mir auffiel, dass ich sowohl
von einem Feld die Figur als auch von einer Figur ihr Feld wissen wollte.
Meine Klassendefinition möchte ich als eine Art textuelles UML
verstanden wissen und damit möchte ich einzig die Relationen zwischen
den Objekten bezeichnen.
ja, dann ist das ok, denn das bedeutet ja, daß du es nicht unbedingt auch
doppelt speichern willst, da man die eine oder andere Stelle gerne vergisst
upzudaten, wenn etwas redundant ist.
Post by Stefan Matthias Aust
Empfinde ich als "over engineered". So böse ist Vererbung nun auch
nicht, dass man sie hier nicht für ein spezielles Feld - eben eines, bei
dem die Figuren eines bestimmten Spielers abzweigen und die anderen
Figuren vorbeilaufen - definieren könnte.
YAGNI
vielleicht hast du recht. Nach der reinen XP-Lehre müsste man sowieso erst
die JUnit-Testfälle schreiben und es käme dann mit Sicherheit noch eine
ganz andere Lösung dabei heraus :-)
Post by Stefan Matthias Aust
Post by Frank Buss
Fürs GUI später wäre es wahrscheinlich noch sinnvoll, wenn man auch die
Depot-Felder, bei denen am Anfang die 4 Steine stehen, genauso behandelt
Hatte ich auch kurz drüber nachgedacht, fand aber keinen Grund dafür.
Im reinen Modell reicht es mir, wenn ein Spieler die Figuren kennt.
Figuren, die nicht auf dem Feld (dem "Ring") stehen, müssen offenbar im
Depot sein.
ich hatte überlegt, eine 1-1 Beziehung zwischen der logischen Field-Klasse
und der GUI-Field-Klasse aufzubauen, das würde das ganze wahrscheinlich
vereinheitlichen, da man dann keinen besonderen Code für die Figuren im
Depot zu schreiben braucht.
Post by Stefan Matthias Aust
Post by Frank Buss
class Field {
Player piece;
Du meinst hier "Piece piece", oder?
nö, mein Gedanke war dabei, daß überall dort, wo das piece-Feld den Wert
des jeweiligen Player-Objekts hat, auch ein Stein dieses Players implizit
steht :-)
Post by Stefan Matthias Aust
Post by Frank Buss
Player owner;
Warum hat jedes Feld einen Owner bei dir? Das Feld (ich meine, den
"member") ist doch dann fast immer "null", da fast alle - bis auf 4 -
Felder besitzerlos sind.
im allgemeinen gebe ich dir recht, aber mit dem Type-Konzept...
Post by Stefan Matthias Aust
Post by Frank Buss
class Type {
Field getNextField(Field parent, Player currentPlayer);
}
Und die Felder stehen - wenn ich noch weiter kritisieren darf - nicht in
einer parent-child-relation, sodass ich hier previous (als Gegenstück
zum "next") oder "predecessor" benutzen würde, auch wenn parent laut
dict.leo.org ebenfalls Vorgänger und nicht nur Elt (Singular von Eltern)
heißt.
... sieht das anders aus. Mit "parent" meinte ich hier den Container, der
das jeweilige Type-Objekt beinhaltet und dachte, mir analog zur
GUI-Programmierung, nenne ich das parent. Jedes Feld hat ein Type-Objekt,
wobei sich aber mehrere Felder dasselbe Type-Objekt teilen können. Wenn
dann z.B. getNextField vom Type-Objekt aufgerufen wird, dann kann das den
jeweils aktuellen Container nach Zusatzinformation befragen, daher die
Bezeichnung "parent". Je nach Typ muß aber auch der owner abgefragt werden.
Der JunctionType z.B. würde den parent nach dem owner und dem currentPlayer
befragen und entsprechend die eine oder andere Abzweigung wählen. Gerade
beim JunctionType lohnt sich das allerdings nicht, da man den Typ nur dort
zu speichern braucht, war also wieder mal YAGNI, für zukünftige Spiele :-)
Post by Stefan Matthias Aust
Post by Frank Buss
class Board {
LinkedList<Field> fieldGroups;
}
Wozu brauchst du dies? ich hatte da kurz drüber nachgedacht, dann aber
festgestellt, dass es reicht, die Spieler zu kennen, die ja dann die
Felder referenzieren. Eine extra Liste aller Felder sah ich nicht als
notwendig an.
wieder YAGNI, da es Spiele geben könnte, bei denen es auch andere isolierte
Gruppen gibt, zu denen man beamen kann und die sonst keine direkte
Verbindung zu den Spielern oder anderen Feldern haben.
Post by Stefan Matthias Aust
Ist es nicht so, dass Sony eigentlich gar keine andere Software auf der
PSP haben will, und nur "dank" Fehlern in der Betriebssystemsoftware es
überhaupt möglich ist, da eigene Anwendungen einzuschummeln - gerade mal
so lange wie Sony braucht, eine neue Firmware-Version zu releasen, die
dann diese Lücke schließt?
Sony interessiert es nicht, wenn andere Software auf der PSP als die
offizielle läuft, solange es nicht den Umsatz mit Spielen schmälert (also
keine Programme, mit denen man illegal beschaffte UMD-Images vom Memory
Stick starten kann). Schon zu PS2- und PS1-Zeiten verkaufte Sony sogar ein,
im Vergleich zu dem professionellen Entwicklerpaket, recht preiswertes
Linux-Kit, um eigene Programme darauf zu entwickeln (um die 200 Euro).
Post by Stefan Matthias Aust
Sollte das stimmen, würde ich ja auch nicht noch Sony indirekt
unterstützen, indem ich deren Hardware "cooler" mache, sondern ihnen
etwas sagen, das ich hier nicht aufschreiben möchte und mir ein Ziel
suchen, wo die Arbeit der Community auch honoriert wird.
ich entwickle auf der PSP nur hobbymäßig und weil es Spaß macht, da die
Hardware eben einfach cool ist. Was irgendeine Community daraus dann macht,
ist zwar schön, aber interessiert mich nicht hauptsächlich.
Post by Stefan Matthias Aust
Ansonsten aber viel Erfolg beim Vortrag :)
danke. Ist jetzt fast fertig, der andere Redner verschönert die Folien noch
etwas, da er den Hauptteil vorträgt. Ich werde in der 2. Hälfte des
Vortages eine Live-Demonstration geben und 4-Gewinnt implementieren, da
müssten meine Sprachkenntnisse auch noch ausreichen, da es dabei
hauptsächlich technisches Englisch ist.
Post by Stefan Matthias Aust
Und warum eigentlich kein Java? Die PSP-Hardware ist doch im Bereich
der üblichen Handys, deren J2ME-Interpreter auch spieletauglich sind.
die Hardware ist bedeutent besser, als die üblichen Handys. Da ich gerade
die Folie offen habe: zwei MIPS 4K CPU Kerne (mit speziellen
Vectorprozessor-Erweiterungen, die zur Zeit noch in der Homebrew-Szene per
Reverse-Engineering erforscht werden) mit bis zu 333 MHz taktbar (220 MHz
Default), ein zusätzlicher grafischer Coprozessor, der 33 Millionen flat
shaded polygone pro Sekunde und 664 Millionen Pixel pro Sekunde auf das
gestochen scharfe 480x272 Pixel TFT bringt und NURBS, Morphing etc. per
Hardware unterstützt, das ganze mit 32 MB Hauptspeicher, 2 MB embedded VRAM
und bis zu mehreren GB großen Memory Sticks, Wi-Fi, USB und seriellem Port
(mit etwas basteln: http://www.luaplayer.org/sio/readme.html ). Da könnte
man vielleicht auch eine Standard Java Distribution drauf portieren (32 MB
RAM könnte etwas knapp werden).
--
Frank Buß, ***@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Marian Aldenhövel
2005-10-16 03:16:46 UTC
Permalink
Hi,
Post by Frank Buss
zwei MIPS 4K CPU Kerne (mit speziellen
Vectorprozessor-Erweiterungen, die zur Zeit noch in der Homebrew-Szene per
Reverse-Engineering erforscht werden) mit bis zu 333 MHz taktbar (220 MHz
Default), ein zusätzlicher grafischer Coprozessor, der 33 Millionen flat
shaded polygone pro Sekunde und 664 Millionen Pixel pro Sekunde auf das
gestochen scharfe 480x272 Pixel TFT bringt und NURBS, Morphing etc. per
Hardware unterstützt, das ganze mit 32 MB Hauptspeicher, 2 MB embedded VRAM
und bis zu mehreren GB großen Memory Sticks, Wi-Fi, USB und seriellem Port
Na, das ist ja eher am unteren Rande dessen, was man für ein anständiges
4-Gewinnt braucht :-).

Ciao, MM
--
Marian Aldenhövel, Rosenhain 23, 53123 Bonn. +49 228 624013.
http://www.marian-aldenhoevel.de
"And starting today all passwords must contain letters, numbers,
doodles, sign language and squirrel noises." http://tinyurl.com/csu7p
Ferenc Hechler
2005-10-15 16:17:04 UTC
Permalink
Post by Stefan Matthias Aust
Post by Michael Metol
Gibt es eine allgemeine Technik, wie man Brettspiele programmiert?
- Zahl würfeln
- prüfen, ob eine figur herausgesetzt werden kann
- figur raussetzen
- prüfen, ob eine figur ziehen kann
- ausgewählte figur ziehen
Abgesehen von der Frage zu den Datenstrukturen dürfte für Dich der Begriff
Spieltheorie interessant sein.
Jedes 2-Personen Spiel lässt sich anhand eines Spielbaumes analysieren der
wie folgt aufgebaut ist:

Ganz oben als Wurzelknoten steht die aktuelle Spielsituation.
Als Kinder-Knoten folgen alle Spielsituationen nach einem Zug von Weiss (1
Halbzug), darunter alle Spielsituationen nach einem Zug von Schwarz (2
Halbzüge), darunter wieder alle Gegenzüge von Weiss (3 Halbzüge), ... usw.
usf...

Der Baum kann je nach Spiel endlich oder aber auch unendlich sein.
Ein Spiel wie Tic-Tac-Toe ist auf alle Fälle endlich, da es nach maximal 9
Halbzügen beendet ist.

Ist der gesamte Spielbaum bekannt, so ist entscheidbar, welcher Zug der
beste ist:
Bewerte alle Blätter im Baum wie folgt:

Gewinnsituationen mit +100
Verlustsituationen mit -100
Unentschieden mit 0.

Nun wird davon ausgegangen, dass Weiss (eigener Zug) immer den besten Zug
auswählt (Maximum der Kinderknoten) und Schwarz (gegnerischer Zug) immer den
für Weiss schlechtesten Zug auswählt (Minimum der Kinderknoten). Dabei wird
dann vom Mini-Max-Algorithmus geredet.

Das Problem ist nun, dass der Suchbaum mit der Anzahl der Halbzüge
exponentiell wächst und somit sehr schnell riesig wird. Daher wird bei den
meisten Spielen nicht der gesamte Spielbaum durchsucht, sondern nach
gewissen Heuristiken nur die aussichtsreichsten Kandidaten tiefer
untersucht. Und statt der absoluten Bewertung (Gewinn / Verlust /
Unentschieden) werden Spielstellungen gewichtet.

Links zum Thema:

Spieltheorie:
http://www.kbs.uni-hannover.de/Lehre/KI2/Presentationen/presentation9798/esprit/spieltheorie/spieltheorie.html

Erklärung mit Implementierung eines Schachprogrammes in Java:
http://www.trinimon.de/Chess/ChessGame/Develop/chs_dvlp.htm


Viele Grüße,

feri
Stefan Matthias Aust
2005-10-16 10:13:00 UTC
Permalink
Post by Ferenc Hechler
Abgesehen von der Frage zu den Datenstrukturen dürfte für Dich der Begriff
Spieltheorie interessant sein.
Für mich? Warum? Oder meintest du den OP? Niemand hat doch davon
gesprochen, einen Gewinnalgorithmus zu finden. Mir ging es darum,
Spielstand und Regeln objektorientiert zu modellieren.
Post by Ferenc Hechler
Das Problem ist nun, dass der Suchbaum mit der Anzahl der Halbzüge
exponentiell wächst und somit sehr schnell riesig wird.
Bei MÄDN hast du aber nur maximal 4 mögliche Spielzüge - jeweils eine
der Figuren bewegen. Desweiteren ist zu bedenken, dass du für alle 6
möglichen Würfelergebnisse planen musst.
--
Stefan Matthias Aust // Ergo bibamus, ne sitiamus, vas repleamus!
Thomas G. Meyer
2005-10-15 09:32:35 UTC
Permalink
Post by Michael Metol
Hallo!
Gibt es eine allgemeine Technik, wie man Brettspiele programmiert?
Welche Datenstrukturen verwendet (2D Arrays) man da in der Regel?
Danke für eure Antworten.
Michael Metol
Es kommt auf das zu programmierende Brettspiel darauf an. Wenn du z.B. ein
Schachprogramm entwickeln möchtest, arbeitest du z.B. mit zwei
Datenstrukturen: einem 2D - Array, in dem die Schachfiguren gespeichert sind
und einem Baum indem die Züge berechnet werden. Ggf. auch noch einer
Hashtable (aber letzt genanntes ist nur bei anspruchsvollen Schachprogrammen
gang und gebe). Hierzu gibt es aber etlich Abhandlungen in Büchern. Ich habe
ein etwas Anspruchsvollers Programm damals auf dem C64 programmiert und zu
dem Zeitpunkt gab es schon ein sehr gutes, englischsprachiges Buch aus dem
Springer - Verlag. Der Titel fällt mir im Augenblick allerdings nicht mehr
ein. (aber dazu schaust du am besten mal bei Amazon rein, evtl. gibt es
dieses Buch ja noch).

Willst du hingegen nur ein einfaches "Schiffe versenken" - Spiel schreiben
reicht dir im einfachsten Fall ein 2D-Array.

Tom
Stefan Matthias Aust
2005-10-15 11:09:46 UTC
Permalink
Post by Thomas G. Meyer
Willst du hingegen nur ein einfaches "Schiffe versenken" - Spiel schreiben
reicht dir im einfachsten Fall ein 2D-Array.
Wer in einer Java-Gruppe nach Tipps zum "Brettspiele Programmieren"
erfragt, dem unterstelle ich, das er an einer objektorientierten Lösung
interessiert ist. "2D-Array" ist jedoch keine OO-Lösung.
--
Stefan Matthias Aust // Ergo bibamus, ne sitiamus, vas repleamus!
Thomas G. Meyer
2005-10-15 12:06:12 UTC
Permalink
Post by Stefan Matthias Aust
Post by Thomas G. Meyer
Willst du hingegen nur ein einfaches "Schiffe versenken" - Spiel
schreiben reicht dir im einfachsten Fall ein 2D-Array.
Wer in einer Java-Gruppe nach Tipps zum "Brettspiele Programmieren"
erfragt, dem unterstelle ich, das er an einer objektorientierten Lösung
interessiert ist. "2D-Array" ist jedoch keine OO-Lösung.
--
Stefan Matthias Aust // Ergo bibamus, ne sitiamus, vas repleamus!
Hallo Stefan,

1. hat der gute Michael kein Wort über eine OO-Lösung gesagt, sondern ich
zitiere "Welche Datenstrukturen verwendet (2D Arrays) man da in der Regel?"

2. so wie du es schreibst zählt also die Klasse Vector bei dir nicht zum
Java - Wortschatz (Da stellt sich für mich ernsthaft die Frage wie du so
manche Algorithmen darstellen möchtest ?:-). Aber vielleicht hast du ja
eine Methode, die mir als unwissendem bis jetzt verschlossen geblieben ist.
Klär mich doch bitte auf.).

Gruss
Tom
Stefan Matthias Aust
2005-10-15 12:47:31 UTC
Permalink
Post by Thomas G. Meyer
Post by Stefan Matthias Aust
Wer in einer Java-Gruppe nach Tipps zum "Brettspiele Programmieren"
erfragt, dem unterstelle ich, das er an einer objektorientierten Lösung
interessiert ist. "2D-Array" ist jedoch keine OO-Lösung.
1. hat der gute Michael kein Wort über eine OO-Lösung gesagt, sondern ich
zitiere "Welche Datenstrukturen verwendet (2D Arrays) man da in der Regel?"
Das ist mir bewusst und du kannst in meiner Antwort ja die
"Unterstellung" auch lesen. Ich finde die Frage nach einer
Datenstruktur bereits falsch oder zumindest irreführend.

Eine angemessene Datenstruktur wären Objekte, aber diese Antwort ist
natürlich in dieser Allgemeinheit sinnlos.
Post by Thomas G. Meyer
2. so wie du es schreibst zählt also die Klasse Vector bei dir nicht zum
Java - Wortschatz (Da stellt sich für mich ernsthaft die Frage wie du so
manche Algorithmen darstellen möchtest ?:-). Aber vielleicht hast du ja
eine Methode, die mir als unwissendem bis jetzt verschlossen geblieben ist.
Klär mich doch bitte auf.).
Ein Vector ist (wie ein 2D Array, was man in Java vielleicht als natives
Array von nativen Arrays von was-auch-immer-für-einem-Typ realisieren
könnte) für mich eine technische Hilfe, Relationen auszudrücken, also
ein notwendiger aber nicht ausreichender Baustein für ein Objektmodell.

Oder anders ausgedrückt: Ein Vector ist bedeutungslos (im eigentlichen
Wortsinn). Was man vielleicht ausdrücken möchte, ist dass ein Spieler
ein oder mehrere Spielfiguren "kennt". Dies kann man mit Hilfe eines
Vectors ausdrücken.

Trotzdem würde ich jetzt nicht sagen, eine gute Datenstruktur Spiele
sind Vektoren. Ich würde das Wörtchen "Datenstruktur" gerne komplett
vermeiden, da es IMHO in die rein prozedurale Programmierung gehört.
Besser wäre schon "abstrakter Datentyp", der eine Struktur mit ihrem
Verhalten zusammenfasst, also durch eine OO-Brille gesehen weitestgehend
(es fehlt die Identität) einem Objekt entsprechen würde.

Daher habe ich in meiner Antwort versucht, lieber ein exemplarisches
Objektmodell zu präsentieren - etwas ad hoc und mit der Abkürzung,
einfach native Arrays hinzuschreiben, um Relationen anzudeuten, aber
immerhin eine Lösung, die extra ohne ein 2D-Array auskommt.
--
Stefan Matthias Aust // Ergo bibamus, ne sitiamus, vas repleamus!
Thomas G. Meyer
2005-10-15 13:38:47 UTC
Permalink
"Stefan Matthias Aust" <***@3plus4.de> schrieb im Newsbeitrag news:diqtp3$rdb$***@online.de...
----- Original Message -----
From: "Stefan Matthias Aust" <***@3plus4.de>
Newsgroups: de.comp.lang.java
Sent: Saturday, October 15, 2005 2:47 PM
Subject: Re: Brettspiele Programmieren
Post by Thomas G. Meyer
Post by Stefan Matthias Aust
Wer in einer Java-Gruppe nach Tipps zum "Brettspiele Programmieren"
erfragt, dem unterstelle ich, das er an einer objektorientierten Lösung
interessiert ist. "2D-Array" ist jedoch keine OO-Lösung.
1. hat der gute Michael kein Wort über eine OO-Lösung gesagt, sondern ich
zitiere "Welche Datenstrukturen verwendet (2D Arrays) man da in der Regel?"
Das ist mir bewusst und du kannst in meiner Antwort ja die "Unterstellung"
auch lesen. Ich finde die Frage nach einer Datenstruktur bereits falsch
oder zumindest irreführend.
Dieses möchte ich so nicht stehen lassen, denn denke z.B. wie bereits
erwähnt einmal an Schach. Du könntest natürlich die KI statt auf einem Baum
bzw. Hashtable auf einem Array abbilden. Allerdings wäre dieses dann ein
ziemlich dümmliches Schach, da die Berechnungsgeschwindigkeit dem
entsprechend singen würde.
Eine angemessene Datenstruktur wären Objekte, aber diese Antwort ist
natürlich in dieser Allgemeinheit sinnlos.
Unter Objekte verstehe ich etwas anderes: Objekte = Klassenbeschreibungen
mit n Elementen und n Methoden. Während eine Datenstruktur rein aus n
Elementen besteht.
Ein Vector ist (wie ein 2D Array, was man in Java vielleicht als natives
Array von nativen Arrays von was-auch-immer-für-einem-Typ realisieren
könnte) für mich eine technische Hilfe, Relationen auszudrücken, also ein
notwendiger aber nicht ausreichender Baustein für ein Objektmodell.
Oder anders ausgedrückt: Ein Vector ist bedeutungslos (im eigentlichen
Wortsinn). Was man vielleicht ausdrücken möchte, ist dass ein Spieler ein
oder mehrere Spielfiguren "kennt". Dies kann man mit Hilfe eines Vectors
ausdrücken.
Hier gebe ich dir recht.
Trotzdem würde ich jetzt nicht sagen, eine gute Datenstruktur Spiele sind
Vektoren. Ich würde das Wörtchen "Datenstruktur" gerne komplett
Dieses habe ich auch nie behauptet.
vermeiden, da es IMHO in die rein prozedurale Programmierung gehört.
"rein prozedurale Programmierung gehört" gehört ist wohl etwas falsch. Denn
was währen Objekte ohne Datenstrukturen? Richtig eine Ansammlung von
Funktionen in einem nicht definierten Pool. Ich gebe dir insofern recht das
Datenstrukturen ursprünglich aus der prozeduralen Programmierung kommen.
Besser wäre schon "abstrakter Datentyp", der eine Struktur mit ihrem
Verhalten zusammenfasst, also durch eine OO-Brille gesehen weitestgehend
(es fehlt die Identität) einem Objekt entsprechen würde.
Daher habe ich in meiner Antwort versucht, lieber ein exemplarisches
Objektmodell zu präsentieren - etwas ad hoc und mit der Abkürzung, einfach
native Arrays hinzuschreiben, um Relationen anzudeuten, aber immerhin eine
Lösung, die extra ohne ein 2D-Array auskommt.
ohne 2D-Array, aber mit einem n-Array. ;-)

Tom
--
Stefan Matthias Aust // Ergo bibamus, ne sitiamus, vas repleamus!
Stefan Matthias Aust
2005-10-16 10:27:08 UTC
Permalink
Post by Thomas G. Meyer
Post by Stefan Matthias Aust
Eine angemessene Datenstruktur wären Objekte, aber diese Antwort ist
natürlich in dieser Allgemeinheit sinnlos.
Unter Objekte verstehe ich etwas anderes: Objekte = Klassenbeschreibungen
mit n Elementen und n Methoden. Während eine Datenstruktur rein aus n
Elementen besteht.
Meine Definition: Objekt = Ding (Sache, Konzept, Idee) mit Identität,
Zustand und Verhalten.

Ein Objekt kann eine Datenstruktur sein, aber eine Datenstruktur ist
kein Objekt.

Noch mehr ad-hoc-Definitionen (die ich dann wieder von Paul oder Stefan
um die Ohren geschlagen bekomme): Typ = Menge von Dingen. Datentyp =
Menge von Datenstrukturen. Abstrakter Datentyp (ADT) = Datentyp +
abstraktes Verhalten. Objekt = Zustand + konkretes Verhalten. Konkretes
Verhalten = Methoden.

Oder in Bezug auf Java: ADT entspricht Interface-Definition (mit
(in)formaler Beschreibung der Methoden), Objekttyp (aka KlassenTyp)
entspricht Klassendefinition. Schlussfolgerung: Man kann aus jedem
Objekttyp einen ADT ziehen.
Post by Thomas G. Meyer
Post by Stefan Matthias Aust
Trotzdem würde ich jetzt nicht sagen, eine gute Datenstruktur Spiele sind
Vektoren. Ich würde das Wörtchen "Datenstruktur" gerne komplett
Dieses habe ich auch nie behauptet.
Und das habe ich nie behauptet ;)
Post by Thomas G. Meyer
Post by Stefan Matthias Aust
vermeiden, da es IMHO in die rein prozedurale Programmierung gehört.
"rein prozedurale Programmierung gehört" gehört ist wohl etwas falsch. Denn
was währen Objekte ohne Datenstrukturen?
Dinge mit Identität, Zustand und Verhalten.
Post by Thomas G. Meyer
Richtig eine Ansammlung von
Funktionen in einem nicht definierten Pool.
Falsch. Funktionen würde ich (da oben nicht definiert) möglichst hier
raushalten, schließlich reden wir hier von prozeduraler Programmierung
und da gibt es dann bitte nur Prozeduren (definiert als
Anweisungsfolgen). Ein Zustand ist allgemeiner als ein veränderlicher
"Record" a la Pascal. Dies ist nur eine mögliche Implementierung für
einen Objektzustand.

Objekte lassen sich auch funktional implementieren und dort könnte man
Objektzustände durch Programmzustände - aber nicht durch veränderliche
Datenstrukturen - realisieren.

Und der Pool ist natürlich sehr wohl definiert, denn wenn die Objekte
Exemplare einer Klasse sind, definiert diese Klasse dadurch einen Typ.
Post by Thomas G. Meyer
Ich gebe dir insofern recht das
Datenstrukturen ursprünglich aus der prozeduralen Programmierung kommen.
Ich glaube, wir meinen auch das selbe, klauben aber hier nur Worte.
Post by Thomas G. Meyer
Post by Stefan Matthias Aust
native Arrays hinzuschreiben, um Relationen anzudeuten, aber immerhin eine
Lösung, die extra ohne ein 2D-Array auskommt.
ohne 2D-Array, aber mit einem n-Array. ;-)
Nein, mein Datentyp im Beispiel war der einer verketteten Liste :)
--
Stefan Matthias Aust // Ergo bibamus, ne sitiamus, vas repleamus!
Stefan Ram
2005-10-16 13:44:20 UTC
Permalink
Post by Stefan Matthias Aust
Meine Definition: Objekt = Ding (Sache, Konzept, Idee) mit Identität,
Zustand und Verhalten.
(Alles folgende, auch die Definitionen, ist nur meine
persönliche Meinung.)

Das kommt auf den Zusammenhang an. In meiner Philosophie
bezeichne ich als ein "Objekt" das, wovon mit einer Sprache
gesprochen werden kann. Also das, was Nominalphrasen im
Deutschen und Terme in der Mathematik und Ausdrücke in
Programmen bezeichnen.

Ein Objekt der objektorientierten Programmierung ist für mich
ein Dienst, der Schnittstellen (abstrakte Typen)
implementiert, indem er auf Nachrichten mit Verhalten
reagiert.
Post by Stefan Matthias Aust
Noch mehr ad-hoc-Definitionen (die ich dann wieder von Paul
ad-hoc ist doch besser als ad-hominem!
Post by Stefan Matthias Aust
Typ = Menge von Dingen.
In meinem Begriff eines primitiven Typen sehen ich zwei
Unterschiede zu einer bloßen Menge:

- Es muß immer mindestens eine Funktion geben, die auf
eine Speicherdarstellung (Bitmuster) abbildet. Die
"gleiche Wertemenge" mit einer anderen Speicherdarstellung
ist ein anderer primitiver Datentyp (z.B. 0..255 mit
dem üblichen binärem Code oder dem Gray-Code).

- Nach Deiner Definition könnte ein Wert in verschiedenen
Typen liegen, die nicht in der Teilmengenbeziehung
(Obertyp-Untertyp) zueinander stehen. Ignoriert man
Obertypen, so ist aber tatsächlich jedem primitiven Wert
stets genau ein primitiver Typ zu geordnet (eine
ganzzahliger primitiver Wert hat in Java den Typ int,
long, byte oder so etwas, aber nie zwei davon als Typ,
sondern immer genau einen Typ).

Das Universum aller primitiver Werte muß sozusagen
/disjunkt/ in primitive Typen zerlegt werden können -
bzw. es ist deren /disjunkte/ Vereinigung.

Ein primitiver Wert ist bestimmt durch seinen primitiven
Typ und (meistens) ein weitere Spezifikation des Wertes.

So entspricht der deutschsprachigen Nominalphrase "die
Zahl Eins" in Java kein bestimmter Wert, solange
nicht klar ist, welcher Typ (int, long, double, ...)
gewählt wird.
Post by Stefan Matthias Aust
Datentyp = Menge von Datenstrukturen.
Menge von Werten und die obigen Eigenschaften.
Post by Stefan Matthias Aust
Abstrakter Datentyp (ADT) = Datentyp + abstraktes Verhalten.
ADT = nur Verhalten (es bedarf keines weiteren Datentyps).
Post by Stefan Matthias Aust
Objekt = Zustand + konkretes Verhalten.
Von außen gesehen: nur konkretes Verhalten (das impliziert
dann ggf. einen Zustand, der deswegen nicht zusätzlich
genannt werden muß.)

Einen Zustand muß man separat erst betrachten, wenn man
hineinschaut und die Implementation betrachtet.
Post by Stefan Matthias Aust
Oder in Bezug auf Java: ADT entspricht Interface-Definition
(mit (in)formaler Beschreibung der Methoden),
Die Methoden bezeichne ich in diesem Fall als "Operationen".
Post by Stefan Matthias Aust
Objekte lassen sich auch funktional implementieren und dort
könnte man Objektzustände durch Programmzustände - aber nicht
durch veränderliche Datenstrukturen - realisieren.
Mit viel gutem Willen kann man in einem reinen funktionalen
Programm interpretieren, was Du mit einem "Programmzustand"
meinst.

Es gibt ja zur Beschreibung des Umgangs mit Zuständen
auch noch Monaden.
Thomas G. Meyer
2005-10-16 22:54:50 UTC
Permalink
Post by Stefan Matthias Aust
Meine Definition: Objekt = Ding (Sache, Konzept, Idee) mit Identität,
Zustand und Verhalten.
Fast richtig ausgedrückt: Ein Objekt ist in der objektorientieten
Programmierung ein konktrete Ausprägung einer Klasse (Exemplar / Instanz
einer Klasse). Das Objekt besitzt eine Identität, einen Zustand und
Verhalten. (in meinem vorherigen Aussage habe ich dieses nur etwas platter
ausgedrückt).
Post by Stefan Matthias Aust
Ein Objekt kann eine Datenstruktur sein, aber eine Datenstruktur ist kein
Objekt.
Richtig
Post by Stefan Matthias Aust
Noch mehr ad-hoc-Definitionen (die ich dann wieder von Paul oder Stefan um
die Ohren geschlagen bekomme): Typ = Menge von Dingen. Datentyp = Menge
von Datenstrukturen.
Das erkläre mir mal wie Datentyp eine Menge von Datenstrukturen sind? ?;-)

Bei mir sind Datentypen (ich drücke es jetzt fachmannisch aus, damit mir wir
auf dem gleichen Level sprechen ;-) ):
Datentyp bezeichnet nach meiner Definition: die Zusammenfassung eines
Wertebereichs mit den darauf definierten Operationen. Java z.B. bietet eine
Menge an vordefinierten Datentypen z.B. Ganz Zahlen (int, long, ...),
Fliesskommazahlen (float, double, ...) und Zeichen ( char ).
Post by Stefan Matthias Aust
Oder in Bezug auf Java: ADT entspricht Interface-Definition (mit
(in)formaler Beschreibung der Methoden), Objekttyp (aka KlassenTyp)
entspricht Klassendefinition. Schlussfolgerung: Man kann aus jedem
Objekttyp einen ADT ziehen.
Ich befürchte fast du wirfst hier einige Sachen völlig durcheinander oder
verstehe ich deine Aussage nicht?

ADT's: speziellen Datentypen, deren Operation genau spezifiziert sind, die
allerdings im Gegensatz zu den elementaren und zusammengesetztenn Datentypen
nicht an einen konkreten Wertebereich gebunden sind. So wie ich deine
Definition verstehe sagst du oben aber aus einen gDatentyp mit abstrakten
Verhalten?

Interface = Eine Schnittstelle, die keine Implementierung enthält, sondern
nur Namen und Signaturen der enthaltenenen Methoden. Oder anders
ausgedrückt: Ein Interface sind vollständig abstrakte Klassen.
Post by Stefan Matthias Aust
Post by Thomas G. Meyer
Richtig eine Ansammlung von
Funktionen in einem nicht definierten Pool.
Falsch. Funktionen würde ich (da oben nicht definiert) möglichst hier
raushalten, schließlich reden wir hier von prozeduraler Programmierung und
da gibt es dann bitte nur Prozeduren (definiert als Anweisungsfolgen).
Ein Zustand ist allgemeiner als ein veränderlicher
Falsch, wenn du schon in der OO-Sprache sprichst dann bitte schön Methoden.

In der Informatik (unabhängig von der Programmiersprache) spricht man von
Funktionen (nachzulesen in jedem Lexikon).
Funktion = eine Stück zusammengehörigender Code, der es erlaubt eine
bestimmte Aufgabe in wiederverwendbarer Art umzusetzen oder platt
ausgedrückt: Unterroutine eines Programms (private Anmerkung: resultierend
aus dem Mathmatischen => Hier sprichst du auch nicht von Prozeduren sondern
von Funktionen. Oder sagts du etwa ich benutze für z.B. Berechnung in der
Trigonometrie die Prozedure Sinus. Ich vermute eher du sagts: Ich benutze in
der Trigonomertrie die Funktion Sinus).
Du wirst wohl auch kaum ein Programmierhandbuch finden, indem von Prozeduren
die Rede ist (vorausgesetzt, die Programmiersprache unterscheidet nicht
explizit zwischen Prozeduren und Funktionen (z.B. Delphi))

Prozedure = eine Funktion ohne Rückgabeparameter. Einige Programmiersprachen
unterscheiden zwischen Funktionen und Prozeduren (z.B. Delphi).

Methode = Eine Funktion, die einer Klasse zugewiesen wird (unabhängig von
deren Sichtbarkeit).
Post by Stefan Matthias Aust
"Record" a la Pascal. Dies ist nur eine mögliche Implementierung für
einen Objektzustand.
Objekte lassen sich auch funktional implementieren und dort könnte man
Objektzustände durch Programmzustände - aber nicht durch veränderliche
Datenstrukturen - realisieren.
Und der Pool ist natürlich sehr wohl definiert, denn wenn die Objekte
Exemplare einer Klasse sind, definiert diese Klasse dadurch einen Typ.
Ja, hier gebe ich dir recht: Mein Aussage war aber auch nur ironisch
gemeint. Denn nach meinem privaten Verständnis für ein vollständiges Objekt
zählt: Identität, Zustand und Verhalten. Wenn eins dieser drei Dinge fehlt,
dann rede ich persönlich von einem Pool (Sorry hätte ich mich besser
ausdrücken müssen :-) ).
Post by Stefan Matthias Aust
Post by Thomas G. Meyer
Ich gebe dir insofern recht das
Datenstrukturen ursprünglich aus der prozeduralen Programmierung kommen.
Ich glaube, wir meinen auch das selbe, klauben aber hier nur Worte.
Naja, sagen wir mal wird sind auf dem besten Wege der Annährung. ;-)
Post by Stefan Matthias Aust
Post by Thomas G. Meyer
native Arrays hinzuschreiben, um Relationen anzudeuten, aber immerhin
eine Lösung, die extra ohne ein 2D-Array auskommt.
ohne 2D-Array, aber mit einem n-Array. ;-)
Nein, mein Datentyp im Beispiel war der einer verketteten Liste :)
Jupp, war auch nur ironisch gemeint. Deshalb = ;-)
Post by Stefan Matthias Aust
--
Stefan Matthias Aust // Ergo bibamus, ne sitiamus, vas repleamus!
Tom
Stefan Ram
2005-10-16 23:27:37 UTC
Permalink
Post by Thomas G. Meyer
Fast richtig ausgedrückt: Ein Objekt ist in der
objektorientieten Programmierung ein konktrete Ausprägung einer
Klasse (Exemplar / Instanz einer Klasse).
Nur, daß es auch objektorientierte Sprachen mit Objekten aber
ohne Klassen gibt. Es heißt ja auch nicht "klassenorientierte"
Programmierung. Objekte sind in der objektorientierten
Programmierung fundamental und bedürfen nicht der Klassen zu
ihrer Definition.
Post by Thomas G. Meyer
Datentyp bezeichnet nach meiner Definition: die Zusammenfassung
eines Wertebereichs mit den darauf definierten Operationen.
Allerdings würde dann die Definition einer weiteren Operation,
wie

int f( final int a, final int b ){ return ...; }

den Datentyp "int" verändern. (Gleichzeitig fehlt diesem
Begriff die wichtige Möglichkeit zur Angabe bzw. Erzeugung von
Werten durch Literale oder Exemplarerzeugungsausdrücke.)
Post by Thomas G. Meyer
In der Informatik (unabhängig von der Programmiersprache)
spricht man von Funktionen (nachzulesen in jedem Lexikon).
Funktion = eine Stück zusammengehörigender Code, der es erlaubt
eine bestimmte Aufgabe in wiederverwendbarer Art umzusetzen
oder platt ausgedrückt: Unterroutine eines Programms
Diese Begriffe sind nicht einheitlich so definiert.

Laien gehen immer wieder davon aus, daß Begriffe wie
"Algorithmus" oder "Programmiersprache" "in der Informatik" in
bestimmter Weise definiert seien, während man bei
eingehenderer Beschäftigung mit der Sache aber merkt, daß man
jeweils die Quelle oder den Autor angeben muß, dessen
Begriffsystem man verwendet.

Die international maßgebliche ISO 2382-15 definiert diesen
Begriff ("function") jedenfalls anders. Dort wird verlangt
"that produces a data value which it returns to the place of
the invocation."

Ansonsten ist eine "function" in C auch schon wieder etwas
anderes als eine "function" in Pascal.
Post by Thomas G. Meyer
Ich benutze in der Trigonomertrie die Funktion Sinus).
Der Funktionsbegriff in der Mathematik unterscheidet sich
wiederum von dem der Informatik. Allerdings ist er auch "in
der Mathematik" nicht einheitlich, doch sein Kern ist stets
die Vorstellung einer linkstotalen und rechtseindeutigen
Relation.

(In comp.lang.lisp schrieb ich in den letzten 20 Stunden
mehrfach darüber, daß der Funktionsbegriff der Informatik
teilweise mehr Ähnlichkeit mit dem Operationsbegriff in der
universellen Algebra hat.)
Thomas G. Meyer
2005-10-17 08:47:29 UTC
Permalink
----- Original Message -----
From: "Stefan Ram" <***@zedat.fu-berlin.de>
Newsgroups: de.comp.lang.java
Sent: Monday, October 17, 2005 1:27 AM
Subject: Re: Brettspiele Programmieren
Post by Stefan Ram
Post by Thomas G. Meyer
Fast richtig ausgedrückt: Ein Objekt ist in der
objektorientieten Programmierung ein konktrete Ausprägung einer
Klasse (Exemplar / Instanz einer Klasse).
Nur, daß es auch objektorientierte Sprachen mit Objekten aber
ohne Klassen gibt. Es heißt ja auch nicht "klassenorientierte"
Programmierung. Objekte sind in der objektorientierten
Programmierung fundamental und bedürfen nicht der Klassen zu
ihrer Definition.
s. hierzu meine Antwort an Peter
Post by Stefan Ram
Post by Thomas G. Meyer
In der Informatik (unabhängig von der Programmiersprache)
spricht man von Funktionen (nachzulesen in jedem Lexikon).
Funktion = eine Stück zusammengehörigender Code, der es erlaubt
eine bestimmte Aufgabe in wiederverwendbarer Art umzusetzen
oder platt ausgedrückt: Unterroutine eines Programms
Diese Begriffe sind nicht einheitlich so definiert.
Aha, wäre mir neu (Aber ich lasse mich gerne eines besseren belehren ;-) ).
Meines Wissens nach sind diese allgemein definiert. Dieses schreibst du doch
selbst (s. weiter unter). Dort beziehst du dich auf die Definition nach ISO.
Sonst würdest du dich ja hier mit dem weiter unten gesagten wiedersprechen.
;-)

Tom
Stefan Ram
2005-10-17 10:03:13 UTC
Permalink
Post by Thomas G. Meyer
Post by Stefan Ram
Diese Begriffe sind nicht einheitlich so definiert.
Aha, wäre mir neu (Aber ich lasse mich gerne eines besseren
belehren (...) ).
Meines Wissens nach sind diese allgemein definiert.
Welchem Werke soll man denn Deiner Meinung nach, die
"allgemeine Definition" dieser Begriffe "in der Informatik"
entnehmen?
Post by Thomas G. Meyer
Dieses schreibst du doch selbst (s. weiter unter). Dort
beziehst du dich auf die Definition nach ISO.
Eben: Ich gebe meine Quelle (ISO 2382-15) namentlich an und
beziehe mich nicht etwa auf die "allgemeine Definition in der
Informatik".
Thomas G. Meyer
2005-10-17 10:25:01 UTC
Permalink
----- Original Message -----
From: "Stefan Ram" <***@zedat.fu-berlin.de>
Newsgroups: de.comp.lang.java
Sent: Monday, October 17, 2005 12:03 PM
Subject: Re: Brettspiele Programmieren
Post by Stefan Ram
Post by Thomas G. Meyer
Post by Stefan Ram
Diese Begriffe sind nicht einheitlich so definiert.
Aha, wäre mir neu (Aber ich lasse mich gerne eines besseren
belehren (...) ).
Meines Wissens nach sind diese allgemein definiert.
Welchem Werke soll man denn Deiner Meinung nach, die
"allgemeine Definition" dieser Begriffe "in der Informatik"
entnehmen?
z.B. wie du schon richtig sagtest z.B. die ISO
Post by Stefan Ram
Post by Thomas G. Meyer
Dieses schreibst du doch selbst (s. weiter unter). Dort
beziehst du dich auf die Definition nach ISO.
Eben: Ich gebe meine Quelle (ISO 2382-15) namentlich an und
beziehe mich nicht etwa auf die "allgemeine Definition in der
Informatik".
Eben nicht: denn ich zitiere deine Aussage
Post by Stefan Ram
Post by Thomas G. Meyer
Post by Stefan Ram
"Diese Begriffe sind nicht einheitlich so definiert."
Die international maßgebliche ISO 2382-15 definiert diesen
Begriff ("function") jedenfalls anders. Dort wird verlangt
"that produces a data value which it returns to the place of
the invocation."
Dann wiedersprichst du dich ;-) ? Aber lassen wir das ich glaube das würde
hier nur in ein unendliches Gemetzel ausarten oder sollte ggf. in einem
Thread weitergeführt werden, da der letzte Verlauf völlig von der Frage im
Betreff abweicht.

Tom
Stefan Ram
2005-10-17 10:45:28 UTC
Permalink
Post by Thomas G. Meyer
Post by Stefan Ram
Welchem Werke soll man denn Deiner Meinung nach, die
"allgemeine Definition" dieser Begriffe "in der Informatik"
entnehmen?
z.B. wie du schon richtig sagtest z.B. die ISO
Die "ISO" ist kein Werk, sondern eine Organisation. Sie gibt
verschiedene Werke heraus, deren Begriffsdefinitionen
untereinander auch nicht alle übereinstimmen. Man muß
also jeweils angeben, auf welche ISO-Norm man sich bezieht.

Deine Verwendung von "z.B." an dieser Stelle zeigt
schon, daß man hier eben die Qual der Wahl zwischen
verschiedenen Quellen hat, deren keine "die Informatik"
darstellt und für sich in Anspruch nehmen kann, "die
allgemeine Definition eines Begriffs in der Informatik
wiederzugeben."

In wissenschaftlichen Arbeiten der Informatik werden
die ISO-Definitionen beispielsweise nur äußerst selten
herangezogen -- schon deshalb wäre es unverständlich,
wieso diese nun plötzlich "die allgemeine Definition
eines Begriffs in der Informatik" wiedergeben sollten.

Man lese nur einmal die Gedanken zur Klärung des Begriffs
"algorithm" in

http://www.engr.uconn.edu/~dqg/papers/myth.pdf

in Kapitel 3 ab Seite 4.
Post by Thomas G. Meyer
Eben nicht: denn ich zitiere deine Aussage
Post by Stefan Ram
Post by Stefan Ram
"Diese Begriffe sind nicht einheitlich so definiert."
Die international maßgebliche ISO 2382-15 definiert diesen
Begriff ("function") jedenfalls anders. Dort wird verlangt
"that produces a data value which it returns to the place of
the invocation."
Dann wiedersprichst du dich (...) ?
Ich weise darauf hin, daß es eine allgemeine Definition nicht
gibt, aber in einem bestimmten Werke eine bestimmte Definition
zu finden ist. Da gibt es also keinen Widerspruch.
Thomas G. Meyer
2005-10-17 11:22:41 UTC
Permalink
Post by Stefan Ram
Post by Thomas G. Meyer
Post by Stefan Ram
Welchem Werke soll man denn Deiner Meinung nach, die
"allgemeine Definition" dieser Begriffe "in der Informatik"
entnehmen?
z.B. wie du schon richtig sagtest z.B. die ISO
Die "ISO" ist kein Werk, sondern eine Organisation. Sie gibt
Sag an. Hätte ich jetzt von selbst nie gedacht. Aber sie hat etliche Werke
insbesondere in der Informatik beigetragen.
Post by Stefan Ram
verschiedene Werke heraus, deren Begriffsdefinitionen
untereinander auch nicht alle übereinstimmen. Man muß
also jeweils angeben, auf welche ISO-Norm man sich bezieht.
Das stimmt.
Post by Stefan Ram
Deine Verwendung von "z.B." an dieser Stelle zeigt
schon, daß man hier eben die Qual der Wahl zwischen
verschiedenen Quellen hat, deren keine "die Informatik"
darstellt und für sich in Anspruch nehmen kann, "die
allgemeine Definition eines Begriffs in der Informatik
wiederzugeben."
Naja wenn du meinst.
Post by Stefan Ram
In wissenschaftlichen Arbeiten der Informatik werden
die ISO-Definitionen beispielsweise nur äußerst selten
herangezogen -- schon deshalb wäre es unverständlich,
Das stimmt so leider nicht lieber Stefan, es kommt auf denn Zusammenhang
darauf an.
Post by Stefan Ram
wieso diese nun plötzlich "die allgemeine Definition
eines Begriffs in der Informatik" wiedergeben sollten.
Aha, also z.B. hältst du nichts von QM (ISO 9001) (um jetzt nur ein Beispiel
zu nennen).
Post by Stefan Ram
Man lese nur einmal die Gedanken zur Klärung des Begriffs
"algorithm" in
http://www.engr.uconn.edu/~dqg/papers/myth.pdf
Ich befürchte fast lieber Stefan, du wirfts mit irgendwelchen "aus dem Sinn"
zusammenhanglosen Links nur so um dich. Wieso kommst du jetzt auf aufeinmal
auf "algorithmen"?
Post by Stefan Ram
in Kapitel 3 ab Seite 4.
Post by Thomas G. Meyer
Eben nicht: denn ich zitiere deine Aussage
Post by Stefan Ram
Post by Stefan Ram
"Diese Begriffe sind nicht einheitlich so definiert."
Die international maßgebliche ISO 2382-15 definiert diesen
Begriff ("function") jedenfalls anders. Dort wird verlangt
"that produces a data value which it returns to the place of
the invocation."
Dann wiedersprichst du dich (...) ?
Ich weise darauf hin, daß es eine allgemeine Definition nicht
gibt, aber in einem bestimmten Werke eine bestimmte Definition
zu finden ist. Da gibt es also keinen Widerspruch.
Also schon wieder ein Wiederspruch. Zuerst sagts du der Begriff "Funktionen"
sei definiert. Dann wieder nicht. Dann doch, dann wieder nicht. Bleibe doch
einfach einmal bei einer klaren Linie und spring nicht immer so. Mir wird,
von deinen Wiedersprüchen ja schon ganz anders ;-). Ich hoffe du bist zu
deinen Schülern nicht auch so. Die armen Schüler! ;-)

Tom
Michael Rauscher
2005-10-17 11:57:42 UTC
Permalink
Post by Thomas G. Meyer
Also schon wieder ein Wiederspruch. Zuerst sagts du der Begriff "Funktionen"
sei definiert. Dann wieder nicht. Dann doch, dann wieder nicht. Bleibe doch
einfach einmal bei einer klaren Linie und spring nicht immer so. Mir wird,
Ich verstehe Dein Problem nicht. Dein "lieber Stefan" schreibt nichts
anderes, als dass es diverse Werke gibt, die den Begriff "Funktion" - in
jeweils verschiedener Fassung - definieren. Damit *ist* der Begriff
definiert. Weiter schreibt Stefan, dass es keine allgemein anerkannte
Definition des Begriffs gibt. Das ist kein Widerspruch sondern die
logische Konsequenz aus vorherigem.

Gruß
Michael
Wanja Gayk
2005-10-18 12:01:42 UTC
Permalink
Michael Rauscher said...
Post by Michael Rauscher
Post by Thomas G. Meyer
Also schon wieder ein Wiederspruch. Zuerst sagts du der Begriff "Funktionen"
sei definiert. Dann wieder nicht. Dann doch, dann wieder nicht. Bleibe doch
einfach einmal bei einer klaren Linie und spring nicht immer so. Mir wird,
Ich verstehe Dein Problem nicht. Dein "lieber Stefan" schreibt nichts
anderes, als dass es diverse Werke gibt, die den Begriff "Funktion" - in
jeweils verschiedener Fassung - definieren. Damit *ist* der Begriff
definiert.
Leute, geht einen Saufen - da habt ihr mehr von.

SCNR,
-Wanja-
--
"Gewisse Schriftsteller sagen von ihren Werken immer: 'Mein Buch, mein
Kommentar, meine Geschichte'. [..] Es wäre besser, wenn sie sagten:
'unser Buch, unser Kommentar, unsere Geschichte'; wenn man bedenkt, dass
das Gute darin mehr von anderen ist als von ihnen." [Blaise Pascal]
Michael Rauscher
2005-10-18 13:46:20 UTC
Permalink
Post by Wanja Gayk
Michael Rauscher said...
Post by Michael Rauscher
Post by Thomas G. Meyer
Also schon wieder ein Wiederspruch. Zuerst sagts du der Begriff "Funktionen"
sei definiert. Dann wieder nicht. Dann doch, dann wieder nicht. Bleibe doch
einfach einmal bei einer klaren Linie und spring nicht immer so. Mir wird,
Ich verstehe Dein Problem nicht. Dein "lieber Stefan" schreibt nichts
anderes, als dass es diverse Werke gibt, die den Begriff "Funktion" - in
jeweils verschiedener Fassung - definieren. Damit *ist* der Begriff
definiert.
Leute, geht einen Saufen - da habt ihr mehr von.
ROTFL. So direkt wollte ich es nicht schreiben :-)

Gruß
Michael
Patrick Roemer
2005-10-17 11:59:45 UTC
Permalink
Post by Thomas G. Meyer
Post by Stefan Ram
Post by Thomas G. Meyer
Eben nicht: denn ich zitiere deine Aussage
Post by Stefan Ram
"Diese Begriffe sind nicht einheitlich so definiert."
Die international maßgebliche ISO 2382-15 definiert diesen
Begriff ("function") jedenfalls anders. Dort wird verlangt
"that produces a data value which it returns to the place of
the invocation."
Dann wiedersprichst du dich (...) ?
Ich weise darauf hin, daß es eine allgemeine Definition nicht
gibt, aber in einem bestimmten Werke eine bestimmte Definition
zu finden ist. Da gibt es also keinen Widerspruch.
Also schon wieder ein Wiederspruch. Zuerst sagts du der Begriff "Funktionen"
sei definiert.
Wo hat er das gesagt? Wenn man nicht versucht, 'international
massgeblich' so zu interpretieren, was aber aus dem Kontext nicht viel
Sinn macht, habe ich nur gelesen, dass er gesagt hat, er sei nicht
einheitlich definiert. Und als Beispiel hat er konterkarierend zu Deiner
vorgeblich allgemeinen Definition (versehen mit der Quellenangabe 'in
jedem Lexikon') eine andere (aus mehreren moeglichen) inklusive
Quellenangabe zitiert, die im Gegensatz zu Deiner Version einen
Rueckgabewert zwingend erfordert.
Post by Thomas G. Meyer
Dann wieder nicht. Dann doch, dann wieder nicht. Bleibe doch
einfach einmal bei einer klaren Linie und spring nicht immer so. Mir wird,
von deinen Wiedersprüchen ja schon ganz anders ;-). Ich hoffe du bist zu
deinen Schülern nicht auch so. Die armen Schüler! ;-)
Der Widerspruch liegt doch jetzt eher in Deiner Spielfeldhaelfte:
Entweder gibt es eine einheitliche Definition, dann ist entweder die von
Dir vorgebrachte oder die von Stefan zitierte 'falsch' (oder beide) -
welche und warum? Oder es gibt eben keine.

Viele Gruesse,
Patrick
Stefan Ram
2005-10-17 12:16:51 UTC
Permalink
Post by Patrick Roemer
Wo hat er das gesagt? Wenn man nicht versucht, 'international
massgeblich' so zu interpretieren, was aber aus dem Kontext
nicht viel Sinn macht, habe ich nur gelesen, dass er gesagt
hat, er sei nicht einheitlich definiert.
Das "international maßgeblich" gefällt mir jetzt selber an
dieser Stelle auch nicht mehr so gut. Es stand im Text wohl
vor einer Norm, aber war gedanklich eher auf die ISO bezogen.
Also in etwa so gemeint: "In der Norm ... steht ... Diese
Norm stammt von der ISO, einer weithin anerkannten
internationalen Normierungsorganisation".

Wenn man also nach allgemein gültigen Begriffsdefinitionen
sucht, dann wäre die ISO ein guter Ausgangspunkt. Aber wenn
man dann wissenschaftliche Facharbeiten der Informatik liest,
erkennt man, daß die Definitionen der ISO/IEC 2382 dort nicht
regelmäßig zugrundegelegt werden, so daß man sie nicht als
"die allgemeinen Definitionen der Informatik" ansehen kann.

Dennoch kann man sich selber entscheiden, in eigenen Texten
die Begriffe nach ihrer Definition in dieser Norm zu
verwenden, wobei man diese Norm dann eben als Quelle nennen
sollte.
Stefan Ram
2005-10-17 12:01:39 UTC
Permalink
Post by Thomas G. Meyer
Ich befürchte fast lieber Stefan, du wirfts mit irgendwelchen
"aus dem Sinn" zusammenhanglosen Links nur so um dich. Wieso
kommst du jetzt auf aufeinmal auf "algorithmen"?
"algorithm" diente hier als Beispiel für einen Begriff
der Informatik.
Post by Thomas G. Meyer
Also schon wieder ein Wiederspruch.
Ich habe dieses Wort oder das dazugehörige Verb nun schon
wiederholt in dieser Schreibweise von Dir gelesen und erlaube
mir an dieser Stelle nun doch einmal den Hinweis auf die
richtige Schreibweise: "Widerspruch" und "widersprechen" haben
ein "d" als dritten Buchstaben, kein "e".
Paul Ebermann
2005-10-16 23:16:27 UTC
Permalink
Meine Definition: Objekt = Ding (Sache, Konzept, Idee) mit Identitt,
Zustand und Verhalten.
Fast richtig ausgedr ckt: Ein Objekt ist in der objektorientieten
Programmierung ein konktrete Ausprgung einer Klasse (Exemplar / Instanz
einer Klasse).
"Klasse" ist kein notwendiger Begriff der _objekt_orientierten
Programmierung, auch wenn viele (bei weiten nicht alle)
objektorientierte Programmiersprachen klassenbasiert sind.
Das Objekt besitzt eine Identit t, einen Zustand und
Verhalten. (in meinem vorherigen Aussage habe ich dieses nur etwas platter
ausgedrckt).
OK.
Ein Objekt kann eine Datenstruktur sein, aber eine Datenstruktur
ist kein Objekt.
Hmm. Das klingt etwas gegensätzlich.
Richtig
Noch mehr ad-hoc-Definitionen (die ich dann wieder von Paul oder Stefan um
:-)
Typ = Menge von Dingen. Datentyp = Menge von Datenstrukturen.
Schön simples Konzept, gefällt mir.
Das erkl re mir mal wie Datentyp eine Menge von Datenstrukturen sind? ?;-)
Eine Datenstruktur ist ein "Ding", welches sich
irgendwie Daten merkt, und sonst nicht viel mehr macht.

Fasst man irgendwie "gleichartige" Datenstrukturen zusammen,
erhält man einen Datentyp. (Es ist meist nicht üblich, die
Datentypen irgendwie quer zu den "Gleichartigkeitsgrenzen"
zu definieren.)


Paul
--
The Java Language Specification: http://java.sun.com/docs/books/jls/index.htmls
Mit Änderungen durch 5.0:
http://jcp.org/aboutJava/communityprocess/pfd/jsr014/index2.html
(18 PDFs in einem Zip in einem anderen Zip - wer kennt eine bessere Version?)
Stefan Ram
2005-10-17 00:49:09 UTC
Permalink
Post by Paul Ebermann
Typ = Menge von Dingen. Datentyp = Menge von Datenstrukturen.
Schön simples Konzept, gefällt mir.
Den Datentyp "int" bezeichnet man normalerweise als einen
Datentyp, dessen Werte aber meist nicht als "Datenstrukturen".

Eine Datenstruktur hat normalerweise mehr als eine Komponente,
ist also beispielsweise eine Reihung oder ein Verbund.
Post by Paul Ebermann
Eine Datenstruktur ist ein "Ding", welches sich
irgendwie Daten merkt, und sonst nicht viel mehr macht.
Es ist eine Wertmenge (mit Darstellung und
Zugriffsoperationen), deren Werte irgendwie weiter in
Komponenten gegliedert sind (auf die dann mit den
Zugriffsoperationen zugegriffen werden kann), während
primitive Werte nicht als "strukturiert" angesehen werden.

Im klassischen LISP ist beispielsweise die Liste die einzige
Datenstruktur, während Atome nicht strukturiert sind, daher
ihr Name.
Thomas G. Meyer
2005-10-17 08:27:36 UTC
Permalink
----- Original Message -----
From: "Paul Ebermann" <Paul-***@gmx.de>
Newsgroups: de.comp.lang.java
Sent: Monday, October 17, 2005 1:16 AM
Subject: Re: Brettspiele Programmieren
Post by Paul Ebermann
"Klasse" ist kein notwendiger Begriff der _objekt_orientierten
Programmierung, auch wenn viele (bei weiten nicht alle)
objektorientierte Programmiersprachen klassenbasiert sind.
Vorschlag zur Güte: schlag in einem OO-Buch (zum Bleistift der gute alte
Coad/Yourdon ) nach und lies noch mal nach dort steht ungefähr dieser
Wortlaut:

"In OOP spezifiziert eine Klasse eine Menge von Objekten (Exemplaten,
Instanzen) mit gleichen Attributen und Methoden"

Wenn du es gefunden hast, dann erkläre mir doch noch mal bitte wieso Klassen
nichts mit OO zu tun hat. ;-)
Post by Paul Ebermann
Paul
Tom
Patrick Roemer
2005-10-17 10:08:55 UTC
Permalink
Post by Thomas G. Meyer
Post by Paul Ebermann
"Klasse" ist kein notwendiger Begriff der _objekt_orientierten
Programmierung, auch wenn viele (bei weiten nicht alle)
objektorientierte Programmiersprachen klassenbasiert sind.
Vorschlag zur Güte: schlag in einem OO-Buch (zum Bleistift der gute alte
Coad/Yourdon ) nach und lies noch mal nach dort steht ungefähr dieser
"In OOP spezifiziert eine Klasse eine Menge von Objekten (Exemplaten,
Instanzen) mit gleichen Attributen und Methoden"
Bertrand Meyer:

'The method and the language should have the notion of class as their
central concept.'

...aber:

'A few language designs have used the concept of object as a software
construct rather than just a run-time notion as described in this
chapter. In such approaches, meant for exploratory programming, there
may be no need for the notion of a class. The most notable
representative of this school of thought is the Self language, which
uses "prototypes" rather than classes.'

Und wenn man Kay fragt, was OOP ist, taucht der Begriff 'class' auch
nicht auf:

http://www.purl.org/stefan_ram/pub/doc_kay_oop_en
Post by Thomas G. Meyer
Wenn du es gefunden hast, dann erkläre mir doch noch mal bitte wieso Klassen
nichts mit OO zu tun hat. ;-)
Das hat niemand behauptet.

Viele Gruesse,
Patrick
Paul Ebermann
2005-10-18 10:20:33 UTC
Permalink
Post by Thomas G. Meyer
----- Original Message -----
Newsgroups: de.comp.lang.java
Sent: Monday, October 17, 2005 1:16 AM
Subject: Re: Brettspiele Programmieren
Deine Einleitungszeile ist ziemlich lang :-)
Post by Thomas G. Meyer
Post by Paul Ebermann
"Klasse" ist kein notwendiger Begriff der _objekt_orientierten
Programmierung, auch wenn viele (bei weiten nicht alle)
objektorientierte Programmiersprachen klassenbasiert sind.
Vorschlag zur Gte: schlag in einem OO-Buch (zum Bleistift der gute alte
Coad/Yourdon ) nach und lies noch mal nach dort steht ungef hr dieser
"In OOP spezifiziert eine Klasse eine Menge von Objekten (Exemplaten,
Instanzen) mit gleichen Attributen und Methoden"
OK. Wir haben hier also eine rekursive Definition von "Objekt"
(Exemplar einer "Klasse") und "Klasse" (Menge von "Objekten").

Ist das wirklich hilfreich, um den Begriff des
Objektes zu verstehen?
Post by Thomas G. Meyer
Wenn du es gefunden hast, dann erklre mir doch noch mal bitte wieso Klassen
nichts mit OO zu tun hat. ;-)
Ich habe nicht behauptet, dass Klassen nichts mit OO zu
tun haben, sondern nur, dass der Begriff der Klasse nicht
notwendig ist für eine objektorientierte Programmiersprache.

Natürlich hat man Klassen in dem Sinne, wie du ihn oben
definierst, auch in "klassenlosen" Programmiersprachen
(schlimmstenfalls bildet jedes Objekt seine eigene Klasse).


Paul
--
Dein Posting hat kein deklariertes Charset (also implizit US-ASCII),
verwendet aber nicht-ASCII-Zeichen. Das sollte korrigiert werden.
Siehe http://oe-faq.de/antwort5.htm#4.1
Stefan Matthias Aust
2005-10-19 11:14:04 UTC
Permalink
Post by Thomas G. Meyer
Post by Stefan Matthias Aust
Meine Definition: Objekt = Ding (Sache, Konzept, Idee) mit Identität,
Zustand und Verhalten.
Fast richtig ausgedrückt: Ein Objekt ist in der objektorientieten
Programmierung ein konktrete Ausprägung einer Klasse (Exemplar / Instanz
einer Klasse). Das Objekt besitzt eine Identität, einen Zustand und
Verhalten. (in meinem vorherigen Aussage habe ich dieses nur etwas platter
ausgedrückt).
Ich "Klasse" extra vermieden, weil das für mich kein notwendiges Konzept
für Objektorientierung ist. Ich habe gesehen, du hast dich da mit
Stefan Ram schon 'drüber gestritten, sodass ich ohne das im Detail
gelesen zu haben nur sagen kann, dass ich die Sprache Self für die
Essenz der Objektorientierung halte, weil man dort alle entbehrlichen
Konzepte weggelassen hat und Klassen gehörten dazu.

Objekte selbst tragen Verhalten und (zur Laufzeit vorhandene) Klassen
sind ein Weg, dies effizient zu implementieren. Muss aber nicht. Siehe
z.B. JavaScript oder NewtonScript (diese Sprachen sind stark von Self
beeinflusst).

Und ja, mir ist bewusst, das Dan Ingalls 1981 noch schrieb "A language
must provide a means for classifying similar objects, and for adding new
classes of objects on equal footing with the kernel classes of the
system." aber dieses Klassifizieren muss nicht durch das Konzept einer
Klasse als Blaupause realisiert werden, sondern kann z.B. wie bei Self
durch Delegation und Traits allgemeingültiger implementiert werden.
Post by Thomas G. Meyer
Post by Stefan Matthias Aust
Noch mehr ad-hoc-Definitionen (die ich dann wieder von Paul oder Stefan um
die Ohren geschlagen bekomme): Typ = Menge von Dingen. Datentyp = Menge
von Datenstrukturen.
Das erkläre mir mal wie Datentyp eine Menge von Datenstrukturen sind? ?;-)
Ich sagte doch, Typ = Menge. Sei (a=1), (a=2,b=3) irgendeine Syntax für
irgendeine Datenstruktur (hier Records mit Feldern und Werten), dann ist
z.B. {(a=1), (a=2,b=3)} eine Menge und der Typ der Datenstrukturen, die
alle ein Feld namens "a" haben. Wo ist das Problem?
Post by Thomas G. Meyer
Bei mir sind Datentypen (ich drücke es jetzt fachmannisch aus, damit mir wir
Datentyp bezeichnet nach meiner Definition: die Zusammenfassung eines
Wertebereichs mit den darauf definierten Operationen. Java z.B. bietet eine
Menge an vordefinierten Datentypen z.B. Ganz Zahlen (int, long, ...),
Fliesskommazahlen (float, double, ...) und Zeichen ( char ).
Okay, andere Definition -- für mich wäre die Menge der Werte +
Operationen ein abstrakter Datentyp. Kann sein, dass ich da falsch liege.
Post by Thomas G. Meyer
Post by Stefan Matthias Aust
Oder in Bezug auf Java: ADT entspricht Interface-Definition (mit
(in)formaler Beschreibung der Methoden), Objekttyp (aka KlassenTyp)
entspricht Klassendefinition. Schlussfolgerung: Man kann aus jedem
Objekttyp einen ADT ziehen.
Ich befürchte fast du wirfst hier einige Sachen völlig durcheinander oder
verstehe ich deine Aussage nicht?
ADT's: speziellen Datentypen, deren Operation genau spezifiziert sind, die
allerdings im Gegensatz zu den elementaren und zusammengesetztenn Datentypen
nicht an einen konkreten Wertebereich gebunden sind. So wie ich deine
Definition verstehe sagst du oben aber aus einen gDatentyp mit abstrakten
Verhalten?
Ja, das habe ich dann verwechselt. Deine Definition stammt von
http://www.computerbase.de/lexikon/Abstrakter_Datentyp, oder? Für mich
war der Abstrakte Datentyp das, was das Lexikon da als Datentyp
definiert. Das was ich als Datentyp bezeichnet habe, nennen sie dort
Objektmenge (Wertemenge wäre besser, damit man das nicht mit OO
verwechselt). Ich war eine Ebene verruscht.
Post by Thomas G. Meyer
Interface = Eine Schnittstelle, die keine Implementierung enthält, sondern
nur Namen und Signaturen der enthaltenenen Methoden. Oder anders
ausgedrückt: Ein Interface sind vollständig abstrakte Klassen.
Mag sein. Aber für mich war der Zusammenhang mit den Typen wichtig. Ein
Interface definiert somit einen Datentyp, denn es impliziert eine
Wertemenge (im OO-Fall tatsächlich eine Objektmenge) und definiert
Operationen, ohne deren Semantik festzulegen.
Post by Thomas G. Meyer
Post by Stefan Matthias Aust
Post by Thomas G. Meyer
Richtig eine Ansammlung von
Funktionen in einem nicht definierten Pool.
Falsch. Funktionen würde ich (da oben nicht definiert) möglichst hier
raushalten, schließlich reden wir hier von prozeduraler Programmierung und
da gibt es dann bitte nur Prozeduren (definiert als Anweisungsfolgen).
Ein Zustand ist allgemeiner als ein veränderlicher
Falsch, wenn du schon in der OO-Sprache sprichst dann bitte schön Methoden.
In der Informatik (unabhängig von der Programmiersprache) spricht man von
Funktionen (nachzulesen in jedem Lexikon).
Funktion = eine Stück zusammengehörigender Code, der es erlaubt eine
bestimmte Aufgabe in wiederverwendbarer Art umzusetzen oder platt
ausgedrückt: Unterroutine eines Programms (private Anmerkung: resultierend
aus dem Mathmatischen => Hier sprichst du auch nicht von Prozeduren sondern
von Funktionen. Oder sagts du etwa ich benutze für z.B. Berechnung in der
Trigonometrie die Prozedure Sinus. Ich vermute eher du sagts: Ich benutze in
der Trigonomertrie die Funktion Sinus).
Du wirst wohl auch kaum ein Programmierhandbuch finden, indem von Prozeduren
die Rede ist (vorausgesetzt, die Programmiersprache unterscheidet nicht
explizit zwischen Prozeduren und Funktionen (z.B. Delphi))
Ich bin mir relativ sicher, das in Algol von Prozeduren die Rede ist.
Ich bin mir sehr sicher, dass Modula und Scheme immer von Prozeduren
(bzw. procs) reden und es als Sonderfall betrachtet wird, dass ein (oder
mehr) Werte zurückgegeben werden. C sieht es genau anders herum, da
wird alles als Funktion bezeichnet und es gibt welche ohne Rückgabe
("void" genannt).

Den mathematischen Funktionsbegriff wollte ich ja gerade ausklammern und
daher ist Prozedur der bessere Begriff, weil er allgemeingültig genug
ist. Es sollte klar sein, dass es keinen Unterschied macht, ob man

procedure x(): any

a = x()

oder

procedure x(out x: any)

x(a);

schreibt. Unterschiedliche Syntax für die selbe Semantik.
Post by Thomas G. Meyer
Prozedure = eine Funktion ohne Rückgabeparameter. Einige Programmiersprachen
unterscheiden zwischen Funktionen und Prozeduren (z.B. Delphi).
Ich möchte mal aus dem obigen Lexikon zitieren, allerdings scheint das
einfach nur aus der Wikipedia zu "klauen". Dort steht bei Prozedur

"Eine Prozedur (oder auch Unterprogramm) in der Programmierung von
Computersystemen ist ein Stück zusammengehörigen Codes, der es erlaubt,
eine bestimmte Aufgabe in wiederverwendbarer Art umzusetzen."

Das ist der Sinn, den ich hier meine. Das ganze wird dann fortgesetzt mit

"Prozeduren [...] liefern jedoch nach ihrem Ende keinen Wert zurück"

mit dem ich nicht übereinstimmen kann, denn das halte ich für falsch,
wenn man mein Beispiel mit dem "out"-Parameter da oben anschaut.
Post by Thomas G. Meyer
Methode = Eine Funktion, die einer Klasse zugewiesen wird (unabhängig von
deren Sichtbarkeit).
Ich würde aus der Definition immer den Begriff Klasse herauslassen, denn
Methoden gibt es auch in der klassenlosen OO.
--
Stefan Matthias Aust // Ergo bibamus, ne sitiamus, vas repleamus!
Ingo Menger
2005-10-20 08:00:31 UTC
Permalink
Post by Stefan Matthias Aust
Das ist der Sinn, den ich hier meine. Das ganze wird dann fortgesetzt mit
"Prozeduren [...] liefern jedoch nach ihrem Ende keinen Wert zurück"
mit dem ich nicht übereinstimmen kann, denn das halte ich für falsch,
wenn man mein Beispiel mit dem "out"-Parameter da oben anschaut.
Es ist schon ein Unterschied, ob etwas einen Wert berechnet oder einen
Wert irgendwohin speichert. Im ersten Fall rede ich von Funktion, im
zweiten von Prozedur. Wenn die Funktion pur sein will, darf sie sogar
*nichts anderes* machen, als den Wert berechnen, d.h. es muß
transparent sein, ob z.B. hinter der Bühne jemand (die VM?) einen Hash
mit den bisher schon aufgetretenen Funktionsargumenten hält und bei
Wiederauftreten den zugehörigen Wert einfach nachschlägt.
Post by Stefan Matthias Aust
Ich würde aus der Definition immer den Begriff Klasse herauslassen, denn
Methoden gibt es auch in der klassenlosen OO.
Kommunistische, sozusagen? :)
Stefan Matthias Aust
2005-10-22 08:03:55 UTC
Permalink
Post by Ingo Menger
Post by Stefan Matthias Aust
Das ist der Sinn, den ich hier meine. Das ganze wird dann fortgesetzt mit
"Prozeduren [...] liefern jedoch nach ihrem Ende keinen Wert zurück"
mit dem ich nicht übereinstimmen kann, denn das halte ich für falsch,
wenn man mein Beispiel mit dem "out"-Parameter da oben anschaut.
Es ist schon ein Unterschied, ob etwas einen Wert berechnet oder einen
Wert irgendwohin speichert. Im ersten Fall rede ich von Funktion, im
Ganz platt würde ich erstmal sagen, um ihn speichern zu können, muss man
ihn erstmal berechnen. Und wie man ihn dann speichert und direkt oder
indirekt zurückgibt, ist ein Detail. Daher halte ich ja Prozeduren für
allgemeiner.

Zu dem Gedanken funktionaler Sprachen gehört für mich das Konzept der
Auwertung von Ausdrücken mittels "Reduktion". Das Konzept würde man bei
imperativen Sprachen nicht heranziehen.
Post by Ingo Menger
Post by Stefan Matthias Aust
Ich würde aus der Definition immer den Begriff Klasse herauslassen, denn
Methoden gibt es auch in der klassenlosen OO.
Kommunistische, sozusagen? :)
*g*
--
Stefan Matthias Aust // Ergo bibamus, ne sitiamus, vas repleamus!
Loading...