AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

OOP wirklich nicht möglich?

Ein Thema von Delbor · begonnen am 12. Okt 2017 · letzter Beitrag vom 20. Okt 2017
Antwort Antwort
Seite 1 von 5  1 23     Letzte » 
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
444 Beiträge
 
Delphi XE8 Enterprise
 
#1

OOP wirklich nicht möglich?

  Alt 12. Okt 2017, 14:56
Delphi-Version: XE8
Hi zusammen

Mit folgender Klasse speichere ich die von einem SQLStatement von MySQL zurückgegeben Daten zwischen:
Delphi-Quellcode:
type
  TQueryResultClass = Class(TPersistent)
  private
    FidBild: Integer;
    FThumbnail : TMemorystream;
    FBitmap: TMemorystream;
    FBildDescribeTabelle : TBildDescribeTabelle;
    FKategoryTabelle : TKategoryTabelle;
    FPass: String;
    FUser: String;
    procedure SetBitmap(Value: TMemoryStream);
    procedure SetThumbnail(Value: TMemoryStream);

    function GetBitmap: TMemoryStream;
    function GetThumbnail: TMemoryStream;
    function FillThumbnail(var Thumbnail: TMemoryStream): TMemoryStream;

  public
    constructor Create(AOwner: TComponent); //
    destructor Destroy; override;
    procedure Assign(Source:TPersistent); override;
    property IdBild :integer read FidBild write FidBild;
    property Thumbnail: TMemoryStream read GetThumbnail write SetThumbnail;
    property Bitmap: TMemoryStream read GetBitmap write SetBitmap;
    property BildDescribeTabelle : TBildDescribeTabelle read FBildDescribeTabelle write FBildDescribeTabelle;
    property KategoryTabelle : TKategoryTabelle read FKategoryTabelle write FKategoryTabelle;
  end;
Nun arbeite ich daran, die AnwendungsDB auf SQLite umzustellen. Leider (?) habe ich Kritik von hier wegen unsäglich langer Taellennamen befolgt und zu diesem Zweck ein neues Datenbankmodell, analog dem mit MySQL benützten, aber mit deutlich gekürzten Tabellennamen erstellt.
Das heisst, ich kann obige Klasse nicht verwenden, sondern muss eine neue, grundsätzlich gleich aufgebaute Klasse erstellen - ein e Anforderung an die Klasse ist, dass deren Felder und Propertys so heissen, wie die Tabellen, deren Inhalte sie übernehmen sollen. Allees andere gäbe früher oder später ein unentwirrbares Chaos.
Die neue, noch nicht fertig erstellte Klasse mit den neuen Tabellennamen:
Delphi-Quellcode:
type
  TCMQueryClass = Class(TPersistent)
  private
    FidBild: Integer; // FidBild: Integer;
    FThumbnail : TMemorystream; // FThumbnail : TMemorystream;
    FBitmap: TMemorystream; // FBitmap: TMemorystream;
    FTblBildText : TTblBildText; // FBildDescribeTabelle : TBildDescribeTabelle;
    FTblAlbum : TTbl_Album; // FKategoryTabelle : TKategoryTabelle;
    FPass: String; // FPass: String;
    FUser: String; // FUser: String;
    procedure SetBitmap(Value: TMemoryStream); // procedure SetBitmap(Value: TMemoryStream);
    procedure SetThumbnail(Value: TMemoryStream); // procedure SetThumbnail(Value: TMemoryStream);

    function GetBitmap: TMemoryStream;
    function GetThumbnail: TMemoryStream;
    function FillThumbnail(var Thumbnail: TMemoryStream): TMemoryStream;

  public
    constructor Create(AOwner: TComponent); // override;
    destructor Destroy; override;
    procedure Assign(Source:TPersistent); override;
    property IdBild :integer read FidBild write FidBild;
    property Thumbnail: TMemoryStream read GetThumbnail write SetThumbnail;
    property Bitmap: TMemoryStream read GetBitmap write SetBitmap;
    property TblBildText : TTblBildText read FTblBildText write FTblBildText;
    property TblAlbum : TTbl_Album read FTblAlbum write FTblAlbum;
  end;
Ich habe mir lange darüber Gedanken gemacht, wie man dieses Problem mit OOP-Miteln lösen könnte, aber bislang keine befriedigende Lösung gefunden.

Hat jemand einen Vorschlag?

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
4.569 Beiträge
 
Delphi 2010 Professional
 
#2

AW: OOP wirklich nicht möglich?

  Alt 12. Okt 2017, 15:03
Ich finde es komisch, dass du überhaupt solche "Zwischen-Klassen" für die Daten einer Query machst.
Die "Query-Results" sind die Rows die deine Query zurückgibt.

