こんにちは。コミュニケーションアプリ「LINE」のモバイルクライアントを開発している石川です。
この記事は、毎週木曜の定期連載 "Weekly Report" 共有の第 59 回です。 LINEヤフー社内には、高い開発生産性を維持するための Review Committee という活動があります。ここで集まった知見を、Weekly Report と称して毎週社内に共有しており、その一部を本ブログ上でも公開しています。(Weekly Report の詳細については、過去の記事一覧を参照してください)
class の facade に水
FooValue
というデータモデルと、それを保存する FooValueStore
というクラスがあるとします。 FooValueStore
は repository
というパッケージ内で定義され、save
や load
、delete
といった基本的な操作を提供しています。
// In repository package
class FooValueStore {
fun save(id: FooId, value: FooValue) { /* ... */ }
fun load(id: FooId): FooValue? { /* ... */ }
fun delete(id: FooId) { /* ... */ }
fun getAllIds(): List<FooId> { /* ... */ }
}
// In caller package
class Caller(private val valueStore: FooValueStore) {
fun doSomething() {
// Uses `valueStore`
}
}
その後、すべての FooValue
エントリを削除するという新たな機能が必要になったとしましょう。この機能を実現するため、FooValueStore
と同じ repository
パッケージに FooValueStoreClearer
というクラスが作成されました。このクラスの clearAll
は、delete
と getAllIds
を利用して、すべての FooValue
エントリを削除します。このクラスを使うためには、FooValueStore
とは別に FooValueStoreClearer
のインスタンスを保持する必要があります。
// In repository package
class FooValueStoreClearer(private val valueStore: FooValueStore) {
fun clearAll() {
valueStore.getAllIds().forEach { valueStore.delete(it) }
}
}
// In caller package
class Caller(
private val valueStore: FooValueStore,
private val clearer: FooValueStoreClearer
) {
fun doSomething() {
// valueStore と clearer の両方を使用
}
}
この構造について、なにか改善すべき点はありますか?