---
layout: pofeaa
title: レイジーロード
---

原文: http://www.martinfowler.com/eaaCatalog/lazyLoad.html

*必要なデータ全てを持つのではなく、その取得方法を知っているオブジェクト*

解説の全文は『PofEAA』 **200** ページを参照。

![](http://www.martinfowler.com/eaaCatalog/lazyLoadSketch.gif)

データベースからデータをメモリ上にロードするとき、関心のあるオブジェクトだけでなく、それに関連するオブジェクトも同時に読み込むように設計してあると便利である。開発者にとってオブジェクトのロードが楽になり、必要なすべてのオブジェクトを明示的にロードする必要がなくなる。

しかし、この方法を採用した結果、ひとつのオブジェクトのロードが、関係する多数のオブジェクトのロードを引き起こしてしまう。そのうちの一部しか必要でない場合、これは性能上の問題となりうる。

Lazy Load (遅延ロード)ではロード処理をしばらく保留し、オブジェクト構造にしるしをつけておくことで、データが必要になった時に初めてロードするようにする。物事を後回しにしておくと、それをやらなくてよくなったときに得をする。

Lazy Load はいくつかの種類に分けられる。Lazy Initialization は、通常 null のような特別な値を用いてあるフィールドがロードされていないことを示す。フィールドへのアクセスが発生すると、その値をチェックして、まだロードされていないときはロードする。Virtual Proxy は、本物のオブジェクトと同じインタフェースを持つオブジェクトである。いずれかのメソッドが初めて呼ばれたときに本物のオブジェクトをロードし、処理を委譲する。Value Holder は getValue メソッドを持つオブジェクトである。クライアントが実際のオブジェクトを取得するため getValue を初めて呼び出した時にロードを行う。Ghost はデータを持っていないオブジェクトである。最初にそのメソッドを呼び出したときに、Ghost はすべてのデータをそのフィールドにロードする。

これらのアプローチは少しずつ異なっており、さまざまなトレードオフを持つ。組み合わせて利用することもある。本書には、これら全てを説明し例を挙げている。

