Forum: PC-Programmierung Verständnis OOP für hardwarenahe Programmierer


von Frage (Gast)


Lesenswert?

Hallo liebe Experten,

Vorneweg, ich (Elektroniker) habe einiges an Erfahrung mit hardwarenaher 
Programmierung und habe meine Aufgaben mit verschiedenen 
Assembler-Dialekten und C auf Mikrocontrollern gelöst. Wer sich damit 
auskennt, kennt bestimmt die damit einhergehenden Denkweisen. Ich für 
meinen Teil tu mir schwer zwischen meinen objektorientiert (sofern man 
das so sagen kann) aufgebauten Funktionen und echter OOP zu 
Unterscheiden. Die mir bekannten Tutorials beziehen sich immer auf eine 
bestimmte Sprache und helfen mir beim Verständnis nicht wirklich weiter, 
da ich eben auch keine besonderen Erfahrungen mit der PC-Programmierung 
habe. Ein wenig VB.net habe ich verwendet, allerdings waren das 
einfachste Aufgabenstellungen die kein tiefes Verständnis erforderten.

Kennt jemand einen Artikel oder Tutorial, das sich auf die wesentlichen 
Unterschiede bezieht?

Konkret möchte ich ein VBA-Programm schreiben und suche jetzt nach einer 
schnellen Möglichkeit, mir über den rechen- und Speicherbedarf der 
verwendeten Objekte etc. klar zu werden. Es soll ein Dateibaum verwaltet 
werden, er soll um bestimmte Ordnerstrukturen erweiterbar sein und 
DragnDrop zwischen den Tree-Elementen ermöglichen. Für mich als 
uC-Entwickler ist das eine eher unangenehme Aufgabe, da ich ja die 
Ressourcen des Anwenders nicht kenne usw.

Ich habe bestimmt noch Vieles in meiner Erklärung vergessen, hoffe aber 
auf den ein oder anderen Hinweis, wo ich mich einlesen kann.

Viele Grüße

von Dieter E. (netdieter) Benutzerseite


Lesenswert?

VBA hat wenig mit OOP zu tun.

von Frage (Gast)


Lesenswert?

@netdieter

Kannst du ein paar Worte dazu verlieren, ich verstehe nicht was du damit 
meinst? Wenig ist doch zumindest etwas.

von Stibe (Gast)


Lesenswert?

Tach

VBA kenn ich zu wenig. Ich lernte OO mit Hilfe von Java. Dazu sind im 
Internet viele Artikel zu finden, wo die denkweise von OO vermittelt 
wird.

gruss

von Frage (Gast)


Lesenswert?

Danke für die bisherigen Antworten, hat vielleicht noch Jemand ein paar 
konkrete Tipps für mich? Oder habe ich mich zu unklar ausgedrückt?

von Stibe (Gast)


Lesenswert?

http://openbook.galileocomputing.de/javainsel8/

oder

Java von Kopf bis Fuss (relativ spielerisch aber gut verständlich)

von etmo (Gast)


Lesenswert?

villeicht hilft auch disenda weiter

http://openbook.galileocomputing.de/oop/

ich selber habe oop mit java gelernt, unteranderem auch mit hilfe von 
"java ist auch eine insel"

von Aahh (Gast)


Lesenswert?

Ja. OOP hat mit hardwarenah sehr wenig zu tun. Dies weil OOP als 
dynamische Speicherorgie beginnt und mit einem Garbage Collector endet. 
Beides ist nicht Echtzeitfaehig. Wenn das Programm mal schnell eine 
Warteschlange instanzieren sollte, der dynamische Speicher aber grad 
nicht verfuegbar ist, muss der Garbage Collector anspringen und das 
aendern - schwups das Ereignis ist leider schon vorbei. Solche Dinge 
laesst man lieber sein und alloziert den Speicher statisch zu Powerup.

von Klaus W. (mfgkw)


Lesenswert?

Naja, für eine OO-gerechte Denkweise braucht man keinen Garbage 
Collector;
OO-Programm kann man auch mit entsprechender Handarbeit in Assembler
schreiben.


Was leider die ursprüngliche Frage nach einem Crashkurs nicht 
beantwortet.

