Question

Je traite un fichier XML avec minOccurs et maxOccurs définis fréquemment sur 0, 1 ou sans limite. J'ai un schéma décrivant cette cardinalité, ainsi que le type de données spécifique. J'aimerais construire une classe (Delphi) qui garde une trace de la cardinalité, ainsi qu'un tableau dont les dimensions doivent être validées en fonction des champs minOccurs et maxOccur. Je pense que l'utilisation de variantes est un choix de conception médiocre, car je serai parfaitement conscient du type de données avant sa lecture (basé sur les règles du schéma XML).

Je suis plutôt nouveau dans la programmation orientée objet en général, et dans Delphi OOP en particulier, alors quelles sont mes meilleures options ici? J'ai imaginé quelque chose comme:

TComplexType = class(TObject)
  FMinOccurs: integer;
  FMaxOccurs: integer;
  FValue:     Array of Variant;
public
  constructor Create(Min: integer; Max: integer);
  procedure AddValue(Value: variant);
  function Validate() : boolean;
end;

Bien sûr, FValue peut devenir une chaîne, un entier, un double, etc. Ainsi, je crois que je dois me spécialiser:

TComplexString = class(TComplexType)
  FValue:     Array of string;
end;

Maintenant, est-ce la bonne façon de faire? Dois-je surcharger AddValue (Value: SomeType) dans toutes les classes différentes (chaque classe correspondant à un type de données)? Cela ne semble pas très simple, car je ferai à peu près la même chose dans toutes les méthodes AddValue:

procedure AddValue(Value: SomeType);
begin;
  // 1) Re-shape array
  // 2) Add Value as the last (newly created) element in the array
end;

Je détesterais vraiment faire cela pour tous les types. (Certes, il n'y aura pas autant de types, mais je considère tout de même qu'il s'agit d'une conception défectueuse, car le contenu logique est pratiquement identique dans les méthodes surchargées.) Des bons conseils? Merci!

Était-ce utile?

La solution

Vous n'avez pas spécifié votre version de Delphi, mais il s'agit d'un exemple classique pour les génériques (disponible à partir de D2009).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top