janvier
2009
Dans ce nouvel article de la série sur la persistance des objets, nous allons introduire la notion d’état ObjectState, nécessaire pour gérer la persistance dans une base de données SQL.
2.1.5.2 – Refactoring de TPerson
Dans FormPerson est apparue la propriété Dirty de TPerson. La valeur de cette propriété est liée à l’état ObjectState de l’objet de type TPerson. Les états sont définis au niveau de l’ancêtre TBizObj de TPerson. Un descendant de TBizObj peut en effet être vide de toute donnée quand il vient juste d’être créé. Il sera alors dans l’état bosEmpty (bos pour BizzObj State).
Si nous saisissons et validons des données pour un objet à l’état bosEmpty, il passera à l’état bosCreate qui signifie que cet objet doit être ajouté à la liste ou à la table People. Dès qu’il aura été ajouté, il passera à l’état bosClean, ce qui signifie qu’il est persistant.
Si l’objet est modifié, il passe à l’état bosUpdate. Il devra donc être sauvegardé pour repasser à bosClean.
S’il doit être supprimé, son état sera mis à bosDelete. Dès qu’il aura été supprimé physiquement dans la liste d’objets ou dans la table, il passera pas à l’état bosDeleted. Cela a pour conséquence qu’il ne sera plus affiché. Mais il est toujours possible de le passer à l’état bosCreate si on veut le recréer
Mais revenons à la propriété Dirty. Elle est définie comme suit :
Dirty := ObjectState in [bosCreate, bosUpdate, bosDelete]
.
Un objet Dirty nécessite donc d’être enregistré ou supprimé. Quand, comme dans TFormPerson.bbtnValidateClick, la propriété Dirty est mise à True, l’état de l’objet est mis à une des valeurs bosCreate, bosUpdate et bosDelete, en fonction de son état courant.
La propriété Deleted permet de savoir rapidement si l’objet doit être affiché ou non :
Deleted := ObjecState in [bosDelete, bosDeleted]
.
Enfin la propriété OID servira d’identifiant pour l’enregistrement éventuel de l’objet dans une table SQL.
TObjectState = //le préfixe bos signifie BizObj State
(bosEmpty, //le BizObject vient d'être créé et est encore vide
bosCreate, //le bo est à insérer dans le fichier ou la base de données
bosUpdate, //le bo est à mettre à jour dans le fichier ou la bdd
bosDelete, //le bo est à supprimer du fichier ou de la bdd
bosDeleted, //le bo a été supprimé dans le fichier ou la bdd
bosClean); //l'état du bo correspond à son état dans le fichier ou la bdd
TBizObj = class(TObject)
private
FOID: TBizObjID;
FState: TObjectState;
function GetDeleted: Boolean;
function GetDirty: Boolean;
function GetOID: TBizObjID;
procedure SetDirty(Value: Boolean);
public
procedure AcceptBizObjVisitor(Visitor: TBizObjVisitor); virtual;
property Deleted: Boolean read GetDeleted;
property Dirty: Boolean read GetDirty write SetDirty;
property OID: TBizObjID read GetOID write FOID;
property State: TObjectState read FState write FState;
end;
Vous trouverez ci-dessous l’implementation des nouvelles propriétés:
begin
Result := (FState in [bosDelete, bosDeleted]);
end;
function TBizObj.GetDirty: Boolean;
begin
Result := (FState in [bosCreate, bosUpdate, bosDelete]);
end;
function TBizObj.GetOID: TBizObjID;
var
DT: TDateTime;
begin
if FOID = 0 then begin
//générer un nouvel identifiant basé sur l'instant courant
DT := Now - StrToDate('31/08/08');
Result := ( ( trunc(DT) * 1000000 ) + ( trunc(frac(DT) * 1000000) ) );
end;
Result := FOID;
end;
procedure TBizObj.SetDirty(Value: Boolean);
begin
if Value = True then
case FState of
bosEmpty: FState := bosCreate;
bosDeleted: FState := bosDelete;
bosClean: FState := bosUpdate;
//...
end
else
FState := bosClean;
end;