von Frage (Gast)


Lesenswert?

@Aahh
Klaus hats ja schon geschrieben, der Garbage-Collector ist kein fester 
Bestandteil von OOP. Trotzdem war dein Beitrag für mich interessant, 
danke dafür.

@Klaus
Ja, die Frage ist offensichtlich nicht so einfach zu beantworten. Das, 
was ich an OO in Assembler/C auf einem uC hinbekomme, bringt mir für das 
Verständnis der VBA-Umgebung nicht viel.

Kann noch wer zur "VBA-Denkweise" was schreiben? Sollte ich mich zuerst 
näher mit Windows an sich befassen?

von Klaus W. (mfgkw)


Lesenswert?

Windows hat mit OO soviel oder wenig zu tun wie VBA oder Assembler.

Die Beschäftigung mit einer OO-Sprache wäre sicher hilfreich, wobei
dann gleich wieder das Geschrei losgeht, welche denn nun die einzig
wahre OO-Sprache wäre.
Dann mache ich gleich den Anfang: in diesem Fall wohl C++.
Grund: wenn man Assembler und C schon kennt, wird man mit C++ noch
halbwegs schnell warm und kann es in diesem Bereich auch nutzen.
Was man in Java lernt, ist für MC sinnlos, auch wenn Java an sich ja
nicht schlecht ist. Ebenso helfen C# und alle anderen nicht weiter,
wenn man mit Controllern spielt.

Ob man C++ jetzt unter Windows oder Linux oder MacDonalds oder
sonstwas lernt, ist zweitrangig.

von Klaus W. (mfgkw)


Lesenswert?

nebenbei: was meinst du, wenn du von deinen "objektorientiert 
aufgebauten Funktionen" sprichst?
Das kann ich mir nur schwer vorstellen...

von Frage (Gast)


Lesenswert?

>nebenbei: was meinst du, wenn du von deinen "objektorientiert
>aufgebauten Funktionen" sprichst?
>Das kann ich mir nur schwer vorstellen...

Das 'objektorientiert' steht nicht umsonst in Anführungseichen. Du 
kennst z.B. CAN, man spricht dort von einem objektorientierten Modell. 
Das hat mit OOP ja auch nichts zu tun, mit meinen angesprochenen 
Funktionen verhält es sich analog:

Wenn ich mir z.B. am uC eine Softkey-Tastatur programmiere, die 
verschiedene Bedienarten (Klick, Doppelklick, langes Halten) 
unterstützt, denke ich objektorientiert und schreibe meine Funktionen 
dann so. Ich weiss, dass das konkret nichts mit OOP zu tun hat.

Aber nochmal, ich brauche kein OOP für uC sondern bin auf der Suche nach 
einer generellen Einführung in die Thematik, die ein bischen mehr die 
Híntergründe ausleuchtet. Damit ich verstehe, wie lang welches Objekt 
wie viel Speicher benötigt, usw. usf.

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

Hallo,

es ist eine alte Mär, dass embedded und C++ nicht zusammen apassen.
C++ beginnt nicht mit eine dynamischen Speicherorgie.

Beispiel:

Klasse * pKlasse = new Klasse();

verwendet die Standartimplementierung von new aus der libstdc++.a

Die ist aber nicht immer optimal.

Überlade ich aber new und delete klassenspezifisch, kann ich 
Speicherfragmentierung verhindern, statischen Speicher verwenden und die 
Performance drastisch steigern.

Dem geneigten Leser sei Scott Meyers "Effektiv C++ programmieren" ans 
Herz gelegt.

Übrigens: Das Betriebssystem eCos ist intern in C++ geschrieben und hat 
nur eine C-API.

Gruß

Olaf

von Frage (Gast)


Lesenswert?

>es ist eine alte Mär, dass embedded und C++ nicht zusammen apassen

Ja, das mag stimmen. Ich wollte aber nicht philosophieren sondern eine 
Quelle, die mir z.B. dies hier in Bezug auf VBA erklärt:

>Überlade ich aber new und delete klassenspezifisch, kann ich
>Speicherfragmentierung verhindern, statischen Speicher verwenden und die
>Performance drastisch steigern.

