J'utilise actuellement le modèle de construction tel que défini ici :
Question précédente montrant mon utilisation du motif constructeur
Le problème que je rencontre maintenant est l'obligation de créer la structure suivante :
- ZipHolder: file metadata present
* File mainFile
* File optionalFile
* List<File> files
OU :
- ZipHolder: no file metadata present
* File mainFile
* File optionalFile
* List<File> files
Les deux sites ZipHolder
y File
sont construits à l'aide du modèle de construction, mis en œuvre en tant que classe statique interne de chacun. A ZipHolder
prend un mainFile
en tant que paramètre obligatoire du constructeur et remplit au préalable certaines informations dans le fichier ZipHolder
qui peuvent être remplacées, le cas échéant. A File
contient le contenu du fichier et les métadonnées associées relatives à ce fichier. La validation à la fois sur le ZipHolder
y File
est alors effectuée lors de l'appel de la build()
de chacun Builder
classe. Les objets sont ensuite pris et sortis dans une hiérarchie de fichiers ZIP qui doivent ensuite être lus dans la même structure d'objets, si nécessaire.
Cela fonctionne bien et donne un degré de flexibilité dans la création d'objets tout en assurant l'immuabilité. J'ai cependant rencontré un problème. Une nouvelle exigence s'est présentée, imposant que File
les objets peuvent avoir des métadonnées et contenu du fichier OU seulement le contenu du fichier. Je me suis dit que je pouvais simplement passer une valeur booléenne au constructeur pour l'indicateur de contenu. ZipHolder
pour permettre d'ignorer la validation habituelle des métadonnées. Cela semble correct, mais il faut alors un File
MainFile pour être construit - essentiellement, une situation de poule et d'œuf. J'ai ensuite pensé à déplacer le drapeau sur le site de l'entreprise. File
classe. Cela semblait correct jusqu'à ce que je réalise que l'on pouvait potentiellement créer de multiples File
des objets, certains avec des métadonnées obligatoires et d'autres avec uniquement le contenu du fichier, sans aucun moyen de faire respecter les contraintes de manière générale.
Je suis donc quelque peu perplexe quant à la manière de procéder. Je ne vois pas de moyen évident de découpler l'exigence d'un système de gestion de l'information de l'entreprise. MainFile pour un ZipHolder
d'une manière élégante. Des concepts tels que les classes abstraites, les interfaces, les classes de base et autres me viennent à l'esprit, mais j'ai besoin de conseils dans cette situation particulière.
Donc ma question est :
Puis-je autoriser les deux scénarios tout en conservant le modèle de construction selon les raisons indiquées dans mon lien ci-dessus ?