Je sais que la POO consiste à encapsuler des données et un comportement ensemble, mais je ne pense pas que ce soit une bonne idée pour une image d'avoir la logique de redimensionnement intégrée dans ce cas, car une image n'a pas besoin de savoir comment se redimensionner pour être une image.
Une vignette est en fait une image différente. Peut-être pourriez-vous avoir une structure de données qui détient la relation entre une photographie et sa miniature (qui sont toutes deux des images).
J'essaie de diviser mes programmes en choses (comme des images, des photographies, des miniatures, etc.) et des services (comme PhotographRepository, ThumbnailGenerator, etc.). Obtenez vos bonnes structures de données, puis définissez les services qui vous permettent de créer, manipuler, transformer, persister et récupérer ces structures de données. Je ne mets pas plus de comportement dans mes structures de données que de m'assurer qu'elles sont créées correctement et utilisées de manière appropriée.
Par conséquent, non, une image ne doit pas contenir la logique de création d'une miniature. Il devrait y avoir un service ThumbnailGenerator qui a une méthode comme:
Image GenerateThumbnailFrom(Image someImage);
Ma plus grande structure de données pourrait ressembler à ceci:
class Photograph : Image
{
public Photograph(Image thumbnail)
{
if(thumbnail == null) throw new ArgumentNullException("thumbnail");
this.Thumbnail = thumbnail;
}
public Image Thumbnail { get; private set; }
}
Bien sûr, cela pourrait signifier que vous faites des efforts que vous ne voulez pas faire lors de la construction de l'objet, donc je considérerais aussi quelque chose comme ça:
class Photograph : Image
{
private Image thumbnail = null;
private readonly Func<Image,Image> generateThumbnail;
public Photograph(Func<Image,Image> generateThumbnail)
{
this.generateThumbnail = generateThumbnail;
}
public Image Thumbnail
{
get
{
if(this.thumbnail == null)
{
this.thumbnail = this.generateThumbnail(this);
}
return this.thumbnail;
}
}
}
... dans le cas où vous souhaitez une structure de données avec évaluation paresseuse. (Désolé, je n'ai pas inclus mes vérifications nulles et je ne l'ai pas rendu thread-safe, ce que vous voudriez si vous essayiez d'imiter une structure de données immuable).
Comme vous pouvez le voir, l'une ou l'autre de ces classes est construite par une sorte de PhotographRepository, qui a probablement une référence à un ThumbnailGenerator obtenu via l'injection de dépendances.