| Autor |
Beitrag |
Kroni
      
Beiträge: 720
Win 98, Win ME, Win2k, Win XP
D3 Pro
|
Verfasst: Fr 22.10.04 23:53
Wo liegt genau der Sinn in der OOP?
Ich meine, ich komme im moment noch mit der stinknormalen Pascal-Syntax klar.
Wofür brauch ich das dann genau?
Ich meine, ich les grad noch n paar Tutorials und den Abschnitt von Delphi for Kids von der Schule durch, aba ich verstehe noch nicht genau, wofür ich das brauche.
Kann mir da wer helfen? Oder einen guten Grund nennen, warum ich das Benutzten sollte und wofür?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 23.10.04 01:41
Kurzgesagt: OOP erleichtert die Verwaltung von Daten, die zu einem gemeinsamen Element gehören.
Beispiel:
In einem Adressbuch hat jeder Kontakt ein bestimmtes Objekt zugeordnet, dass die Information über Name, Anschrift, ... enthält. erweiterst du nun dein Adressbuch um z.B. eine Emailadresse, dann kannst du mit OOP immernoch die alten Dateien lesen, kannst aber trotzdem ohne weiteres deine Emailadresse zu einem Kontakt hinzufügen, weil deiner Objektverwaltung nicht bekannt sein muss, ob es sich bei einem Kontakt-Objekt um eines aus der ersten Version, oder einem aus der zweiten Version handelt.
Würdest du stink-normales Reinpascal nutzen, müsstest du die Records, auf die dies hinauslaufen würde getrennt verwalten müssen, oder deine alten Datendateien konvertieren müssen, damit sie in der neuen Version noch lesbar wären.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Alni
      
Beiträge: 205
Win 2000, XP, SuSe, Debian
D5 Prof, D7 Prof, Kylix
|
Verfasst: Sa 23.10.04 02:50
Es ist zwar nich falsch was BenBE sagt, aber das Beispiel gefällt mir nicht. Ich versuche mal den Zweck von OOP allgemeiner zu erläutern:
1. OOP hat nicht direkt mit der Verwaltung von Daten zu tun.
2. Es wurde erdacht um modalere(Ich weiß das wird ein Diskussionspunkt) übersichtlichere Programme zu ermöglichen (grob formuliert)
3. Kernpunkt ist wie der Name schon sagt ein oder mehrere Objekte.
4. Es beginnt mit einer Klasse.
5. von einer Klasse können "beliebig" viele Objekte erstellt werden.
6. Eine Klasse beschreibt Funktionen und Eigenschaften von Objekten.
7. Ein Beispiel wäre eine Klasse die einen Counter darstellt.
So beschreiben bspw 2 Funktionen das hoch- oder runterzählen des Counters. Ausserdem könnte diese Klasse die Eigenschaft Zählerstand besitzen. Von dieser Klasse Counter lassen sich dann Objekte erstellen. Zum Beispiel Counter1(der zählt eine Variable)und Counter2(der zählt irgend etwas anderes).Ohne OOP müsste man zwei Counter die eigentlich grundlegend gleich sind, jeweils extra implementieren. So reicht es einmal und man kann beliebig viele Counter dieser Art verwenden ohne großen Aufwand.
8. Das beudeutet bei einem Fehler muss bei OOP nur einmal die Klasse korrigiert werden. Ohne OOP müsste man evtl. jeden Counter(in diesem Beispiel) einzeln überarbeiten.
Übrigens sind zwar Delphi und C++ objektorientierte Sprachen, aber das heißt nicht, dass die Ergebnisse automatisch OOP entsprechen. (Sobald man auch nur eine globale Variable benutzt ist es nicht mehr echt OOP)
Es kann sein, dass ich aufgrund der späten Stunde, Fehler gemacht habe. Verzeiht und korriegiert mich
_________________ MfG Alex
|
|
Kroni 
      
Beiträge: 720
Win 98, Win ME, Win2k, Win XP
D3 Pro
|
Verfasst: Sa 23.10.04 11:29
Also läuft OOP darauf hinaus, dass ich nur einmal etwas programmieren muss und es dann mehrmals verwenden kann.
Und es die Übersichtlichkeit erhöht?
Ich werde mich mal im Internet weiter schlau nach Tutorials machen, und hier in der Tutorial sparte weiter suchen.
Na ja, ansonsten warte ich, bis mein Lehrer mir das Erklärt, aber ich möchte sowas immer viel zu gerne sofort wissen....
Danke schonmal für die Antworten.
Kroni
|
|
MartinPb
      
