Autor Beitrag
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mi 09.04.03 23:21 
Hallo,
ich möchte anfagen mit Klassen zu arbeiten...
was für Vor und Nachteile gibt es bei Klassen ???

_________________
MFG
Michael Springwald, "kann kein englisch...."
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Mi 09.04.03 23:49 
hmm, was benutzt du denn bis jetzt um daten, strukturen usw im speicher zu repräsentieren? Zig variablen? Das wird auf jeden Fall was längeres, die ganzen vor und nachteile auseinanderzunehmen...

Vorteile finde ich auf jeden fall, daß man datenoperationen gut wegkapseln kann. D.h. Eine methode a benötigt einen wert aus klasse xyz.
xyz muss diesen wert noch aus zwei oder drei feldern berechnen und liefert ihn dann zurück. Wenn sich nun die Implementierung der berechnung ändert kratzt das methode a nicht, hauptsache xyz liefert immer noch den selben typ...

Der Code wird im allgemeinen Wiederverwendbarer, da die klassen sachen bereitstellen und die methoden, einfach nur noch ne klasse instantiieren und sich nicht um das datenmanagement kümmern. So kannst du die Klasse auch schnell mal in einem anderen programm verwenden, ohne dort den ganzen code neu zu schreiben Stichwort re-usability

Gruß
Ken
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Do 10.04.03 00:20 
also in meinen Spielen verwende ich record... das klapt auch gans gut...
könnte man nicht eine Stichwörter liste machen ?

_________________
MFG
Michael Springwald, "kann kein englisch...."
Nightmare_82
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 260



BeitragVerfasst: Do 10.04.03 01:33 
Vorteile von Klassen :
- übersichtlicher
- leicht Erweiterbar(durch Vererbung)
- verbrauchen keinen Speicher bevor sie nicht erstellt wurden(im Gegensatz zu Records)
- du kannst zwei Klassen, die von derselben Basisklasse abstammen leicht austauschen(2 Grafik-Engines etc.)
- du kannst verschiedene Funktionalitäten besser kapseln

Nachteile:
- du musst dich selbst um das create und free kümmern
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 10.04.03 03:55 
Fremde können mit deienm Cod emehr anfangen, weill sie die Schnittstellen zurverfügung haben. Der eigentliche Code hat sie gar nicht zu kümmern. Kuck dir als Beispiel mal mein DLLExport in der Open-Source-Sektion an. Der eigentliche Code steckt in der Klasse TDLLInfo. Die brauchst du eigentlich nur deinem Projekt hinzuzufügen und die Methoden im Programm einfach aufrufen fertig. Du mußt nur eine Instanze der Klasse erstellen, dann hast du ein Objekt, mit dem du dann arbeiten kannst. Brauchst du es nicht mehr, mußt du nur daran denken, es wieder mit Free freizugeben.

Klassen sind wie eine Blackbox. Die Klasse ist der Inhalt, der den Programmierer eigentlich nicht zu interessieren hat. Nach außen sichtbar sind nur die Schnittstellen, sprich Methoden und Properties.

OK ich habe gerade etwas Zeit. Also hier ein kleiner Crash-Kurs. Als Beispeil nehme ich meine Klasse TDLLInfo:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
type TDLLInfo = class
  private
    FDLLFilename : String;
    FFuncsCount  : DWORD;
    FNames       : TStringArray;
    FOrdinals    : TWORDArray;
    FAddresses   : TPointerArray;
    FVersionInt64: Int64;
    FVersion     : String;
    FSize        : Int64;
    FSectionCount: DWORD;
    procedure DumpExportDirectories;
    procedure GetBuildInfo;
    procedure BuildInfoToStr(Value: Int64);
  public
    constructor create(Filename: String);
    property FuncsCount : DWORD read FFuncsCount;
    property FuncNames : TStringArray read FNames;
    property FuncOrdinals : TWORDArray read FOrdinals;
    property FuncAddresses : TPointerArray read FAddresses;
    property Version : String read FVersion;
    property Size : Int64 read FSize;
    property SectionCount : DWORD read FSectionCount;
end;


Alles was unter private steht ist nur für die Klasse sichtbar, aber nicht nach außen. Hingegen alles was unter public steht ist nach außen sichtbar. Die privaten Variablen einer Klasse nennt man Member-Variablen und auf Grund der Namenskonvention beginnen sie alle mit einem F. Man hätte sie auch public machen können, aber üblicherweise läßt man keinen direkten Zugriff auf sie zu, sondern macht es mit properties, da kan man dan sicherstellen, dass sie auch mit einem sinnvollen Inhalt gefüllt sind. Dann gibt es noch zum Beispiel die private Methode procedure DumpExportDirectories;. Sie ist dafür verantwortlich die Member-Variablen mit Werten zufüllen. Dies geschieht in Create, also im Initialationsabschnitt der Klasse.

