Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 13, 2025 03:24

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Mehrere Units für 3 Teilgebiete
BeitragVerfasst: Mo Okt 27, 2008 15:58 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Hallo...

ich habe ein Problem 8wer hätte es gedacht).

Also ich möchte mein Projekt in 3 Teile teilen:
Die 1. Unit soll sämtliche Prozeduren (OnCreate, OnDestroy, OnResize, OnKeyDown, OnClick etc.) des Formulares enthalten und ist die Startunit.
Die 2. Unit soll die GL Anweisungen erhalten (SetupGL und die Renderprozedur).
Die 3. Unit soll alle Objekte enthalten, die sich in der Renderung wiederholen (Schränke, Vasen und wenn ich das mit den Blending endlich hinkriege auch Fenster etc.).

Ich versuche mich schon seit heute früh und bekomme nichts anständiges auf die Reihe.
Kann mir einer helfen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 28, 2008 09:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also es gibt da in der Regel keine Probleme, wenn du deinen Code auf mehrere Units aufteilen möchtest. Dabei musst du aber beachten, dass Pascal in seinen Units einen Interface und einen Implementation Bereich hat. Alles was im Interfacebereich steht wird nach Außen hin sichtbar sein. Im Interface werden aber normal nur Datentypen, Funktionen etc definiert. Die eigentliche Implementation der Funktionen sind auch im Implementation Bereich zu erledigen. Solltest du einen Typen haben der nur in der Unit bekannt sein soll dann kannst du ihn im Implementation Bereich deklarieren.

In etwa wie folgt könnte deine Unit aussehen.
Code:
  1. Unit Blah;
  2.  
  3. interface
  4.  
  5. uses
  6.   dglopengl;
  7.  
  8. procedure SetupOpenGL;
  9.  
  10. implementation
  11.  
  12. procedure SetupOpenGL;
  13. begin
  14.   glClearColor();
  15.   ...
  16. end;
  17.  
  18. end.


Benutzen kannst du sie dann in etwa so.
Code:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. type
  6.   TForm1 = class(TForm)
  7.     procedure FormCreate(Sender: TObject);
  8.     ...
  9.   end;
  10.  
  11. var
  12.   Form1: TForm1;
  13.  
  14. implementation
  15.  
  16. uses
  17.   Blah;
  18.  
  19. procedure TForm1.FormCreate(Sender: TObject);
  20. begin
  21.   ...
  22.   SetupOpenGL;
  23. end;
  24.  
  25. end.


Aber ein paar gedanken Anregungen. Es ist nicht gut den Code einfach auseinander zu reißen. Du solltest dir dabei schon etwas denken und da auch darauf achten, dass wenn du Code ausgliederst, dass dieser Code auch in etwa zusammengehört. Also Code zum Speichern einer Textdatei hat nichts in der Unit zur OpenGL Initialisierung zu suchen.

Auch noch sehr wirchtig ist die Kommunikation zwischen den Codes. Wenn die Codeteile Daten austauschen müssen, dann sollte das nicht kreuz und quer passieren. Also Beispiel in der Unit Blah von oben. Es wäre technisch möglich im Implementation Bereich die Unit1 einzubinden und direkt auf das Form zuzugreifen. ABER nur weil es machbar ist muss man es nicht machen. Damit würdest du dafür sorgen, dass die Beiden Units so extrem eng miteinander vereint sind, dass die eine ohne die andere nicht mehr leben kann. Da würde man die Dinge die man in der Unit Blah benötigt an die passenden Methoden als Parameter übergeben. Und ich meine da nicht, dass man dann das Formular übergeben soll. Sondern eher nur einzelne Werte. Wie das aber im Konkreten aussehen kann hängt immer vom aktuellen Fall ab.

Als Faustregel solltest du dir im Hinterkopf behalten, dass du die Unit Blah auch mal eben so in einem anderen Projekt benutzen könntest. Deswegen sollten aus der Unit dann keine Abhängigkeiten nach außen bestehen. Falls es aber nicht auf Anhieb gelingt mach dir da keinen großen Kopf drum. Das gelingt einfach nicht immer. Selbst nach 12 Jahren programmieren nicht. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 28, 2008 16:45 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Nunja, bei mir kommt es immer zu ÜBERKREUZUNGEN und "Redfiniert"...