Die nächst höhere Ebene wäre Objekt einer "richtigen" Klasse für das die Daten bestimmt sind.
z.B. TUser o.ä.

Du könntest zwischen die Query und der eigentlichen Klasse noch eine Art Factory stellen, der du die Query-Daten übergibst und die dir dann auf deinen Wunsch hin das gewünschte/benötigte Objekt erstellt. Intern entweder durch manuelle Zuweisung oder durch RTTI-Magie.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (12. Okt 2017 um 15:07 Uhr)
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
444 Beiträge
 
Delphi XE8 Enterprise
 
#3

AW: OOP wirklich nicht möglich?

  Alt 12. Okt 2017, 16:29
Hi Neutral General

Zitat:
Du könntest zwischen die Query und der eigentlichen Klasse noch eine Art Factory stellen, der du die Query-Daten übergibst und die dir dann auf deinen Wunsch hin das gewünschte/benötigte Objekt erstellt. Intern entweder durch manuelle Zuweisung oder durch RTTI-Magie.
Das Hauptproblem ist, ich müsste dazu wohl fast das ganze Programm umstellen - einmal mehr. Das eigentliche Problem sind die Bilder. Die sind je nach Kamera zwischen 10 und 24MB gross. Allerdings nur die Rohdaten. Bitmaps sind dreimal grösser.

Mein Programm lädt die vorhandenen Daten vorerst ohne die Bilder. Die werden nachgeladen, wenn sie zur Bearbeitung benötigt werden. Dabei werden Thumpnails für die Navigation und Bitmaps für die grafische Bildbearbeitung erstellt. Bitmaps und Rohdaten werden anschliessend in einer externen DB auf einem beliebigen Laufwerk abgelegt (und dienen da gewissermassen als Backup).

Ich hab eine Factory eingebaut, die mir einen da registrierten Frame (ich habe mehrere verschiedene) zur Laufzeit erstellt und zurückliefert. So, wie ich das verstehe, geht dein Vorschlag genau dahin.
Bei dieser Framefactory sind diverse Frames registriert, die von meiner Anwendung in Abhängigkeit von dem, was der User tun will, alle gebraucht werden und deren Aufbau wegen der Bindung an dieses Programm in den Grundzügen gleich ist.
Das muss aber bei dem angestrebten Objekt nicht sein - oder wird in den wenigsten Fällen so sein.
Die gezeigte Klasse enthält weitere Klassen, die ihrerseits die Tabellen- und Feldstruktur einer DB-Tabelle abbilden.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
149 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#4

AW: OOP wirklich nicht möglich?

  Alt 12. Okt 2017, 17:40
Hilft dir das Decorator Pattern hier nicht?
Du routest aus der neuen Klasse alles auf die alte durch. So kannst du nach und nach alles auf die neue Klasse umstellen.
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
444 Beiträge
 
Delphi XE8 Enterprise
 
#5

AW: OOP wirklich nicht möglich?

  Alt 12. Okt 2017, 18:23
Hi Tigerlilly