Beiträge: 698
|
Verfasst: Sa 23.10.04 11:51
Ups, kleiner Fehler...
_________________ Gruß
Martin
Zuletzt bearbeitet von MartinPb am Sa 23.10.04 16:59, insgesamt 1-mal bearbeitet
|
|
Maweki
      
Beiträge: 197
Ubuntu Linux
Lazarus
|
Verfasst: Sa 23.10.04 11:54
also ich hab auch bis vor 2 Wochen nix von gehalten. Ich hab immer alles so geschafft.
Wo ich den Vorteil sehe: ein Objekt kann seine eigenen Daten verarbeiten.
Mein Paps hatte geburtstag und die ganze Verwandtschaft kam. damit die nich rumnerven, hab ich was zum vorzeigen gecodet. Eine Stadt aus 60 mal 40 10px Tiles. Nur Wiese und Strasse. Und dort wollte ich x autos rumfahren lassen.
Und vielleicht siehst du anhand der Klasse, was fuer eine Erleichterung OOP war:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81:
| unit UnitAuto;
interface
uses Graphics, Windows, Stadt;
type TAuto=Class public Name: string; CarColor: TColor; CarPosition: TPoint; Richtung: Byte; constructor Create(Color: TColor; Position: TPoint; Namen: string); procedure Move; private end;
implementation
constructor TAuto.Create(Color: TColor; Position: TPoint; Namen: string); begin inherited create; Name := Namen; CarColor := Color; CarPosition := Position; Richtung := 0; end;
procedure TAuto.Move; var CanMove: Array [0..3] of Boolean; BanDirection, NewDirection: Byte; begin If (CarPosition.Y > 0) and (Stadt.Feld[CarPosition.X, CarPosition.Y - 1]) then CanMove[0] := true else CanMove[0] := false; If (CarPosition.X < 59) and (Stadt.Feld[CarPosition.X + 1, CarPosition.Y]) then CanMove[1] := true else CanMove[1] := false; If (CarPosition.Y < 39) and (Stadt.Feld[CarPosition.X, CarPosition.Y + 1]) then CanMove[2] := true else CanMove[2] := false; If (CarPosition.X > 0) and (Stadt.Feld[CarPosition.X - 1, CarPosition.Y]) then CanMove[3] := true else CanMove[3] := false;
Case Richtung of 0, 1: BanDirection := Richtung + 2; 2, 3: BanDirection := Richtung - 2; end;
repeat NewDirection := Random(4); CanMove[BanDirection] := false; If (CanMove[0] or CanMove[1] or CanMove[2] or CanMove[3]) = false then begin CanMove[BanDirection] := true; NewDirection := BanDirection; Break; end; until (NewDirection <> BanDirection) and CanMove[NewDirection];
Richtung := NewDirection; Case Richtung of 0: Dec(CarPosition.Y); 1: Inc(CarPosition.X); 2: Inc(CarPosition.Y); 3: Dec(CarPosition.X); end; end;
end. |
Jedenfalls hat sich damit jedes Auto selbst bewegt und ich musste nur noch Auto5hastenichgesehen.Move; eingeben und schon hat es sich bewegt. Das is mal richtig uebersichtlich dann...
Edit: der Zweidimensionale Array "Feld" besteht aus Boolean, wobei True bedeutet, dass man dort fahren kann. Ist also eine Strasse...
|
|
Alni
      
Beiträge: 205
Win 2000, XP, SuSe, Debian
D5 Prof, D7 Prof, Kylix
|
Verfasst: Sa 23.10.04 12:38
Maweki hat mich auf ein Besipiel gebracht für einen der wichtigsten Punkte von OOP: Veerbung
Zum beispiel hat man eine Klasse namens Fahrzeug. In der Klasse ist z.B. definiert, dass sich ein Fahrzeug bewegen kann. Von dieser Klasse(Basisklasse) kann man jetzt neue Klassen(Unterklassen) ableiten(PKW, LKW, Motorräder, Fahrräder), die alle Eigenschaften "erben". Wenn du jetzt Objekte der Unterklassen erstellst (z.B ein blaues,rotes Motorrad und 2 gelbe PKW) und diese fahren lassen willst musst du nicht unterscheiden um welchen Typ es sich handelt, es reicht wenn du weißt dass alle von der Klasse Fahrzeug abstammen. Du musst also nur die Funktion der KLasse Fahrzeug zum Bewegen aufrufen. Wie es sich dann letztendlich bewegt ist dann in den Unterklassen festgelegt. Das heißt wenn wir die Stadt von Maweki nehmen sagen wir einfach wir haben 100 Fahrzeuge und die sollen sich bewegen. Das ist einfacher als vorher festzulegen, dass es 80 PKWs und 20 Motoräder sind. Oder man kan, da sie von der gleichen Basisklasse abstammen einfach ein Auto durch ein Motorrad ersetzen.
Ich hoffe ich hab das jetzt irgendwie verständlich erklärt
_________________ MfG Alex
|
|
Maweki
      
