Sei que o POO envolve encapsular dados e comportamento juntos, mas não acho que seja uma boa ideia que uma imagem tenha a lógica de redimensionamento incorporada nesse caso, porque uma imagem não precisa saber como se redimensionar para ser uma imagem.
Uma miniatura é na verdade uma imagem diferente. Talvez você tenha uma estrutura de dados que mantenha o relacionamento entre uma Fotografia e sua Miniatura (ambas são Imagens).
Tento dividir meus programas em coisas (como Imagens, Fotografias, Miniaturas, etc.) e Serviços (como PhotographRepository, ThumbnailGenerator, etc.). Acerte suas estruturas de dados e defina os serviços que permitem criar, manipular, transformar, persistir e recuperar essas estruturas de dados. Eu não coloco mais comportamento em minhas estruturas de dados do que garantir que elas sejam criadas corretamente e usadas adequadamente.
Portanto, não, uma imagem não deve conter a lógica de como criar uma miniatura. Deve haver um serviço ThumbnailGenerator que tenha um método como:
Image GenerateThumbnailFrom(Image someImage);
Minha estrutura de dados maior pode ficar assim:
class Photograph : Image
{
public Photograph(Image thumbnail)
{
if(thumbnail == null) throw new ArgumentNullException("thumbnail");
this.Thumbnail = thumbnail;
}
public Image Thumbnail { get; private set; }
}
Claro que isso pode significar que você está fazendo um esforço que não deseja ao construir o objeto, então eu consideraria algo assim também:
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;
}
}
}
... no caso em que você deseja uma estrutura de dados com avaliação lenta. (Desculpe, não incluí minhas verificações nulas e não a tornei segura para threads, o que é algo que você deseja se estiver tentando imitar uma estrutura de dados imutável).
Como você pode ver, qualquer uma dessas classes está sendo criada por algum tipo de PhotographRepository, que provavelmente tem uma referência a um ThumbnailGenerator que foi obtido por injeção de dependência.