我知道OOP就是将数据和行为封装在一起,但是在这种情况下,对于Image嵌入调整大小逻辑不是一个好主意,因为Image 不需要知道如何调整大小即可一个图像。
缩略图实际上是不同的图像。也许您的数据结构可能包含照片与其缩略图(两者均为图像)之间的关系。
我尝试将程序分为事物(如图像,照片,缩略图等)和服务(如PhotoRepository,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;
}
}
}
...如果您想要一个具有惰性求值的数据结构。(很抱歉,我没有包含null检查,也没有使它成为线程安全的,如果您想模仿不可变的数据结构,这是您想要的)。
如您所见,这些类中的任何一个都由某种PhotographRepository构建,该类可能引用了通过依赖项注入获得的ThumbnailGenerator。