So eine Klasse hilft auch ein komplexes Problem in mehrere kleiner übersichtlichere Problem zu zerlegen. Man kuckt erst was brauche ich für Variablen, dann implementiert man den Code, um sie zufüllen (meist private Methoden) und dann definiert man eine Schnittstelle (public) nach außen. Dann kann man die Klasse beliebig erweitern. Wichtig ist nur, dass man sinnvolle Schnittstellen zur Verfügung stellt. Ändert man jetzt den Code (verbessern, optimieren), tut man dies in den privaten Merthoden. Läßt man die Schnittstelle unangetastet, kann man einfach den Unit / Klasse im eigentlichen Programm austauschen ohne, dass man Änderungen am Code im Programm vornehmen muß.

Dies ist auch sehr vorteilhaft, wenn man im Team programmiert. Man definiert sich die Schnittstellen, dann kann der eine die Klasse schreiben und er andere kann das Programm entwicklen. Zum Schluß führt man dann alles zusammen und fertig.
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Do 10.04.03 08:00 
Ich schätze, daß man den größten Vorteil sehr gut anhand einer Komponente (denn das ist auch eine Art Klasse) zeigen kann. Erstelle ein leeres Projekt und gib irgendwo diese Zeile ein:

Form1.Color := clBlue;

Eigentlich hast du nur eine Farbe zugewiesen. Aber was ist passiert? Das Formular ist blau geworden. Mach das mal mit einer Unit nach. Vereinbare eine TColor Variable und mach, daß beim Zuweisen der Farbe ein Canvas blau gefärbt wird. Kriegst du nicht hin. Bei einer Klasse kannst du Variablenzuweisung mit einer Prozedur vermischen (einfach ausgedrückt).

_________________
Popov
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 10.04.03 11:24 
Hallo Popov,

da würfelst jetzt aber was durcheinander. Units und Klassen sind nciht miteinander vergleichbar. Im gegenteil, Klassen sind für gewöhnlich bestandteile von Units. Units sind nur Kontainer für code jeglicher Art.

Was du beschreibst sind propertys eine spezialität von Delphi-Klassen (in vielen anderen OO-Programmiersprachen gibt es soetwas nicht). Das ist die möglichkeit Proceduren, Funktuonen, Variablen, Konstanten in Kombination als Variable oder konstante zu verkleiden.

So ist es z.B. möglich eine Variable die in der Klasse verwendet wird der Aussenwelt als Constante, also Read Only zur verfügung zu stellen.
Beispiel:
ausblenden Quelltext
1:
2:
3:
4:
private
  fNumObject : LongInt; // Variable für alle Funktionen der Klassen
public
  property Count : LongInt read fNumObjekt; // Konstannte für alle metoden inerhalb und außerhalb der Klasse

Man kann so auch eine Prozedure als Schreibeeigenschaft deklarieren wie du es beschrieben hast:
Beispiel:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
private
  fColor : tColor; // Speichert die aktuelle Farbe des Objektes
  procedure Draw; // Zeichnet das Objekt in der Farbe fColor
  procedure SetColor(Value : tColor); // Behandlungsroutine des Propertys
public
  property Color : tColor read fColor write SetColor;
[...]
procedure tMyClass.SetColor(Value : tColor);
begin
  fColor := Value;
  Draw;
end;


Eine solche Methode kann natürlich noch wesentlich mehr möglichkeiten, wie z.B. die überprüfung, ob der übergebene Wert gültig ist usw. für den Benutzer der Klasse sieht es immer wie eine Variable aus.

Das ist sicher eine sehr schicke Eigenschaft der Delphi Klassen. Jeder Wert der im Objektinspektor bearbeitet werden kann ist übrigens ein Property.

Gruß
Klabautermann
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Do 10.04.03 15:47 
Klabautermann hat folgendes geschrieben:
Hallo Popov,

da würfelst jetzt aber was durcheinander. Units und Klassen sind nciht miteinander vergleichbar. Im gegenteil, Klassen sind für gewöhnlich bestandteile von Units. Units sind nur Kontainer für code jeglicher Art.


Ich bringe hier nichts durcheinander - es ist nur eine Erklärung. Aber in der Regel sind die Fragen immer so - was ist der Vorteil einer Klasse gegenüber einer Unit? Das war hier zwar nicht die Frage, aber hier kamm schon die Frage auf - was ist der Unterschied zwischen Klassen und Records?