Also wie realisiere ich Überladungen, wann und wofür brauche ich sie, 
muss ich Klassenmodule schreiben oder reicht es die bereits in VBA 
enthaltenen Klassen/Objekte zu kennen etc....

Meinen new und delete in Bezug auf jedes Objekt das Gleiche?

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

Hallo Frage,

ich melde mich gleich, muß nur ein paar Überweisungen tätigen ...

Bis Gleich

von Manuel (Gast)


Lesenswert?

Ein gutes Buch kann ich empfehlen "Object-Oriented Analysis and Design 
with Applications". Ist auch ziemlich nahe an der Hardware. Zumindest 
die 2nd Edition ist noch in C++. Aber Crash-Kurs ist nicht. OOP zu 
verstehen ist meiner Meinung nach relativ komplex. Wenn man schon 
einiges mit C/ASM gemacht hat ist es für die meisten sogar noch 
schwieriger die Konzepte zu verstehen. Ich habe mehrere Jahre gebraucht. 
Vielleicht geht es auch schneller - aber ich habe auch schon jede menge 
Code von Pseudo-Java Entwicklern gesehen die mit OOA/D/P an sich nicht 
sehr viel zu tun hatten.

von Klaus W. (mfgkw)


Lesenswert?

bist du jetzt konkret auf VBA fixiert?

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

Hallo Frage,

also, wenn Du nur die in VBA (schüttel) enthaltenen Klassen verwenden 
willst, hat das mit OOP nichts zu tun. Du programmierst dann 
prozeduralen Code, der eventgesteuert ist.

Um guten OO Code zu schreiben, mußt Du die Wirklichkeit in Klassen 
einteilen und dann von den Klassen Objekte instanzieren.

Dir ist doch der Unterschied zwischen Objekt und Klasse vertraut?

Gruß

Olaf

von Frage (Gast)


Lesenswert?

Manuel:
>Wenn man schon einiges mit C/ASM gemacht hat ist es für die meisten sogar
>noch schwieriger die Konzepte zu verstehen.

Das glaube ich sofort.

Klaus:
>bist du jetzt konkret auf VBA fixiert?

Ja, leider. Hätte ich wohl schon im Betreff erwähnen sollen, sorry.

Olaf:

Vielen dank, dass du dir Zeit genommen hast.

>Dir ist doch der Unterschied zwischen Objekt und Klasse vertraut?

Nicht zu hundert Prozent, glaube ich. Ich werde noch ein bischen 
Grundlagen wälzen um morgen zielführende Fragen zu stellen. Da ich 
morgen früh raus muss, lass ich das jetzt mal so stehen.

von Aahh (Gast)


Lesenswert?

Also lass mal das hardwarenah und das VBA weg, beides hat keinen Bezug. 
Was ist objektorientiert ?
1)Daten und Code gehoeren zusammen und bilden ein Objekt.
  Der Code existiert einmal, die Daten werden fuer jede
  Instanz angelegt
2)Die Daten des Objektes werden nicht global zugegriffen,
  sondern eingkapselt mit Zugriffsprozeduren zugegriffen.
  Ein Konstruktor is Pflicht, ein Destruktor meist auch.
3)Vererbung bedeutet weitergehende spezialisierung, indem
  einem Objekt zusaetzliche Variablen, zusaetzliche
  Funktionalitaet durch zusaetzliche Zuriffsprozeduren
  verpasst werden.

Eine Klasse nennt sich das Strickmuster, ein Objekt ist
der dazugehoerige Pullover.

von Klaus W. (mfgkw)


Lesenswert?

oder: Klasse ist der Typ, Objekt eine davon gebildete Variable (=eine 
Instanz der Klasse)

von Mark B. (markbrandis)


Lesenswert?

Klaus Wachtler schrieb:
> OO-Programm kann man auch mit entsprechender Handarbeit in Assembler
> schreiben.

So einen Code würde ich gerne mal sehen :-)

von Frage (Gast)


Lesenswert?

Hallo Mark,

sicher, ist lustig, OOP in Assembler ;) Würde mich aber freuen wenn du 
auch was zum Thema sagen könntest.

von Volker Z. (vza)


