Я знаю, що OOP - це інкапсуляція даних та поведінки разом, але я не думаю, що в 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, який він отримав за допомогою ін'єкції залежності.