1
勉強会
SingletonとFlyweightを使った
省エネApex
2014年5月9日(金)
池島 晴昭
概要
 目的
 基礎的な知識はプラットフォーム問わずに効
果を発揮することを知ってもらう
 成功要因
 オブジェクト指向の重要性を理解してもらう
 先人の知恵というものは凄いんだ、ということを
理解してもらう
2
テーマ
Singleton と Flyweight を使った省エネApex
3
マルチテナントゆえのガバナ制限
• 1回のトランザクションで実行できるSOQLクエリの合計回数
→ 100回
FlyweightSingleton
Singleton と Flyweight とは
4
オブジェクト指向プログラミングにおける
23のデザインパターン
GoFデザインパターン
FlyweightSingleton
Singleton とは
5
実行環境内でインスタンスを唯一に保つ
Singleton
- me : Singleton
- Singleton()
+ getInstance() : Singleton
1. プロパティに自分自身のインスタンスを static で持つ
2. コンストラクタを private にする
3. インスタンスの取得は static method を介して行う
Flyweight とは
6
1つのインスタンスを再利用して負荷を軽減する
FlyweightFactory
- cash : Flyweight[]
+ getFlyweight() : Flyweight
Flyweight
1. 再利用対象のインスタンスをキャッシュするためのプ
ロパティを持つ
2. 取得要求時、該当のインスタンスがキャッシュになけ
れば生成しキャッシュする
3. 取得を要求されたインスタンスを返却する
例1 課題
7
CustomerTrigger
お客様
CustomerStatusLogic
BusinessTrigger
案件
BusinessStatusLogic
<<update>>
レコード
タイプ
<<select>> <<select>>
複数の Trigger から同じマスタを参照する場合
同じようなクエリを複数回発行することになる
Trigger ごとに select
例1 解決策
8
CustomerTrigger
お客様
CustomerStatusLogic
BusinessTrigger
案件
BusinessStatusLogic
<<update>>
レコード
タイプ
Singleton & Flyweight クラスを介してマスタを参照すると
<<Singleton&Flyweight>>
RecordTypeDao
<<get>> <<get>>
同じようなクエリの発行を1回にすることができる
<<select>>
select は一回
例2 課題
9
CalendarLogic
バッチサイズを超える件数の DML を実行する場合
BusinessTrigger
予約枠
BusinessStatusLogic
レコード
タイプ
<<select>>
<<insert>>
実行バッチ回数分、同じクエリを発行することになる
全件数/200 回の
Trigger を実行
バッチの実行ごとに select
例2 解決策
10
CalendarLogic
Singleton & Flyweight クラスを介してマスタを参照すると
BusinessTrigger
予約枠
BusinessStatusLogic
レコード
タイプ
<<select>>
<<insert>>
同じクエリの発行を1回にすることができる
<<Singleton&Flyweight>>
RecordTypeDao
<<get>>
全件数/200 回の
Trigger を実行
select は一回
まとめ
11
一回のトランザクションで
同じデータを複数回参照することになるような
更新処理ロジックは
Singleton&Flyweight を使うことで
SOQL の発行回数を削減することができる
先人の知恵をないがしろにせず
自らのスキルとして吸収していきましょう

02 singletonとflyweightを使った省エネapex