Lesenswert?

Wann macht OOP Sinn? ((m)eine vereinfachte Sichtweise)

OOP macht dann Sinn, wenn Du viele, sehr ähnliche Aufgaben programmieren 
must, die sich nur an wenigen Stellen unterscheiden.
Das Paradebeispiel ist die Fensterprogramierung. Alle Fenster stellen 
sich auf dem Bildschirm dar, reagieren auf Maus- und Keyboard. Lassen 
sich verschieben, zoomen usw. Aber jede FensterKlasse halt ein wenig 
anders.
Hier zahlt sich OOP aus, in dem du weniger Code schreiben must, in dem 
du bei deinen abgeleitteten Klassen nur die Funktion(en) überschreibst, 
die ein anderes Veralten haben sollen.

Eine andere Sichtweise ist, das Klassen eigentlich nur Strukturen sind, 
indem die deklaration von Funktionen erlaubt ist.

Aber !!!
Mit Funktionszeigern in Struckturen kann man unter C das OOP nachbilden.
Ok, ist ein bisschen mehr tipparbeit und sieht nicht so schön aus.
Auch Kapselung ist unter C möglich, wenn man sich abgewöhnt auf 
Variablen andere Module direkt zuzugreifen. Man muss nur alle globale 
Variable als static deklarieren.

OOP in Assembler nachzubilden, würde ich mir aber auch ersparen.

VBA hat, für mich, eher den beigeschmak einer eingebetteten 
Scriptsprache für Office-Programme, und weniger einer 
Programmiersprache.

Mein Tipp: Spiel ein bischen mit Java oder C# auf dem PC herrum, völlig 
losgelöst von µC oder c/asm.  Wo bei die Beispiele die Themen 
Klasse/Instanzen, Vererbung, Überladung, Templates, abstrakte Klassen 
beinhalten solten.

ciao Volker

von Frage (Gast)


Lesenswert?

@Klaus

Ist die Aussage so zu verstehen, dass ein Objekt einen Satz Variablen, 
die zu einem Stück Code (Objekt-Code?) gehören im RAM anlegt? Also für 
jede Instanz des Objekts eine feste Anzahl an Bytes/Words, oder variiert 
dies je nach Verwendung im weiteren Code?

von Frage (Gast)


Lesenswert?

vza:
>Wann mach OOP Sinn?

Danke für die kleine Ausführung zu diesem Punkt. Mit solchen Erklärungen 
kann ich viel anfangen, das gibt mir ein wenig Einblick in die Denkweise 
von OO-Programmierern.

>Auch Kapselung ist unter C möglich, wenn man sich abgewöhnt auf
>Variablen andere Module direkt zuzugreifen.

Mit solchen Dingen bin ich vertraut, mein Problem ist wirklich die 
spezielle Natur von VBA, das, wie du richtig anmerkst, eine 
Scriptsprache für Office ist.

>Mein Tipp: Spiel ein bischen mit Java oder C# auf dem PC herrum, völlig
>losgelöst von µC oder c/asm.  Wo bei die Beispiele die Themen
>Klasse/Instanzen, Vererbung, Überladung, Templates, abstrakte Klassen
>beinhalten solten.

Werd ich mir zu Herzen nehmen, danke für den Tipp. Noch eine Frage dazu: 
du empfiehlst C#, wo siehst du einen Vorteil gegenüber C++?

von Karl H. (kbuchegg)


Lesenswert?

Frage schrieb:
> @Klaus
>
> Ist die Aussage so zu verstehen, dass ein Objekt einen Satz Variablen,
> die zu einem Stück Code (Objekt-Code?) gehören im RAM anlegt? Also für
> jede Instanz des Objekts eine feste Anzahl an Bytes/Words, oder variiert
> dies je nach Verwendung im weiteren Code?

OOP ist die logische Kapselung von Daten und Funktionen zur Bearbeitung 
von diesen Daten in eine Einheit: dem Objekt

