octobre
2008
Dans ce troisième article, nous allons aborder la persistance des objets à travers l’exemple « Repertoire ».
Cette application est fortement inspirée des exemples donnés dans « tiOPF Concepts Manual« , mais fait l’impasse sur quelques fonctionnalités qui ne sont pas indispensables à la bonne compréhension du sujet. Je ne les traiterai donc qu’à la fin de cette série d’articles.
Commençons par la présentation des objets que nous désirons « persister ».
1. Business Object Model (BOM)
Ces objets sont regroupés dans le Business Object Model (BOM) ou modèle des objets du domaine. Le modèle est composé de deux classes d’objets : TPerson qui décrit une personne (nom, prénom et date de naissance) et TPeople qui gère la liste de tous les objets de type TPerson (en Pascal-Objet, une classe est un type).
Mais passons à la pratique.
Je vous propose de construire une petite application « Repertoire » qui gère une liste d’objets TPerson. A première vue ça n’a l’air de rien, mais c’est une bonne base pour construire une gestion de contacts plus élaborée. Il suffit pour cela de développer la classe TPerson en y ajoutant, par exemple, une liste de numéros de téléphone, une autre d’adresses e-mail ou de coordonnées postales, des notes, des rendez-vous, etc.
Nous aborderons ces extensions en toute fin de parcours.
1.1 – Le projet « Repertoire »
Tout d’abord, créons une « nouvelle Application fiches VCL pour win32″ dans Delphi et sauvegardons le nouveau projet dans le dossier des sources de l’application. Nous sauvegardons le formulaire principal sous uFRepert.pas et le fichier de projet sous Repertoire.bdsproj
Sur la form FormRepert (dans uFRepert.pas) nous déposons une ToolBar, une StatusBar et une ListBox.
1.2 – Modèle objet du domaine
Nous créons ensuite une unité qui contiendra le modèle-objet du domaine de l’application (ou BOM : Business Object Model) et nous la sauvegardons sous le nom uBOMRep.pas
Nous y créons deux classes : TPerson qui décrit une personne et TPeople qui contient la liste des personnes.
private
FBirthDate: TDateTime;
FFirstName: string;
FLastName: string;
published
property BirthDate: TDateTime read FBirthDate write FBirthDate;
property FirstName: string read FFirstName write FFirstName;
property LastName: string read FLastName write FLastName;
end;
TPeople = class(TObject)
private
List: TObjectList;
public
procedure Add(aPerson: TPerson);
end;
L’implémentation de la procedure Add se présente comme suit:
begin
List.Add(aPerson);
end;
Le code ci-dessus a été construit à l’aide de l’outil de modélisation ModelMaker 8 qui est inclus dans Delphi 7 Architect.
1.3 – Initialisation des données
A des fins de tests, nous créons plusieurs objets TPerson lors de la création de FormRepert.
var
aPerson: TPerson;
begin
People := TPeople.Create;
aPerson := TPerson.Create;
with aPerson do begin
FirstName := 'Achille';
LastName := 'Talon';
BirthDate := StrToDate('14/09/1934');
end;
People.Add(aPerson);
aPerson := TPerson.Create;
with aPerson do begin
FirstName := '';
LastName := 'Lefuneste';
BirthDate := StrToDate('13/02/1924');
end;
People.Add(aPerson);
aPerson := TPerson.Create;
with aPerson do begin
FirstName := 'Virgule';
LastName := 'De Guillements';
BirthDate := StrToDate('25/12/1935');
end;
end;
1.4 – Décorateur et affichage des données
Pour afficher la liste des personnes dans la ListBox, il nous faut obtenir une StringList correspondant au contenu de l’objet People. Pour cela nous allons créer une classe TPeopleList qui encapsule l’objet People et qui possède une propriété Strings que nous affecterons à la ListBox. Nous venons de « décorer » la classe TPeople en l’encapsulant dans TPeopleList.
Ceci est un exemple d’utilisation du Decorator pattern (modèle Décorateur). J’utiliserai le plus souvent les noms en anglais des modèles de conception, ou patterns, pour éviter de m’emmêler les pinceaux dans des traductions forcément approximatives et subjectives. J’utiliserai aussi la dénomination pattern pour les modèles de conception du GoF, tout simplement parce que c’est plus concis.
Notez enfin l’utilisation des sections initialization et finalization dans le code ci-dessous pour créer et détruire l’objet PeopleList.
Les classes d’aide à la gestion de l’interface utilisateur comme TPeopleList seront regroupées dans l’unité uGUIHelpers.
private
FPeople: TPeople;
FStrings: TStringList;
function GetStrings: TStringList;
public
constructor Create(pPeople: TPeople);
destructor Destroy; override;
property Strings: TStringList read GetStrings;
end;
var
PeopleList: TPeopleList;
implementation
constructor TPeopleList.Create(pPeople: TPeople);
begin
FPeople := pPeople;
FStrings := TStringList.Create;
end;
destructor TPeopleList.Destroy;
begin
FStrings.Free;
end;
function TPeopleList.GetStrings: TStringList;
var
i: Integer;
begin
for i := 0 to FPeople.List.Count - 1 do begin
FStrings.Add(
TPerson(FPeople.List.Items[i]).LastName + ', ' +
TPerson(FPeople.List.Items[i]).FirstName + ', né(e) le ' +
DateToStr(TPerson(FPeople.List.Items[i]).BirthDate) );
end;
Result := FStrings;
end;
initialization
PeopleList := TPeopleList.Create(People);
finalization
PeopleList.Free;
Pour provoquer l’affichage des personnes après leur création dans la méthode FormCreate, il suffit d’ajouter à la fin l’instruction :
ListBox1.Items := PeopleList.Strings;
Le résultat de nos efforts appparaît dans la figure ci-dessous.