 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Ernst Baumann Guest
|
Posted: Wed Nov 22, 2006 1:43 am Post subject: verkettete Liste, ein semantisches Problem |
|
|
Hallo allerseits,
im folgenden Problem geht es zwar hauptsächlich um die "richtige"
Bezeichnung. Doch ist mir das wichtig, weil dies ja auch das Denken
prägt.
Angenommen man hat einen _Artikel_ (der der Einfachheit halber nur aus
einer Artikelnummer besteht) und will nun eine Liste von Artikeln
machen, also eine _Artikelliste_.
Ich weiss zwar, dass man dies technisch mit verkettetn Listen machen
kann und habe so was auch schon gebastelt.
Nur habe ich ein Problem mit der Bezeichnung (aber Bezeichnungen
sollten ja in der OOP die "Wirklichkeit" "beschreiben").
Beschreibt man nun einen einzelnen Artikel durch:
class Artikel{
private:
int artnr;
public:
// Methoden
}
und hat dadurch noch keine Liste
oder
bBeschreibt man nun einen einzelnen Artikel durch:
class Artikel{
private:
int artnr;
Artikel *first;
Artikel *next;
public:
// Methoden
}
und hat dadurch die Voraussetzung einer verketten Liste.
Dann sollte die Klasse aber besser Artikelliste heissen:
class Artikelliste{
private:
Artikel art;
Artikelliste *first;
Artikelliste *next;
public:
// Methoden
}
Allerdings wäre dann first ein Pointer auf eine Liste (nämlich
Artikelliste), aber eigentlich zeigt next auf den nächsten Artikel.
Wie macht man die richtigen Bezeichnungen?
mfg
Ernst |
|
| Back to top |
|
 |
Jens Auer Guest
|
Posted: Wed Nov 22, 2006 4:37 pm Post subject: Re: verkettete Liste, ein semantisches Problem |
|
|
Ernst Baumann schrieb:
| Quote: | Hallo allerseits,
im folgenden Problem geht es zwar hauptsächlich um die "richtige"
Bezeichnung. Doch ist mir das wichtig, weil dies ja auch das Denken
prägt.
Angenommen man hat einen _Artikel_ (der der Einfachheit halber nur aus
einer Artikelnummer besteht) und will nun eine Liste von Artikeln
machen, also eine _Artikelliste_.
Ich weiss zwar, dass man dies technisch mit verkettetn Listen machen
kann und habe so was auch schon gebastelt.
Nur habe ich ein Problem mit der Bezeichnung (aber Bezeichnungen
sollten ja in der OOP die "Wirklichkeit" "beschreiben").
Das OO die Wirklichkeit abbilden soll, halte ich fuer eine |
problematische Ansicht, auch wenn man es haeufig liest. Meiner Meinung
nach soll OO eher Abstraktionen bieten, um Zustaendigkeiten aufzuteilen
und Software in Komponenten mit starken Zusammenhang aufzuteilen (low
coupling, high cohesion).
| Quote: | Beschreibt man nun einen einzelnen Artikel durch:
class Artikel{
private:
int artnr;
public:
// Methoden
}
und hat dadurch noch keine Liste
oder
bBeschreibt man nun einen einzelnen Artikel durch:
class Artikel{
private:
int artnr;
Artikel *first;
Artikel *next;
public:
// Methoden
}
und hat dadurch die Voraussetzung einer verketten Liste.
Dann sollte die Klasse aber besser Artikelliste heissen:
class Artikelliste{
private:
Artikel art;
Artikelliste *first;
Artikelliste *next;
public:
// Methoden
}
Allerdings wäre dann first ein Pointer auf eine Liste (nämlich
Artikelliste), aber eigentlich zeigt next auf den nächsten Artikel.
Hier hast Du zwei Aspekte in einer Klasse verwurschtelt, naemlich |
einerseits die Faehigkeit, Objekte zu speichern und dann die
Eigenschaften, die ein Artikel hat. Besser waere es, eine Klasse zu
entwerfen, die sich um das Speichern von Objekten kuemmert, und getrennt
davon die Artikel zu modellieren:
class Artikel
{
// alles was man so braucht...
}
class Liste
{
public:
Liste();
append(Artikel* a);
// ...
}
Zum Glueck muss man sich diese Arbeit nicht jedesmal machen, da es fuer
den Fall bereits generische Klassen in der Standard-Bibliothek STL gibt:
Artikel a;
std::list<Artikel> artikelliste;
artikelliste.push_front(a);
Brauchst Du eigentlich unbedingt das Verhalten einer verketteten Liste?
Wenn Du nicht haeufig in der Mitte der Liste Elemente einfuegst und
loeschst wuerde ich eher std::vector nehmen. |
|
| Back to top |
|
 |
