Propriété (Property)

Cette section étudie la définition, la syntaxe, les spécifications et la sérialisation des propriétés (Property)

Qu’est-ce qu’une Property

property est un sucre syntaxique du langage Pascal. Visuellement il se comporte comme un champ, mais en coulisse il appelle réellement un getter pour la lecture / un setter pour l’écriture. Il sert à encapsuler les champs privés, unifier la logique de lecture et d’écriture et ajouter des effets secondaires.

  1. Propriété lecture-écriture contrôlable : une logique supplémentaire s’exécute automatiquement lors de l’affectation ou de la lecture de la valeur (rafraîchissement de l’interface, synchronisation des composants, validation des valeurs) ;
  2. Propriété en lecture seule : accessible en lecture depuis l’extérieur, interdiction d’affectation directe ; les données sont modifiées en interne via des procédures dédiées.
program Demo;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
uses
  SysUtils;

type
  TWebPage = class
  private
    FURL: string;
    FColorRGB: Integer;
    procedure SetColorRGB(const Value: Integer);
  public
    property URL: string read FURL;
    property ColorRGB: Integer read FColorRGB write SetColorRGB;

    procedure Load(const AnURL: string);
    procedure PrintStatus;
  end;

procedure TWebPage.Load(const AnURL: string);
begin
  FURL := AnURL;
  Writeln('Load page: ', AnURL);
end;

procedure TWebPage.SetColorRGB(const Value: Integer);
begin
  if FColorRGB <> Value then
  begin
    FColorRGB := Value;
    Writeln('Color updated, value = ', Value);
    Writeln('Sync component color to ', Value);
  end;
end;

procedure TWebPage.PrintStatus;
begin
  Writeln('==== Page Info ====');
  Writeln('URL(read-only): ', URL);
  Writeln('ColorRGB(rw): ', ColorRGB);
  Writeln('==================');
  Writeln;
end;

var
  Page: TWebPage;
begin
  Page := TWebPage.Create;
  try
    Page.Load('https://www.foxdevelop.com/');
    Page.ColorRGB := 255;
    Page.PrintStatus;

    Page.ColorRGB := 255;
    Page.PrintStatus;

    Page.ColorRGB := 65535;
    Page.PrintStatus;

    // Page.URL := 'test'; // Erreur de compilation, URL est en lecture seule
  finally
    Page.Free;
  end;
  Readln;
end.Langage du code : HTML, XML (xml)

Dans TWebPage, la propriété URL est uniquement lisible ; pour la modifier, il faut utiliser la procédure Load.

La propriété FColorRGB est lisible, son écriture/modification passe par la procédure SetColorRGB.

Par ailleurs, PrintStatus est une procédure ordinaire destinée à afficher les informations internes de TWebPage.

Résultat d’exécution

Load page: https://www.foxdevelop.com/
Color updated, value = 255
Sync component color to 255
==== Page Info ====
URL(read-only): https://www.foxdevelop.com/
ColorRGB(rw): 255
==================

==== Page Info ====
URL(read-only): https://www.foxdevelop.com/
ColorRGB(rw): 255
==================

Color updated, value = 65535
Sync component color to 65535
==== Page Info ====
URL(read-only): https://www.foxdevelop.com/
ColorRGB(rw): 65535
==================Langage du code : JavaScript (javascript)

2. Règles de déclaration des trois éléments d’une property

La déclaration d’une propriété doit spécifier une méthode de lecture ; une méthode d’écriture est facultative :

read source de lecture : deux choix possibles

  • Liaison directe avec un champ privé (la plus rapide, sans surcharge de fonction supplémentaire)
  • Fonction getter sans paramètre, dont le type de retour correspond parfaitement au type de la propriété

write source d’écriture (facultatif ; omis, la propriété est en lecture seule) : deux choix possibles

  • Liaison directe avec un champ privé
  • Fonction setter à un seul paramètre, dont le type du paramètre correspond parfaitement au type de la propriété

Modificateurs complémentaires réservés à la sérialisation : default, stored

Le compilateur impose une vérification stricte de correspondance des types :

  • Propriété Integer : le getter doit retourner un Integer sans paramètre / read lié à un champ privé de type Integer
  • Propriété String : le setter doit accepter un paramètre const string

Propriétés Published et sérialisation

1. Qu’est-ce que la sérialisation

Écrire l’intégralité des données d’un objet dans un flux (fichier/mémoire/JSON), afin de reconstruire l’objet à partir de ce flux par la suite ;

Les fichiers de formulaire Lazarus .lfm et Delphi .dfm reposent entièrement sur ce mécanisme en arrière-plan.

  • Prérequis essentiel : la propriété doit être placée dans la section published pour être reconnue par les informations de type à l’exécution RTTI
  • Unités utilitaires associées :
  • LResources : lecture et écriture des fichiers lfm de formulaire
  • FpJsonRtti / CastleComponentSerialize : sérialisation JSON des objets

2. Modificateurs dédiés à la sérialisation

default <constante> : indiquer la valeur par défaut de la propriété

  • Utilisé uniquement pour le traitement de sérialisation : si la valeur de la propriété est égale à default après instanciation de l’objet, on omet son stockage lors de la sérialisation pour réduire la taille du fichier
  • Pas d’initialisation automatique : le constructeur doit affecter manuellement la valeur correspondant à default au champ

stored <booléen/méthode> : contrôler si la propriété est enregistrée lors de la sérialisation

  • stored True : valeur par défaut, la propriété est écrite dans le fichier à la sérialisation
  • stored False : cette propriété n’est jamais enregistrée
  • stored IsNeedSave : appeler une méthode booléenne pour déterminer dynamiquement le stockage

Exemple de sérialisation

type
  TWebPage = class
  private
    FColor: TColor;
    function SetColor(const Value: TColor): TColor;
  published
    // default clBlack signifie noir par défaut ; le constructeur doit écrire manuellement FColor := clBlack
    property Color: TColor read FColor write SetColor default clBlack;
    // stored False ne sauvegarde pas dans lfm/json
    property TempCache: string read FTemp write FTemp stored False;
  end;

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *