Ich weiß , dass OOP ist etwa gemeinsam Daten und Verhalten einkapseln, aber ich glaube nicht , es ist eine gute Idee für ein Bild ist die Resize - Logik in diesem Fall eingebettet zu haben, weil ein Bild nicht müssen wissen , wie sich die Größe zu sein ein Bild.
Ein Miniaturbild ist eigentlich ein anderes Bild. Vielleicht haben Sie eine Datenstruktur, die die Beziehung zwischen einem Foto und seinem Miniaturbild enthält (beide sind Bilder).
Ich versuche, meine Programme in Dinge (wie Bilder, Fotos, Miniaturansichten usw.) und Dienste (wie PhotographRepository, ThumbnailGenerator usw.) zu unterteilen. Machen Sie Ihre Datenstrukturen richtig und definieren Sie dann die Services, mit denen Sie diese Datenstrukturen erstellen, bearbeiten, transformieren, beibehalten und wiederherstellen können. Ich füge meinen Datenstrukturen nicht mehr Verhalten hinzu, als sicherzustellen, dass sie ordnungsgemäß erstellt und ordnungsgemäß verwendet werden.
Daher sollte ein Bild nicht die Logik zum Erstellen eines Miniaturbilds enthalten. Es sollte einen ThumbnailGenerator-Dienst geben, der eine Methode wie die folgende hat:
Image GenerateThumbnailFrom(Image someImage);
Meine größere Datenstruktur könnte folgendermaßen aussehen:
class Photograph : Image
{
public Photograph(Image thumbnail)
{
if(thumbnail == null) throw new ArgumentNullException("thumbnail");
this.Thumbnail = thumbnail;
}
public Image Thumbnail { get; private set; }
}
Das könnte natürlich bedeuten, dass Sie sich beim Erstellen des Objekts keine Mühe machen, also würde ich so etwas auch als OK betrachten:
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;
}
}
}
... für den Fall, dass Sie eine Datenstruktur mit verzögerter Auswertung wünschen. (Entschuldigung, ich habe meine Nullprüfungen nicht eingeschlossen und sie nicht threadsicher gemacht. Dies ist etwas, das Sie möchten, wenn Sie versuchen, eine unveränderliche Datenstruktur nachzuahmen.)
Wie Sie sehen können, wird eine dieser Klassen von einer Art PhotographRepository erstellt, das wahrscheinlich einen Verweis auf einen ThumbnailGenerator enthält, den es durch Abhängigkeitsinjektion erhalten hat.