Tôi biết rằng OOP là về việc đóng gói dữ liệu và hành vi cùng nhau, nhưng tôi không nghĩ rằng một hình ảnh nên có logic thay đổi kích thước được nhúng trong trường hợp này, bởi vì một hình ảnh không cần biết cách thay đổi kích thước để trở thành một tấm ảnh.
Một hình thu nhỏ thực sự là một hình ảnh khác nhau. Có lẽ bạn có thể có một cơ sở hạ tầng giữ mối quan hệ giữa một Bức ảnh và đó là Hình thu nhỏ (cả hai đều là Hình ảnh).
Tôi cố gắng phân chia các chương trình của mình thành nhiều thứ (như Hình ảnh, Hình ảnh, Hình thu nhỏ, v.v.) và Dịch vụ (như Chụp ảnh lưu trữ, ThumbnailGenerator, v.v.). Nhận cấu trúc dữ liệu của bạn đúng và sau đó xác định các dịch vụ cho phép bạn tạo, thao tác, chuyển đổi, duy trì và khôi phục các cấu trúc dữ liệu đó. Tôi không đặt thêm bất kỳ hành vi nào vào cấu trúc dữ liệu của mình ngoài việc đảm bảo chúng được tạo đúng và được sử dụng phù hợp.
Do đó, không, một Hình ảnh không nên chứa logic về cách tạo Hình thu nhỏ. Cần có một dịch vụ ThumbnailGenerator có phương thức như:
Image GenerateThumbnailFrom(Image someImage);
Cấu trúc dữ liệu lớn hơn của tôi có thể trông như thế này:
class Photograph : Image
{
public Photograph(Image thumbnail)
{
if(thumbnail == null) throw new ArgumentNullException("thumbnail");
this.Thumbnail = thumbnail;
}
public Image Thumbnail { get; private set; }
}
Tất nhiên điều đó có thể có nghĩa là bạn đang nỗ lực mà bạn không muốn làm trong khi xây dựng đối tượng, vì vậy tôi cũng sẽ xem xét một cái gì đó như thế này 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;
}
}
}
... trong trường hợp bạn muốn cấu trúc dữ liệu với đánh giá lười biếng. (Xin lỗi tôi đã không bao gồm các kiểm tra null của mình và tôi đã không làm cho nó an toàn theo luồng, đó là điều bạn muốn nếu bạn đang cố gắng bắt chước một cấu trúc dữ liệu bất biến).
Như bạn có thể thấy, một trong hai lớp này đang được xây dựng bởi một loại Chụp ảnh nào đó, có thể có tham chiếu đến ThumbnailGenerator mà nó có được thông qua việc tiêm phụ thuộc.