Wenn ich also eine Unit ins Spiel bringe, dann ist es nicht als Vergleich gedacht, sondern eine Konstante an der man den Unterschied feststellen kann.

Außerden (ich hab mir den Text noch mal durchgelesen), habe ich die Klasse anhand der Komponente verglichen, nicht mit einer Unit.

_________________
Popov
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 10.04.03 15:55 
Popovs Vergleich von Klassen und Units ist eigentlich ganz treffend. Mein alter Herr meinte zu mir, als ich ihm die Vorteile von OOP näher bringen wollte, "Wie, Kapselung in Klassen? Also da mache ich einfach eine Unit. Ha! Gabs schon vor 20 Jahren!".
Tatsächlich ist es ein enormer Vorteil von Delphi, durch eine Wertzuweisung zu etwas, das sich wie eine Variable verhält, sofort Aktionen auslösen zu können, wie z.B. das Neuzeichnen des Steuerelements.

Cu,
Udontknow
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Do 10.04.03 16:53 
@Luckie

Ich hab mir gerade dein Beitrag oben durchgelesen. Was hällst du davon deinen kleinen Crashkurs hier als FAQ Beitrag zu stellen. Vielleicht kannst du es noch etwas ausweiten. Ansonsten finde ich den Beitrag (für die Länge) für gut gelungen. In der Regel wird der ganze Schmus in Büchern über 10 Seiten verteilt.

_________________
Popov
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 10.04.03 19:01 
Hallo,
Udontknow hat folgendes geschrieben:
Popovs Vergleich von Klassen und Units ist eigentlich ganz treffend. Mein alter Herr meinte zu mir, als ich ihm die Vorteile von OOP näher bringen wollte, "Wie, Kapselung in Klassen? Also da mache ich einfach eine Unit. Ha! Gabs schon vor 20 Jahren!".

Aber auch klassen werden in Units aufbewart.
Abstrahieren wir mal:
Stell dir vor du bist ein alter Zeitungssetzer. So einer der wirlich für alle Buchstaben seine kleinen "rohlinge" hat und diese an zu Worten zusammen setzt. Diese kannst du jetzt natürlich in eine Schublade legen und ncihts geht verloren (Unit) du kannst aber auch Setzkästen benutzen, in denen für jeden Buckstaben ein eigener Bereich vorgesehen ist (Klasse). Von diesen Setzkästen kannst du wieder mehrere in eine Schublade stecken.
Schubladen und setzkäsen sind nciht das gleiche - sie sind nicht wirklich vergleichbar. Die setztkästen biten dir Tolle neue möglichkeiten und da deine Buchstaben nicht mehr durcheinander kullern wirst du auch schneller mit der Arbeit fertig. Dennoch solltest du auf die Schublade nicht verzichten. Derjenige der die Zeitung am ende liest, sieht natürlich nicht, wie du deine Zeichen aufbewarst, es kann ihn auch egal sein.
Deshalb ist es auch relativ schwer begeisterung für klassen zu schaffen, der Programmierer der dies lernen soll mus sich erstmal umtainieren (Buchstaben einsotzieren und nach jeden Gebrauch wieder zurücklegen) und das erste was er fragt wird sein: "Was kann mein Programm damit mehr?". Da muss man ihn antworten das es nichts mehr kann, dass was es kann wurde nur auf eine bessere Art erreicht. Die Zeitung bleibt gleichgut egal wie man sie erstellt ;).

popov hat folgendes geschrieben:
Außerden (ich hab mir den Text noch mal durchgelesen), habe ich die Klasse anhand der Komponente verglichen, nicht mit einer Unit.

Ja, du hast völlig korreckt festgestellt, das Komponenten auch blos Klassen sind. Das habe ich zur kentnis genommen.

Ich bezog meine aussage auf diese Aufforderung:
popov hat folgendes geschrieben:
Aber was ist passiert? Das Formular ist blau geworden. Mach das mal mit einer Unit nach.

Natürlich kann man das so nicht mit einer einfachen Variablendeklaration nachmachen, aber es ist durchaus möglich den selben Effekt mit Proceduraler Programmierung hinzubekommen, mann benötigt dann eben eine Procedure und eine Funktion (die man für Property ja auch oft hat). Aber sowoh deine Klasse, als auch meine Funktion befinden sich in einer Unit. Das kann sogar die selbe sein.
popov hat folgendes geschrieben:
Aber in der Regel sind die Fragen immer so - was ist der Vorteil einer Klasse gegenüber einer Unit?

Ja, da hast du recht, häufig werden sollche fragen von meist unerfahrenen Programmierern gestellt. Dann sollte meiner Meinung nach aufklährung betrieben werden. Genau das habe ich mit meiner Reaktion auf dein Posting erreichen wollen.