Torsten Robitzki Guest
|
Posted: Wed Nov 22, 2006 4:41 pm Post subject: Re: verkettete Liste, ein semantisches Problem |
|
|
Hallo Ernst,
Ernst Baumann wrote:
| Quote: | Nur habe ich ein Problem mit der Bezeichnung (aber Bezeichnungen
sollten ja in der OOP die "Wirklichkeit" "beschreiben").
|
In der Softwareentwicklung beschreibt man in der Regel nicht die
"Wirklichkeit" sondern, wie man ein reales Problem lösen möchte. Die
"Wirklichkeit" abstrahiert man da besser. Eine Maus kann dann in einem
Tierheim ein Gast oder im Zoo Futter sein, das die Maus 4 Beine hat
interessiert in keinem der beiden Fälle ;-)
| Quote: |
Beschreibt man nun einen einzelnen Artikel durch:
class Artikel{
private:
int artnr;
public:
// Methoden
}
und hat dadurch noch keine Liste
class Artikel{
private:
int artnr;
Artikel *first;
Artikel *next;
public:
// Methoden
}
Wie macht man die richtigen Bezeichnungen?
|
Wenn nichts technisches dagegen spricht, wäre ersteres der Artikel, eine
verkettete Liste von Artikeln wäre dann std::list<Artikel>. Eine
Artikelliste könnte dann eine Abstraktion der Liste aller Artikel sein,
die z.B. sicherstellt, das Artikelnummern eindeutig sind. Hängt aber
immer vom Problem ab, von daher sollte man sich der Sache immer vom
Problem her annähern und nicht von der "Wirklichkeit" oder von irgend
einem "generellem Design".
mfg Torsten |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Wed Nov 22, 2006 8:13 pm Post subject: Re: verkettete Liste, ein semantisches Problem |
|
|
Ernst Baumann wrote:
| Quote: | Beschreibt man nun einen einzelnen Artikel durch:
class Artikel{
private:
int artnr;
Artikel *first;
Artikel *next;
public:
// Methoden
}
und hat dadurch die Voraussetzung einer verketten Liste.
Dann sollte die Klasse aber besser Artikelliste heissen:
|
Nein. Das da oben ist ein Listenknoten, keine Liste. Um nicht in
Konflikt mit deinem Benamsungsgewissen zu kommen, könntest du es
ArtikelListenKnoten nennen.
Die ArtikelListe wäre
class ArtikelListe {
ArtikelListenKnoten* first;
ArtikelListenKnoten* last;
public:
bool empty() const;
bool push_back(ArtikelListenKnoten*);
bool push_front(ArtikelListenKnoten*);
// ...
};
Das eigentliche Problem ist, dass du hier zwei Dinge vermengst: die
Eigenschaften des Artikels, und die Implementationseigenschaften der
Artikelliste. Sprich: der Artikel weiß bereits, dass er in einer doppelt
verketteten Liste gespeichert werden wird. Die sauberste Möglichkeit
wäre, den Artikel so zu implementieren, wie man den Artikel halt eben
implementiert (int artikelnummer; int preis; int verfuegbarkeit; string
name;), und eine zweite Klasse ArtikelListenKnoten
class ArtikelListenKnoten {
Artikel* the_article;
ArtikelListenKnoten* next, *prev;
}
sowie eine dritte ArtikelListe wie oben zu machen. In der STL gibt so
etwas schon als std::list<...>.
Dass du die Verkettungsfelder in die Artikelklasse mit einbindest, ist
eine reine Performance-Optimierung.
Stefan |
|
| Back to top |
|
 |
Ernst Baumann Guest
|
Posted: Thu Nov 23, 2006 11:06 pm Post subject: Re: verkettete Liste, ein semantisches Problem |
|
|
Das war es genau was ich suchte:
Die 3 Klassen
Artikel, ArtikelKnoten und ArtikelListe.
Um nicht im Kopf durcheinander zu kommen, sind dies die geeigneten
Bezeichnungen für mich. Eine sehr gute Idee von dir, prima!!
Gute Bezeichnungen sind wichtig für mich, weil ich sonst durcheinander
komme.
| Quote: |
Dass du die Verkettungsfelder in die Artikelklasse mit einbindest, ist
eine reine Performance-Optimierung.
Du beziehst dich auf meinen Vorschlag: |
class Artikel{
private:
int artnr;
Artikel *first;
Artikel *next;
public:
// Methoden
}
Nachdem, was du mir jetzt gezeigt hast, werde ich den Vorschlag von
mir auf _keinen_ Fall mehr verwenden.
| Quote: | sowie eine dritte ArtikelListe wie oben zu machen. In der STL gibt so
etwas schon als std::list<...>.
Um verkettete Listen zu verstehen, werde ich zuerst mal nicht |
std::list<...> verwenden.
mfg
Ernst |
|
| Back to top |
|
 |
Rud1ger Sch1erz Guest
|
Posted: Fri Nov 24, 2006 4:30 am Post subject: Re: verkettete Liste, ein semantisches Problem |
|
|
Ernst Baumann <carlox (AT) web (DOT) de> writes:
| Quote: | Um verkettete Listen zu verstehen, werde ich zuerst mal nicht
std::list<...> verwenden.
|
Ich hab' hier noch eine selbst-gebastelte einfach verkettete Liste
rumliegen, die wir in unseren Projekten vor Erfindung der STL
verwendet haben, einschließlich Iterator.
Kann ich dir zukommen lassen, falls dich sowas interessiert.
Cheers,
Rudiger |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|