Ich muss gestehen, von Decorator Pattern hab ich jetzt von dir zum ersten Mal gehört. Aber nachdem, was mir Wikipedia verrät, wohl eher nicht.
Wenn du die von mir geposteten Klassen ansiehst, wirst du bemerken: Es handelt sich eigentlich um eine in einer Klassenstruktur zusammengefasste Ansammlung sprechender Variablen. Eine Klasse ist das einer Objektliste wegen, die auf diese Weise die Query-Ergebnisse bereithält, ohne das eine Query-Komponente während einer möglicherweise längeren DB-Sitzung dauernd offen sein müsste.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (12. Okt 2017 um 18:35 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
5.878 Beiträge
 
Delphi XE4 Professional
 
#6

AW: OOP wirklich nicht möglich?

  Alt 12. Okt 2017, 19:25
Hallo,
Zitat:
aber mit deutlich gekürzten Tabellennamen erstellt.
Das heisst, ich kann obige Klasse nicht verwenden
Was hat denn der Tabellenname mit einer Datenklasse zu tun?
Heiko
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
444 Beiträge
 
Delphi XE8 Enterprise
 
#7

AW: OOP wirklich nicht möglich?

  Alt 12. Okt 2017, 23:27
Hi hoika
Zitat:
Was hat denn der Tabellenname mit einer Datenklasse zu tun?
In diesem (und nur in diesem) Fall sehr viel. Lies dazu nochmal den Beitrag direkt vor deinem.
Delphi-Quellcode:
type
  TQueryResultClass = Class(TPersistent)
  private
    FidBild: Integer;
    FThumbnail : TMemorystream;
    FBitmap: TMemorystream;
    FBildDescribeTabelle : TBildDescribeTabelle;
    FKategoryTabelle : TKategoryTabelle;
...
  • FIdBild dürfte selbsterklärend sein - das Feld soll den PrimaryKey speicern.
  • FThumbnail ist ein Feld zur Aufnahme von Blob-Daten.
  • Ebenso FBitmap. Aber dann wirds interessant:
  • FBildDescribeTabelle ist vom Tip TBildDescribeTabelle, einer Klasse, die die gleichnamige Tabelle in der DB abbildet und eine Detailtabelle der BildTabelle darstellt. (1:n-Beziehung)
  • TKategoryTabelle hingegen bildet die gleichnamige Tabelle aus der DB ab, ist aber it der Bildtabelle in einer n:m-Beziehung.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
1.231 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: OOP wirklich nicht möglich?

  Alt 13. Okt 2017, 08:36
Ich habe mir lange darüber Gedanken gemacht, wie man dieses Problem mit OOP-Miteln lösen könnte, aber bislang keine befriedigende Lösung gefunden.

Hat jemand einen Vorschlag?
Wie wär's mit diesem neuartigen Konzept:
Gemeinsamkeiten von zwei oder mehr Klassen in eine gemeinsame Basisklasse und nur in den Ableitungen das neue Zeug?!

Delphi-Quellcode:
type
  TCustomQuery = Class(TPersistent)
  protected
    FidBild: Integer;
    FThumbnail: TMemoryStream;
    FBitmap: TMemoryStream;
    FPass: String;
    FUser: string;
    procedure SetBitmap(Value: TMemoryStream);
    procedure SetThumbnail(Value: TMemoryStream);
    function GetBitmap: TMemoryStream;
    function GetThumbnail: TMemoryStream;
    function FillThumbnail(var Thumbnail: TMemoryStream): TMemoryStream;
  public
    constructor Create(AOwner: TComponent);
    destructor Destroy; override;
    procedure Assign(Source: TPersistent); override;
    property IdBild: Integer read FidBild write FidBild;
    property Thumbnail: TMemoryStream read GetThumbnail write SetThumbnail;
    property Bitmap: TMemoryStream read GetBitmap write SetBitmap;
  end

  TQueryResultClass = Class(TCustomQuery)
  protected
    FBildDescribeTabelle: TBildDescribeTabelle;
    FKategoryTabelle: TKategoryTabelle;
  public
    procedure Assign(Source: TPersistent); override;
    property BildDescribeTabelle: TBildDescribeTabelle read FBildDescribeTabelle write FBildDescribeTabelle;
    property KategoryTabelle: TKategoryTabelle read FKategoryTabelle write FKategoryTabelle;
  end;

  TCMQueryClass = Class(TCustomQuery)
  protected
    FTblBildText: TTblBildText;
    FTblAlbum: TTbl_Album;
  public
    procedure Assign(Source: TPersistent); override;
    property TblBildText: TTblBildText read FTblBildText write FTblBildText;
    property TblAlbum: TTbl_Album read FTblAlbum write FTblAlbum;
  end;

Geändert von TiGü (13. Okt 2017 um 08:43 Uhr)
  Mit Zitat antworten Zitat
Elrond

Registriert seit: 29. Sep 2014
4 Beiträge
 
#9

AW: OOP wirklich nicht möglich?

  Alt 13. Okt 2017, 09:18
Ich muss zugeben das ich das Problem überhaupt nicht verstehe, was genau möchtest du?

Wenn es dir um eine detailgetreue Abbildung deines Datenbankmodells auf eine Klasse geht, kannst du natürlich einen Wrapper schreiben der aus der DB die entsprechenden Klassen extrahiert. Das lässt sich auch gut automatisiert in den Entwicklungsprozess einbinden. Man kann auch den eher üblicheren Weg gehen und deine Klassen auf die DB Mappen (ORM). In beiden Fällen müsstest du nur an einer Stelle Änderungen vornehmen (Klasse oder DB, statt Klasse und Query). Für deine großen Bilddateien könntest du damit auch das lazy loading Feature nutzen.
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.114 Beiträge
 
Delphi XE5 Professional
 
#10

AW: OOP wirklich nicht möglich?

  Alt 13. Okt 2017, 12:21
Ich kann bei solchen Architektur Problemen diese Buch empfehlen:
https://martinfowler.com/books/eaa.html
Software UpToDate - http://www.software-uptodate.de/ - SW auf dem neusten Stand halten
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2017 by Daniel R. Wolf