Sinn der Sache ist es, dass man es ermöglichen will, dass sich ein 
Objekt insofern von seiner Umgebung abkapseln kann, als dass kein 
aussenstehender Code die Daten ohne Einwilligung und Kontrolle das 
Objektes manipulieren kann. Das ist das allerwichtigste Prinzip in der 
OOP und davon geht alles andere aus: Ein Objekt und nur dieses Objekt 
ist für die Manipulation der Daten zuständig. Man könnte auch sagen: OOP 
dreht sich einzig und alleine um eine Organisationsform bei der 
Zuständigkeiten klar geregelt sind.
In der vor OOP Zeit war es so, dass jeder dahergelaufene Code so 
ziemlich jede Variable im Speicher manipulieren konnte. Mit all den 
Problemen die damit zusammenhängen: Variablen die nach einem 
Funktionsaufruf, der scheinbar überhaupt nichts mit dieser Variablen zu 
tun hat, plötzlich ihren Wert geändert haben. Es ist wahnsinnig 
aufwändig und fehlerträchtig, derartige Manipulationen als Programmierer 
zu verfolgen und zu verstehen. Es ist wahnsinnig schwierig, eine einmal 
getroffene Implemenationsentscheidung in späterer Folge zu revidieren, 
weil sich diese Änderung möglicherweise an vielen verstreuten 
Codestellen auswirken wird.

Wenn man will, dann kann man File-static Variablen und die zugehörigen 
Bearbeitungsfunktionen die in diesem einen *.c File existieren, schon 
als Vorstufe zu OOP ansehen
1
static int Stack[100];
2
static int StackPtr;
3
4
void Push( int value )
5
{
6
  Stack[StackPtr++] = value;
7
}
8
9
int Pop( void )
10
{
11
  return Stack[--StackPtr];
12
}

Das kann man mit ein bischen guten Willen als ein Objekt ansehen, dass 
sich von der Aussenwelt soweit abgeschottet hat, dass Zugriffe auf den 
Stack nur über die Funktionen möglich sind. Genausogut kann ich die 
Implementiation dieses Stacks jederzeit ändern (eine lineare Liste 
anstelle des Arrays) ohne, dass dies ausserhalb dieses Files 
irgendjemanden berühren würde. Die Verwender dieses 'Objekts' benutzen 
nach wie vor ihre gewohnten Push und Pop Funktionen. Dass sich dahinter 
nun ein ganz anderer Mechanismus verbirgt, braucht sie nicht zu 
interessieren und berührt sie auch nicht.

Genau das ist die unterste Ebene, bei der OOP beginnt: Das Daten und 
Funktionen auf diese Daten nicht voneinander losgelöst sind, sondern 
eine Einheit bilden, die zusammengehört. Die Funktionen und nur diese 
Funktionen sind dafür zuständig die Daten zu manipulieren und sonst 
niemand.

Alles weitere, was OOP so nützlich macht: Vererbung, Polymorphie ist 
eine direkte Konsequenz daraus, dieses Konzept der Kapselung nicht zu 
brechen und es so zu präsentieren, dass es möglich ist einmal vorhandene 
Objekte zu spezialisieren und mit neuen, zusätzlichen Eigenschaften zu 
versehen.


(In C++ kann man sich eine 'Klasse' wie den Bauplan eines Hauses 
vorstellen. Die Klasse ist der Plan, das tatsächlich vorhandene Haus ist 
ein Objekt dieser Klasse. Von einem Plan ausgehend kann man viele Häuser 
bauen, die zunächst alle gleich sind, aber dann vom Bewohner individuell 
abgeändert werden)

von remmy (Gast)


Lesenswert?

@Karl heinz Buchegger

Schön beschrieben.

Was mich dazu interessieren würde ist, wer schreib OO-Code in C++ für
AVR´s und was sind eure Erfahrungen ?

remmy

von Frage (Gast)


Lesenswert?

kbuchegg:

Danke dass du dich meiner Frage angenommen und sie so ausführlich 
beantwortet hast.

>(In C++ kann man sich eine 'Klasse' wie den Bauplan eines Hauses
>vorstellen. Die Klasse ist der Plan, das tatsächlich vorhandene Haus ist
>ein Objekt dieser Klasse. Von einem Plan ausgehend kann man viele Häuser
>bauen, die zunächst alle gleich sind, aber dann vom Bewohner individuell
>abgeändert werden)

