OOP'nin veri ve davranışı birlikte kapsüllemekle ilgili olduğunu biliyorum, ancak bir Görüntünün bu durumda yeniden boyutlandırma mantığının gömülü olması iyi bir fikir değil, çünkü bir Görüntünün kendisini nasıl yeniden boyutlandırması gerektiğini bilmesine gerek yok bir şekil.
Küçük resim aslında farklı bir Resimdir. Belki bir Fotoğraf ile Küçük Resmi (her ikisi de Görüntülerdir) arasındaki ilişkiyi tutan bir veri yapınız olabilir.
Programlarımı (Görüntüler, Fotoğraflar, Küçük Resimler vb.) Ve Hizmetler'e (PhotographRepository, ThumbnailGenerator vb.) Bölmeye çalışıyorum. Veri yapılarınızı doğru hale getirin ve ardından bu veri yapılarını oluşturmanıza, yönetmenize, dönüştürmenize, sürdürmenize ve kurtarmanıza olanak tanıyan hizmetleri tanımlayın. Veri yapılarıma, doğru bir şekilde oluşturulduklarından ve uygun şekilde kullanıldıklarından emin olmaktan başka bir davranış getirmem.
Bu nedenle, hayır, bir Görüntüde nasıl bir Küçük Resim oluşturma mantığı bulunmamalıdır. Şunun gibi bir yöntemi olan bir ThumbnailGenerator hizmeti olmalıdır:
Image GenerateThumbnailFrom(Image someImage);
Daha büyük veri yapım şöyle görünebilir:
class Photograph : Image
{
public Photograph(Image thumbnail)
{
if(thumbnail == null) throw new ArgumentNullException("thumbnail");
this.Thumbnail = thumbnail;
}
public Image Thumbnail { get; private set; }
}
Tabii ki bu, nesneyi oluştururken yapmak istemediğiniz anlamına geldiğiniz anlamına gelebilir, bu yüzden böyle bir şeyi de düşünürü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;
}
}
}
... tembel değerlendirmeli bir veri yapısı istediğiniz durumda. (Üzgünüm, null kontrollerimi dahil etmedim ve iş parçacığı açısından güvenli hale getirmedim, bu da değişmez bir veri yapısını taklit etmeye çalışsaydınız isteyeceğiniz bir şey).
Gördüğünüz gibi, bu sınıflardan herhangi biri muhtemelen bağımlılık enjeksiyonu yoluyla elde edilen bir ThumbnailGenerator referansına sahip olan bir çeşit PhotographRepository tarafından inşa ediliyor.