私はOOPが一緒にデータと振る舞いをカプセル化についてであることを知っているが、画像がありませんので、私は、それがこのケースに埋め込まれてリサイズロジックを持っているイメージのために良いアイデアだとは思わない必要があること自体のサイズを変更する方法を知っています画像。
サムネイルは実際には別の画像です。おそらく、写真とサムネイル(どちらも画像)の関係を保持するデータ構造を持っている可能性があります。
プログラムを(画像、写真、サムネイルなど)とサービス(PhotographRepository、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チェックを含めず、スレッドセーフにしませんでした。これは、不変のデータ構造を模倣しようとした場合に必要なものです)。
ご覧のとおり、これらのクラスのいずれかは、何らかの依存関係の注入によって取得されたThumbnailGeneratorへの参照を持っている、何らかのPhotographRepositoryによって構築されています。