So che OOP riguarda l'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 di sapere come ridimensionare se stessa per essere un'immagine.
Una miniatura è in realtà un'immagine diversa. Forse potresti avere una struttura di dati che contiene la relazione tra una fotografia e la sua miniatura (entrambe sono immagini).
Cerco di dividere i miei programmi in cose (come immagini, fotografie, miniature, ecc.) E servizi (come PhotographRepository, ThumbnailGenerator, ecc.). Ottimizza le strutture dei dati, quindi definisci i servizi che ti consentono di creare, manipolare, trasformare, persistere e ripristinare tali strutture di dati. Non ho alcun comportamento in più nelle mie strutture di dati che assicurarmi che siano create correttamente e utilizzate in modo appropriato.
Pertanto, no, un'immagine non dovrebbe contenere la logica su come realizzare un'anteprima. Dovrebbe esserci un servizio ThumbnailGenerator che ha un metodo come:
Image GenerateThumbnailFrom(Image someImage);
La mia struttura di dati più grande potrebbe apparire così:
class Photograph : Image
{
public Photograph(Image thumbnail)
{
if(thumbnail == null) throw new ArgumentNullException("thumbnail");
this.Thumbnail = thumbnail;
}
public Image Thumbnail { get; private set; }
}
Naturalmente ciò potrebbe significare che stai facendo uno sforzo che non vuoi fare mentre costruisci l'oggetto, quindi prenderei in considerazione anche qualcosa del genere 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 di dati con valutazione pigra. (Mi dispiace non aver incluso i miei controlli nulli e non l'ho reso sicuro per i thread, il che è qualcosa che vorresti se stessi cercando di imitare una struttura di dati immutabile).
Come puoi vedere, una di queste classi è stata creata da un qualche tipo di PhotographRepository, che probabilmente ha un riferimento a un ThumbnailGenerator ottenuto attraverso l'iniezione di dipendenza.