Beiträge: 197
Ubuntu Linux
Lazarus
|
Verfasst: Sa 23.10.04 12:42
koenntest du bitte mal die abgeleitete Klasse dazu schreiben. thx
vielleicht hilft das der veranschaulichung...
|
|
Kroni 
      
Beiträge: 720
Win 98, Win ME, Win2k, Win XP
D3 Pro
|
Verfasst: Sa 23.10.04 12:52
ok, soweit habe ich das verstanden.
also ist es dafür da, dass ich wenn ich mehrere Objekte mit den selben Eigenschaften brauche, dass ich dann eines Definiere, und alle anderen davon ableite....
nur kann ich da zb in meinem Passwortgenerator keinen gebracuh von machen. Da baut noch alles auf "alten" Prozeduren auf....
Na ja, ich werd das ja wohl schon noch lernen von meinem Lehrer oder sonst wie, was mir das brignt, OOP zu benutzen.
Also, klar die Vorteile habe ich gesehen und weiß auch in etwa, wie das Funktioniert, nur eben nicht, wie ich das im moment in meinen "kleinen" Projekten unterbringen kann.
|
|
Maweki
      
Beiträge: 197
Ubuntu Linux
Lazarus
|
Verfasst: Sa 23.10.04 12:55
es lohnt natuerlich nich immer, das is klar.
Aber lauf Lehrer wuerde ich an der Stelle nicht vertrauen. Wie schon gesagt. Ein Objekt kann durch OOP seine Daten selbst verarbeiten...
Naja, wenn du noch Fragen hast, einfach fragen 
|
|
Kroni 
      
Beiträge: 720
Win 98, Win ME, Win2k, Win XP
D3 Pro
|
Verfasst: Sa 23.10.04 13:03
Klar, ich hab schon sehr viel gelernt hier im Forum...und konnte auch schon einigen Leuten selber helfen...auch hier nochmal großes lob ans Forum*g*
Na ja, ich denke meinem Lehrer doch vertrauen zu könnnen, das ist ein absoluter Profi.
Der Programmiert für unsere Schule Physikprogramme usw selber, und sonstiges. Hat im nahen Osten den Leuten mal Programmieren beigebracht, soweit ich weiß. Der kann schon so einiges, und bringt einen auch weiter.
Also mal erstmal noch weiter Grundlagen lernen*g*
aber ich bin zuversichtlich, dass ich dann irgendwann ncohmal weiß, OOP zu schätzen*g*
Aber danke nochmal für die Antworten, jetzt weiß ich schon wieder mehr.
Und das Beispiel mit der Stadt und den Autos war auch gut!
Das hat mir auch schon etwas geholfen. So brauche ich dann zb nicht für jedes Auto oder Motorrad eine eigenen Prozedur, sonder kann einfach für jedes Auto bzw Motorrad, das der Klasse TAuto angehört, die Prozedur bewegung aufrufen usw....hab ich doch richtig verstanden oder?*g*
Kroni
|
|
Alni
      
Beiträge: 205
Win 2000, XP, SuSe, Debian
D5 Prof, D7 Prof, Kylix
|
Verfasst: Sa 23.10.04 16:33
Zur Verdeutlichung:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
| TFahrzeug = class private AnzahlderRaeder : byte; Position : TPoint; FahrzeugFarbe :TColor; public procedure fahrenachXY(Ziel:TPoint); end;
TAuto = class(TFahrzeug) private Benzin: byte; public procedure auftanken; procedure fahrenachXY(Ziel:TPoint); overload; end;
TFahrrad = class(TFahrzeug) end;
TStadt = class private Fahrzeuge: array[1..100] of TFahrzeug; end;
implementation
procedure TFahrzeug.fahrenachXY(Ziel:TPoint); begin Position.X:=Ziel.X; Position.Y:=Ziel.Y; end;
procedure TAuto.fahrenachXY(Ziel:TPoint); begin if (Benzin > 0) then begin Position.X:=Ziel.X; Position.Y:=Ziel.Y; Benzin:=Benzin-1; end; end;
procedure TAuto.auftanken; begin Benzin:=100; end; |
und wenn jetzt Muenchen ein Objekt der Klasse TStadt ist kann man
mit
Delphi-Quelltext 1:
| Muenchen.Fahrzeuge[1].fahrenachXY(Ziel); |
ein Fahrzeug bewegen ohne zu Wissen ob es ein Fahrrad ist oder ein Auto
P.S.:Dies soll nur ein Beispiel sein und ist nicht unbedingt die beste Variante.
_________________ MfG Alex
|
|
MartinPb
      
