So che OOP tratta dell'incapsulamento di dati e comportamenti insieme, ma non penso che sia una buona idea per un'immagine avere la logica di ridimensionamento incorporata in questo caso, perché un'immagine non ha bisogno sapere come ridimensionare se stesso per essere un'immagine.
Una miniatura è in realtà un'immagine diversa. Forse potresti avere una struttura dati che mantiene la relazione tra una fotografia e la sua miniatura (che sono entrambe immagini).
Cerco di dividere i miei programmi in cose (come immagini, fotografie, miniature, ecc.) e servizi (come il repository fotografico, ThumbnailGenerator, ecc.). Ottieni le strutture dati corrette e quindi definisci i servizi che ti consentono di creare, manipolare, trasformare, mantenere e ripristinare tali strutture dati. Non inserisco più comportamenti nelle mie strutture dati che nell'assicurarmi che vengano creati correttamente e utilizzati in modo appropriato.
Pertanto, no, un'immagine non dovrebbe contenere la logica su come creare una miniatura. Ci dovrebbe essere un servizio ThumbnailGenerator che abbia un metodo come:
Image GenerateThumbnailFrom(Image someImage);
La mia struttura dati più grande potrebbe essere simile a questa:
class Photograph : Image
{
public Photograph(Image thumbnail)
{
if(thumbnail == null) throw new ArgumentNullException("thumbnail");
this.Thumbnail = thumbnail;
}
public Image Thumbnail { get; private set; }
}
Ovviamente questo potrebbe significare che stai facendo uno sforzo che non vuoi fare mentre costruisci l'oggetto, quindi considererei qualcosa di simile anche a OK:
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;
}
}
}
... nel caso in cui si desideri una struttura dati con valutazione lazy. (Scusa se non ho incluso i miei assegni null e non l'ho reso thread-safe, che è qualcosa che vorresti se stessimo cercando di imitare una struttura dati immutabile).
Come puoi vedere, una di queste classi viene costruita da una specie di PhotographRepository, che probabilmente ha un riferimento a un ThumbnailGenerator che ha ottenuto tramite l'iniezione delle dipendenze.