Wiem, że OOP polega na enkapsulacji danych i zachowaniu razem, ale nie sądzę, że dobrym pomysłem jest, aby Image miał w tym przypadku logikę zmiany rozmiaru, ponieważ Obraz nie musi wiedzieć, jak się zmienić obraz.
Miniatura jest w rzeczywistości innym obrazem. Być może masz strukturę danych, która utrzymuje relację między zdjęciem a jego miniaturą (oba są obrazami).
Próbuję podzielić moje programy na rzeczy (takie jak obrazy, fotografie, miniatury itp.) I usługi (takie jak PhotographRepository, ThumbnailGenerator itp.). Popraw swoje struktury danych, a następnie zdefiniuj usługi, które pozwalają tworzyć, manipulować, przekształcać, utrwalać i odzyskiwać te struktury danych. Nie stawiam więcej zachowań w moich strukturach danych niż upewnianie się, że są one prawidłowo tworzone i odpowiednio wykorzystywane.
Dlatego nie, obraz nie powinien zawierać logiki dotyczącej sposobu tworzenia miniatury. Powinna istnieć usługa ThumbnailGenerator, która ma metodę taką jak:
Image GenerateThumbnailFrom(Image someImage);
Moja większa struktura danych może wyglądać następująco:
class Photograph : Image
{
public Photograph(Image thumbnail)
{
if(thumbnail == null) throw new ArgumentNullException("thumbnail");
this.Thumbnail = thumbnail;
}
public Image Thumbnail { get; private set; }
}
Oczywiście może to oznaczać, że robisz wysiłek, którego nie chcesz robić podczas konstruowania obiektu, więc rozważę coś takiego:
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;
}
}
}
... w przypadku, gdy chcesz mieć strukturę danych z leniwą oceną. (Przepraszam, że nie uwzględniłem moich zerowych czeków i nie uczyniłem go bezpiecznym dla wątków, czego chciałbyś, gdybyś próbował naśladować niezmienną strukturę danych).
Jak widać, każda z tych klas jest budowana przez pewnego rodzaju PhotographRepository, który prawdopodobnie ma odniesienie do ThumbnailGenerator, który otrzymał poprzez wstrzyknięcie zależności.