Gruß
Klabautermann
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 10.04.03 21:08 
@Popov: Meinst du wirklich? Mir kommt das noch alles etwas ungehobelt und "unrund" vor. Auch hat es wohl ziemliche Lücken. Desweiteren müßte ich mich erstmal selber etwas mehr in das Thema reinlesen, damit ich da keinen Blödsinn verzapfe.
Daran gedacht so was mal zu schreiben habe ich schon lange, nur habe ich nie die Ruhe, Zeit und Muse gefunde es umzusetzen.
Aber jeder der will, kann den Text als Grundlage nehmen und es in die FAQ setzen.
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Do 10.04.03 21:17 
wow: so viele anworten:
Zitat:

Was du beschreibst sind propertys eine spezialität von Delphi-Klassen (in vielen anderen OO-Programmiersprachen gibt es soetwas nicht).

Das wuste ich garnicht. Ein nachtbar meinte letzten noch, das man Delphi erst OPP beibriegen müsste(Frag mich nicht warum)

scheint ja wirklcih ein tolls thema zu sein(habe mir nicht alles durchgelesen :lol:
Ich werde mich mal mit klassen auseinander setzen, wenn sie wirklich so toll sein sollen wie ihr beschreibt... und stimmt das, das der einzigte nachteil ist das mit Free und Create ?

_________________
MFG
Michael Springwald, "kann kein englisch...."
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 10.04.03 21:31 
Sehe ich nicht als Vor- oder Nachteil. Wenn du dir die Hände waschen willst, drehst du ja auch normalerweise erst den Wasserhahn auf und dann wieder zu. Oder läuft bei euch der Wasserhahn 24/7? :shock:
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Do 10.04.03 21:43 
was hat es damit zu tuen ?
verstehe ich jetzt nicht :(

_________________
MFG
Michael Springwald, "kann kein englisch...."
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 10.04.03 21:51 
Nix kapiert, wie?
Also wenn du eine Instanz der Klasse brauchst erstellst du sie mit create (du drehst den Wasserhahn auf), dann benutzt du das Objekt (du wäschst dir die Hände) und wenn du fertig bist, gibst du den Speicher wieder mit Free frei (du drehst den Wasserhahn wieder zu).

Ich dacht eiegntlich der Vergleich wäre klar. :shock:
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Do 10.04.03 22:21 
Luckie hat folgendes geschrieben:
@Popov: Meinst du wirklich?


Sicher. Es ist ja nicht so als ob du eine Anleitung schreiben sollst. Es gibt ja genug Bücher und sonstige FAQ's die einen in OOP einführen wollen. Aber das ganzie zieht sich und zieht sich und zieht sich. Bei deiner Beschreibung fand ich toll, das sie sehr viele Informationen auf wenig Raum vereinigt. Natürlich könnte es ein wenig mehr sein, aber die Art finde ich ok.

_________________
Popov
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Do 10.04.03 22:22 
achso...
ich fange heute mal an ein Adressbuch mit Klassen zu schreiben ;)
Mal sehen ob ich es hinbekomme ;)

_________________
MFG
Michael Springwald, "kann kein englisch...."
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 10.04.03 22:29 
@P: Na mal sehen. Wenn ich heute Nacht nicht schlafen kann... :roll:

@m: Viel Glück, du bist auf alle Fälle auf dem richtigen Weg.
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Do 10.04.03 22:50 
bis jetzt funktioniert alles so wie es soll......
ausblenden volle Höhe Quelltext
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:
nit ab;

interface
uses classes,Dialogs,Sysutils,Tools;

  type
    TAB = class
//      procedure InitAb(FileName:String);
      private
        Buch:TStringList;
      public
        constructor create(FileName:String);
        function CountAb:Integer;
        function ReadAb(index, TokNr:Integer):String;        
  end;

implementation

constructor TAB.create(FileName:String);
begin
  if FileExists(FileName) = False then begin
    ShowMessage('Datei: ' + FileName + ' nicht gefunden !');
    Exit;
  end;

  Buch:=TStringList.Create;
  Buch.LoadFromFile(FileName);
end;

function TAB.CountAb:Integer;
begin
  result:=Buch.Count-1;
end;

function TAB.ReadAb(index, TokNr:Integer):String;
begin
  result:=GetToken(buch.Strings[Index],',',TokNr);
end;

end.

das ist mein mometarner cord :D
scheint aufjedenfall alles viel einfacher zu sein als ich es angenommen habe *freu*

_________________
MFG
Michael Springwald, "kann kein englisch...."