Beiträge: 698
|
Verfasst: Sa 23.10.04 17:20
| Kroni hat folgendes geschrieben: | Das hat mir auch schon etwas geholfen. So brauche ich dann zb nicht für jedes Auto oder Motorrad eine eigenen Prozedur, sonder kann einfach für jedes Auto bzw Motorrad, das der Klasse TAuto angehört, die Prozedur bewegung aufrufen usw....hab ich doch richtig verstanden oder?*g*
Kroni |
So ausgedrückt würde ich dem nicht zustimmen. Das ist eine Begründung wieso man Codes in Prozeduren packt. Man kann eine Prozedure Move schreiben und damit alle Fahrzeuge bewegen. Wo ist das Problem? Wozu gibt es Parameter bei Prozeduren? Dafür brauchst du keine Klasse. Das kannst du auch anders lösen. Anscheindent bist du nicht in der Lage das wesentliche zu erkennen.
Du tapst immer noch im dunkeln. Ich würde es einfach lassen. Sollange du ohne selbsterstellte Klassen auskommst, programmiere normal. Irgendwann kommst du an einen Punkt an dem es dir kompliziert ist normal zu programmieren und dann wirst du automatisch Klassen verstehen.
Obwohl das Beispiel oben durchaus eine Klassenberechtigung hat. Das wollte ich nicht ausdrücken.
_________________ Gruß
Martin
|
|
Kroni 
      
Beiträge: 720
Win 98, Win ME, Win2k, Win XP
D3 Pro
|
Verfasst: Sa 23.10.04 17:21
Ok, ich habs verstanden, worum es geht....nur finde ich wie gesagt im moment nochkeine Anwendung in meinen Programmen *g*
Danke aber für eure Mühe.....=)
Seid echt nett.
|
|
MartinPb
      
Beiträge: 698
|
Verfasst: Sa 23.10.04 17:28
| Kroni hat folgendes geschrieben: | Ok, ich habs verstanden, worum es geht....nur finde ich wie gesagt im moment nochkeine Anwendung in meinen Programmen *g*
Danke aber für eure Mühe.....=)
Seid echt nett. |
Delphi ist immer noch Pascal und Pascal ist keine Sprache die als Objektorientierte Sprache entwickelt wurde. Das bedeutet, daß du sehr vieles mit dem reinen Pascal programmieren kannst. Auch wenn du permanent mit Objekten zu tun hast, so bist du nicht so wie z.B. bei Java gezwungen permanent Objekte zu entwickeln.
_________________ Gruß
Martin
|
|
Alni
      
Beiträge: 205
Win 2000, XP, SuSe, Debian
D5 Prof, D7 Prof, Kylix
|
Verfasst: Sa 23.10.04 18:14
| MartinPb hat folgendes geschrieben: |
Delphi ist immer noch Pascal und Pascal ist keine Sprache die als Objektorientierte Sprache entwickelt wurde. Das bedeutet, daß du sehr vieles mit dem reinen Pascal programmieren kannst. Auch wenn du permanent mit Objekten zu tun hast, so bist du nicht so wie z.B. bei Java gezwungen permanent Objekte zu entwickeln. |
C++ ist immer noch C und C ist keine Sprache die als Objektorientierte Sprache entwickelt wurde. Das bedeutet, daß du sehr vieles mit dem reinen C programmieren kannst.
Können ja aber man sollte nicht. C und Pascal waren keine objektorientierten Sprachen, C++ und Delphi aber schon. Diese haben nur ein "Problem": Man kann auf Objekte verzichten und im alten Stil programmieren. Ein schönes Beispiel für eine objektorientierte Sprache wäre SmallTalk.
_________________ MfG Alex
|
|
Kroni 
      
