ฉันรู้ว่า OOP เกี่ยวกับการห่อหุ้มข้อมูลและพฤติกรรมด้วยกัน แต่ฉันไม่คิดว่ามันเป็นความคิดที่ดีที่รูปภาพจะมีตรรกะการปรับขนาดที่ฝังอยู่ในกรณีนี้เนื่องจากรูปภาพไม่จำเป็นต้องรู้วิธีปรับขนาดตัวเองให้เป็น รูปภาพ
รูปขนาดย่อเป็นรูปอื่น บางทีคุณอาจมีโครงสร้างข้อมูลที่เก็บความสัมพันธ์ระหว่างรูปถ่ายกับรูปขนาดย่อ (ทั้งคู่เป็นรูป)
ฉันพยายามแบ่งโปรแกรมของฉันเป็นสิ่งต่าง ๆ (เช่นรูปภาพ, รูปถ่าย, รูปขนาดย่อ ฯลฯ ) และบริการ (เช่นรูปถ่ายพื้นที่เก็บข้อมูลขนาดย่อ, 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 ที่ผ่านการฉีดพึ่งพา