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
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
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"
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.
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.
@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?
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.
>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.
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
>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?
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.
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
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.
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.
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
@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?
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++?
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
staticintStack[100];
2
staticintStackPtr;
3
4
voidPush(intvalue)
5
{
6
Stack[StackPtr++]=value;
7
}
8
9
intPop(void)
10
{
11
returnStack[--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)
@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
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. :)
@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. :)
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
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.
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.
@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. :)
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=newString[2];//erzeugt ein Array mit Strings
2
int[]alter=newint[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(inti=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)
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.