Und ich kann irgendwie deine Erklärung nicht auf mein Problem umsetzen...
Was sollte ich denn nun wo in der Interface-Uses-Klausel und was in der Implementations-Uses-Klausel einbauen?
Oder würdest du mir indem Fall doch lieber abraten?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 28, 2008 17:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Davon abraten wäre das letzte was ich tun würde! Wenn ein Projekt eine gewisse Größe erreicht hat, dann wirst du ohne verschiedene Units nicht mehr auskommen. Was du nur nicht machen darfst ist einfach so Code nehmen und in eine andere Unit packen. Das wird höchstwahrscheinlich in einem Chaos oder in Fehlern enden. Beides vermutlich nicht gerade wünschenswert.

Wo hackt es denn bei meiner Erklärung? Bzw was hast du nicht verstanden?

Der überkreuzende Bezug zweier Unit entsteht immer dann, wenn du zwei Units hast die sich gegenseitig im Interface einbinden. Dann weiß der Kompiler nicht welche Unit er zu erst kompilieren soll. Eine Unit im Implementation teil einzubinden kann dieses Problem evtl lösen. Aber dann sind die beiden Units sowieso extrem miteinander verwoben und da wäre es eventuell ratsam eine andere Struktur anzustreben.

Was du bei dir jetzt genau wo einbauen musst kann ich dir so nicht sagen. Das aber nur, da ich deinen Code nicht mal ansatzweise kenne. Deswegen war meine Erklärung oberhalb auch relativ allgemein gehalten. Allerdings denke ich, dass es wesentlich besser sein wird, wenn man dir das mal am lebende Objekt zeigen kann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 28, 2008 19:11 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hmmm.... Also so wie mir scheint, hast du verstanden, dass zum Programmieren auch Code/Projektorganisation gehört. Und jetzt bist du auf der suche nach einer Möglichkeit das geschickt zu machen.

Ich denke, im Moment bist du noch viel zu nah am coden dran. Geh mal ein Stückchen weg und versuch das Problem weiter zu abstrahieren. Das was du versuchst, habe ich damals bei meinen PBall Manager 2 versucht. Ich dachte ich hätte meinen Code strukturiert, aber am Ende war es ein riesen Schlamassel.

Wenn du etwas größeren Code schreibst, dann sollten deine Ziele immer folgende sein:
1: Es muss das machen was es soll (is klar)
2: Es muss Robust sein (ist programmiertechnisch zu lösen: Exception Handling)
3: Es muss Wartbar sein (Einfache Struktur, keine Verschlungenen Aufrufpfade: Ein Klares System muss drunter liegen. Sowas nennt man Software Architektur)
4: Es muss Erweiterbar sein (Wenn du neue Teile/neues Verhalten hinzufügen willst, sollte das ohne änderungen am bestehenden Code funktionieren.)

Das sind so die Grundlagen.
Als ich damals mit dem PBM2 fertig war, bin ich über einen Bekannten auf den "Rational Unified Process" gestoßen. Ich habe dann dazu hier eine 3Teilige Tutorialreihe (Tutorial_Softwareentwicklung1) geschrieben. Allerdings ist dieser Prozess sehr mächtig und vor allem für Projekte im geschäftlichen Umfeld gedacht. Auf alle Fälle ist das was dort gemacht wird aber nicht falsch, sondern vielleicht einfach nur ne Nummer zu groß für ein kleines Hobbyprojekt. Du solltest dir trotzdem mal zumindest das erste Tutorial durchlesen.
Dann sind noch sogenannte "Pattern" zu empfehlen. Das sind Codemuster/vorlagen die sich bewährt haben. Da findest du bei Wikipedia ne nette Zusammenfassung.

Das alles sollte dich nicht abschrecken. Es sind genau diese Dinge die man lernen muss um vom "Coder" zum Programmierer/Software-Engineer zu werden. (Nicht ganz. Der rest ist dann noch Theorie und das lernt man in der Uni. Aber den praktischen Teil, den lernst du nur so.)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]