Saya tahu bahwa OOP adalah tentang merangkum data dan perilaku bersama-sama, tetapi saya tidak berpikir itu ide yang baik untuk Gambar untuk memiliki ukuran logika yang tertanam dalam kasus ini, karena Gambar tidak perlu tahu bagaimana mengubah ukuran dirinya menjadi sebuah Gambar.
Thumbnail sebenarnya adalah Gambar yang berbeda. Mungkin Anda memiliki struktur data yang menahan hubungan antara sebuah Foto dan Gambar Kecil (keduanya adalah Gambar).
Saya mencoba membagi program saya menjadi beberapa hal (seperti Gambar, Foto, Gambar Kecil, dll.) Dan Layanan (seperti PhotographRepository, ThumbnailGenerator, dll.). Dapatkan struktur data Anda dengan benar, dan kemudian tentukan layanan yang memungkinkan Anda membuat, memanipulasi, mengubah, bertahan, dan memulihkan struktur data tersebut. Saya tidak menaruh perilaku lagi dalam struktur data saya selain memastikan mereka dibuat dengan benar dan digunakan dengan tepat.
Karena itu, tidak, sebuah Gambar tidak boleh berisi logika tentang cara membuat Gambar Kecil. Harus ada layanan ThumbnailGenerator yang memiliki metode seperti:
Image GenerateThumbnailFrom(Image someImage);
Struktur data saya yang lebih besar mungkin terlihat seperti ini:
class Photograph : Image
{
public Photograph(Image thumbnail)
{
if(thumbnail == null) throw new ArgumentNullException("thumbnail");
this.Thumbnail = thumbnail;
}
public Image Thumbnail { get; private set; }
}
Tentu saja itu mungkin berarti Anda melakukan upaya yang tidak ingin Anda lakukan saat membangun objek, jadi saya akan mempertimbangkan sesuatu seperti ini juga OK:
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;
}
}
}
... dalam kasus di mana Anda menginginkan struktur data dengan evaluasi malas. (Maaf saya tidak menyertakan cek nol saya dan saya tidak membuatnya aman, yang merupakan sesuatu yang Anda inginkan jika Anda mencoba meniru struktur data yang tidak dapat diubah).
Seperti yang Anda lihat, salah satu dari kelas-kelas ini sedang dibangun oleh semacam PhotographRepository, yang mungkin memiliki referensi ke ThumbnailGenerator yang didapat melalui injeksi dependensi.