Beiträge: 720
Win 98, Win ME, Win2k, Win XP
D3 Pro
|
Verfasst: Sa 23.10.04 18:42
man man man....ist ja n sehr interessantes Thema merke ich gerade...
na ja, nur solange ich so kleine Anwendungen Programmiere, die aus vier oder fünf Prozeduren bestehen, und ein Passwort erzeugen, warum sollte ich denn da schon OOP benutzen?
Na ja, wie gesagt, es fehlen mir halt noch die Bereiche wo ich das anwenden kann, bzw einfach die nötige Praxis, weil ich sonst immer "normal" Programmiert habe.....
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 23.10.04 19:50
| Alni hat folgendes geschrieben: | C++ ist immer noch C und C ist keine Sprache die als Objektorientierte Sprache entwickelt wurde. Das bedeutet, daß du sehr vieles mit dem reinen C programmieren kannst.  |
C++ ist immer noch C und C ist keine Sprache, sondern eine Zumutung  (MHO). Ansonsten stimm ich dir zu.
| Alni hat folgendes geschrieben: | | Können ja aber man sollte nicht. C und Pascal waren keine objektorientierten Sprachen, C++ und Delphi aber schon. Diese haben nur ein "Problem": Man kann auf Objekte verzichten und im alten Stil programmieren. |
Ich kenn genügend Puristen hier im Board, die die Objektorientierung nicht nutzen. Wobei, man kann drauf verzichten, wenn man alles z.B. über die WinAPI macht. Aber warum? Außer kleinere Programme und unübersichtlicheren Code bringt's nicht.*
Sicherlich kann man vieles auch ohne OOP erledigen, aber wenn man OOP gut beherrscht, kann man sich sehr viel Entwicklungsaufwand sparen, weil man Dopplungen an Quelltext vermeiden kann.
* Diverse andere Vorteile seien hier bitte jetzt außen vor gelassen!
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
bms
      
Beiträge: 735
Win XP
Delphi 3, Delphi 6 PE, Delphi 2005 PE
|
Verfasst: Sa 23.10.04 20:54
| Zitat: | | C++ ist immer noch C und C ist keine Sprache, sondern eine Zumutung |
Ansichtssache. Man darf C nicht wie Basic oder Pascal sehen. Basic kann auch ein Nichtprogrammierer lesen. Die Programme sind so aufgebaut wie man denkt. Bei Pascal wir es schon problematischer, da es Konventionen gibt an die man sich halten muß. Bei C ist das ganz anders. Man sollte den paar Ähnlichkeiten bei IFs und FORs kein zu große Bedeutung beimessen. C ist dazu da eine Aufgabe zu lösen. Da schreibt man kein FOR x := 0 to y, sondern eben FOR (x=0; x<=y; x++). Da muß man eben wissen was es bedeutet. Da muß man eben programmieren können 
_________________ VORSICHT: Ich behersche seit heute die Fünf-Finger-Handflächen-Herz-Explodier-Schlag-Kampf-Technik >
|
|
Luzzifus
      
Beiträge: 200
Win2K
D6 Prof
|
Verfasst: Sa 23.10.04 21:04
| Zitat: | | C++ ist immer noch C und C ist keine Sprache, sondern eine Zumutung |
ganz meine meinung.
| Zitat: | | Ansichtssache. Man darf C nicht wie Basic oder Pascal sehen. |
das ist es aber.
| Zitat: | | Basic kann auch ein Nichtprogrammierer lesen. Die Programme sind so aufgebaut wie man denkt. Bei Pascal wir es schon problematischer, da es Konventionen gibt an die man sich halten muß. Bei C ist das ganz anders. Man sollte den paar Ähnlichkeiten bei IFs und FORs kein zu große Bedeutung beimessen. C ist dazu da eine Aufgabe zu lösen. Da schreibt man kein FOR x := 0 to y, sondern eben FOR (x=0; x<=y; x++). Da muß man eben wissen was es bedeutet. Da muß man eben programmieren können |
da gibt es keinen unterscheid zu delphi oder pascal. meine kritik an c++ wären auch nicht die syntaxunterschiede zu delphi oder anderen höheren programmiersprachen, sondern eher die ganzen kinderkrankheiten, die c++ hat durch dieses ganze alberne "das soll so flexibel wie möglich sein". umgang mit delphi kann man in absehbarer zeit lernen, c++ kann man erst nach vielen jahren perfektionieren. das hat nichts mit programmieren können zu tun, sondern viel mehr mit "alle 20 eigenheiten jedes izi-wizi-befehls kennen". c++ ist nicht nur eine zumutung, sondern viel mehr eine krankheit.
|
|
|