Sé que OOP se trata de encapsular datos y comportamiento juntos, pero no creo que sea una buena idea que una Imagen tenga la lógica de cambio de tamaño incrustada en este caso, porque una Imagen no necesita saber cómo cambiar el tamaño para ser una imagen.
Una miniatura es en realidad una imagen diferente. Quizás tenga una estructura de datos que mantenga la relación entre una Fotografía y su Miniatura (ambas son Imágenes).
Intento dividir mis programas en cosas (como Imágenes, Fotografías, Miniaturas, etc.) y Servicios (como PhotographRepository, ThumbnailGenerator, etc.). Obtenga las estructuras de datos correctas y luego defina los servicios que le permiten crear, manipular, transformar, persistir y recuperar esas estructuras de datos. No pongo más comportamiento en mis estructuras de datos que asegurarme de que se creen correctamente y se usen adecuadamente.
Por lo tanto, no, una imagen no debe contener la lógica sobre cómo hacer una miniatura. Debe haber un servicio ThumbnailGenerator que tenga un método como:
Image GenerateThumbnailFrom(Image someImage);
Mi estructura de datos más grande podría verse así:
class Photograph : Image
{
public Photograph(Image thumbnail)
{
if(thumbnail == null) throw new ArgumentNullException("thumbnail");
this.Thumbnail = thumbnail;
}
public Image Thumbnail { get; private set; }
}
Por supuesto, eso podría significar que está haciendo un esfuerzo que no desea hacer mientras construye el objeto, por lo que consideraría algo como esto también:
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;
}
}
}
... en el caso de que desee una estructura de datos con evaluación diferida. (Lo siento, no incluí mis comprobaciones nulas y no lo hice seguro para subprocesos, que es algo que desearía si intentara imitar una estructura de datos inmutable).
Como puede ver, cualquiera de estas clases está siendo construida por algún tipo de PhotographRepository, que probablemente tiene una referencia a un ThumbnailGenerator que obtuvo a través de la inyección de dependencia.