Я знаю, что ООП - это инкапсуляция данных и поведения вместе, но я не думаю, что для Image будет хорошей идеей встроить логику изменения размера в этом случае, потому что Image не нужно знать, как изменить размер себя, чтобы быть картинка.
Миниатюра на самом деле другое изображение. Возможно, у вас есть структура данных, которая содержит связь между фотографией и ее миниатюрой (обе из которых являются изображениями).
Я пытаюсь разделить мои программы на такие вещи, как изображения, фотографии, миниатюры и т. Д., И службы (например, PhotographRepository, ThumbnailGenerator и т. Д.). Получите правильные структуры данных, а затем определите сервисы, которые позволят вам создавать, манипулировать, преобразовывать, сохранять и восстанавливать эти структуры данных. Я не добавляю больше поведения в свои структуры данных, чем проверяю, правильно ли они созданы и используются соответствующим образом.
Следовательно, нет, изображение не должно содержать логику о том, как сделать эскиз. Там должен быть сервис ThumbnailGenerator, который имеет такой метод:
Image GenerateThumbnailFrom(Image someImage);
Моя большая структура данных может выглядеть так:
class Photograph : Image
{
public Photograph(Image thumbnail)
{
if(thumbnail == null) throw new ArgumentNullException("thumbnail");
this.Thumbnail = thumbnail;
}
public Image Thumbnail { get; private set; }
}
Конечно, это может означать, что вы прилагаете усилия, которые не хотите делать при создании объекта, поэтому я бы тоже подумал, что это нормально:
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;
}
}
}
... в случае, если вы хотите структуру данных с ленивой оценкой. (Извините, я не включил свои нулевые проверки, и я не сделал его потокобезопасным, чего вы бы хотели, если бы вы пытались имитировать неизменную структуру данных).
Как видите, любой из этих классов создается неким PhotographRepository, который, вероятно, имеет ссылку на ThumbnailGenerator, который он получил посредством внедрения зависимостей.