Ok, so habe ich mir das auch vorgestellt. Oben kam ja schon die Analogie 
Strickmuster(Klasse) und Pullover(Objekt), die ich auch sehr plastisch 
finde. Das Beispiel mit den Häusern macht es aber einfacher, mein 
Probmlem zu verdeutlichen:

Wie in der Realität benötigen unsere 'Häuser' ja Platz, der 'Baugrund' 
ist in dem Fall mein RAM. Sind die Konzepte, die mir die Verwaltung des 
Baugrunds ermöglichen, in allen OOP-Sprachen gleich umzusetzen oder ist 
das Plattform-Abhängig? (die Plattform stellt ja den 'Baugrund' 
physikalisch bereit)

Unabhängig davon, wie ich das speziell in VBA realisieren muss: Bleiben 
wir weiter bei OOP im Allgemeinen oder einem der OOP C-Dialekte, ich 
glaube das hilft mir wirklich weiter. :)

von Frage (Gast)


Lesenswert?

@remmy

Machst du bitte einen eigenen Thread dazu auf? Wir entfernen uns hier 
langsam aber sicher von der Verbindung OOP zu Mikrocontrollern. Da ich 
diesen Thread auch gerne lesen würde, freue ich mich wenn du das 
wirklich tust. :)

von Volker Z. (vza)


Lesenswert?

Ich sehe gar keinen Vorteil von C# gegenüber von C++(beim lernen der 
OOP). Ich kenne C# auch nicht besonders gut.
Der Punkt ist nur das C++ zu nahe an C ist, und man dann eher versucht 
ist Prozedural und nicht OOP zuschreiben / zudenken. So ging es bei mir 
zumindestens.

Das Umdenken ist das schwierigste beim Umstieg. Nur ein Beispiel:
Wenn ich C schreibe, habe ich eine Aufgabe/Problem, und fange an die 
Funktion zu schreiben. Erst wenn sie halb fertig ist, schaue ich welche 
Datenstrukturen dazu am besten passen und welche Daten rein und raus 
gehen.

Bei OOP fäng mann damit an, sich zu fragen, welche Objekte brauche ich, 
um meine Aufgabe zuerfüllen. Danach stellt mann die Daten für das Objekt 
zusammen. Und zum Schluss kann mann dan Anfangen die Funktionen für das 
Object (nicht für die Daten) zuschreiben. Hat mann zuviele Daten in 
einem Objekt, hat mann was falsch gemacht und sollte über weitere 
atomarere Objekte nachdenken.

Ich weiss nicht ob der Unterschid klargeworden ist.
Kann das jemand besser erklären?
Warscheinlich braucht man auch eine gewisse Zeit um den Unterschied 
erkennen zukönnen.

ciao Volker

von Manuel (Gast)


Lesenswert?

Natürlich kann man sich das so gut vorstellen. Real wird man so aber 
nicht zum OOP. Außerdem ist das was der OP als Aufgabe beschreibt 
eigentlich schon als Teil des VBA-Framework vorhanden. Ich denke nicht 
das es besonders viel Sinn macht hier über OOA/D/P Techniken 
nachzudenken. Die Aufgabe ist ja eher trivial. Ein OO Ansatz ist hier 
IMHO (zumindest für den OP) falsch.

von Frage (Gast)


Lesenswert?

Manuel:

Das VBA-Framework greift doch auf OOP zurück oder nicht? Du hast recht 
mit deiner Anmerkung, dass die bisher geführte Diskussion nicht auf 
meine Aufgabe abzielt - das muss sie aber auch nicht. Ich finde die 
Thematik OOP recht inspirierend, auch wenn ich für meine Aufgabe einen 
VBA-Kurs bräuchte. Ich möchte in Zukunft nicht immer auf VBA 
zurückgreifen, daher gefallen mir die bisherigen Beiträge sehr gut. 
Sollte ich bei der Umsetzung meiner 'eigentlich trivialen' Aufgaben 
Probleme bekommen, werde ich einen VBA-Thread hier oder in einem 
VBA/VB-Forum starten.

von Frage (Gast)


Lesenswert?

@Alle

Danke für die vielen Beiträge, wenn jetzt niemand mehr was einfällt 
lassen wir das mal so stehen. Nächstes mal werde ich mich um einen 
passenderen Betreff und klarere Fragen bemühen. Fürs Erste bin ich aber 
zufrieden. :)

von jo (Gast)


Lesenswert?

Ich zeige dir an einem Bsp wie sich OO lohnt.
Hier ein Beispielprogramm, dass sich den Namen einer Person mit dem 
dazugehörigen Alter merken kann
Nicht OOrientiert brauch man 2 Arrays, jeder Person ist ein Index 
reserviert (Person 1 die 0, Person 2 die 1 usw) Siehe das Bsp:
1
String[] namen = new String[2]; //erzeugt ein Array mit Strings
2
int [] alter = new int[2]; //erzeuge ein Array mit int, das "alter" heißt
3
 
4
5
namen[0] = "Oliver";
6
alter[0] = 67;
7
8
namen[1] = Paul;
9
alter[1] =20;
10
11
namen[2] = Max;
12
alter[2]=33;
13
14
//gebe alle namen mit dem alter aus:
15
for ( int i = 0 ; i < 2; ++i){
16
System.out.println(alter[i] + " " + namen[i]);
17
}

Wenn man das nun OOrientiert macht, denkt man näher an der realität.
die Eigenschaften die eine Person hat (hier Name und alter) werden 
zunächst in einer Klasse festgelegt, danach werden die Personen an sich 
(hier sind es die Objekte) erzeugt. Man ist dann um die gleiche Funktion 
wie oben zu erhalt viel näher an der Realität weil man dann sagt: 
"Person, "geb dich aus...".. auch ist die Programmierung an sich 
einfacher weil  man nicht mit irgendwelchen Arrays arbeitet (stell dir 
vor es kommen noch 10 weitere Eigenschaften dazu, dann wird die Lösung 
von oben sehr schnell sehr unübersichtlich, die folgende OO orientierte 
bleibt jedoch klar verständlich)
1
class Person {
2
String name;
3
int alter;
4
5
public Person (String name, int alter){
6
this.name=name;
7
this.alter=alter;
8
}
9
public gebdichaus(){
10
System.out.println(name +  " "+  alter);
11
}
12
13
Hauptprogramm:
14
15
Person Oliver = new Person ("Oliver",67);
16
Person Paul = new Person("Paul",20);
17
Person Max = new Person("Max",33);
18
19
Oliver.gebdichaus();
20
Paul.gebdichaus();
21
Max.gebdichaus();

von Karl H. (kbuchegg)


Lesenswert?

Der erste Teil deines Beispiels hinkt, denn die 'Struktur' war schon 
lange erfunden, ehe die ersten Simulationsleute über 
Objektorientiertheit nachdachten.

Der zweite Teil ist ok. Genau darum geht es auch in OOP: Das die Daten 
aus ihrer passiven Rolle heraus geholt werden und insofern aktiv werden, 
als man sich Funktionsaufrufe als Befehle an diesen Datensatz vorstellen 
kann.

von jo (Gast)


Lesenswert?

>>Nicht OOrientiert brauch man 2 Arrays....

von Karl H. (kbuchegg)


Lesenswert?

jo schrieb:
>>>Nicht OOrientiert brauch man 2 Arrays....

und das ist quatsch
1
struct Person
2
{
3
  char name[80];
4
  int  alter;
5
};
6
7
...
8
9
  Person* Belegschaft = malloc( NrPersonen * sizeof( Person ) );
10
11
  strcpy( Belegschaft[0].name, "Gustav" );
12
  Belegschaft[0].alter = 48;
13
14
  strcpy( Belegschaft[1].name, "Albert" );
15
  Belegschaft[1].alter = 27;
16
17
  //gebe alle namen mit dem alter aus:
18
  for ( int i = 0 ; i < 2; ++i){
19
    printf( "%s - %d\n", Belegschaft[i].name, Belegschaft[i].alter );
20
}


Ganz normale Struktur, aus der 1 Array gebildet wird. OOP hat nichts 
damit zu tun, ob man aus Einzeldaten größere Einheiten bildet oder 
nicht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.