こんにちは。コミュニケーションアプリ「LINE」のモバイルクライアントを開発しているTuan Chauです。
この記事は、"Review Committee Report" 共有の連載第 72 回です。LINEヤフー社内には、高い開発生産性を維持するための Review Committee という活動があります。ここで集まった知見を定期的に社内に共有しており、その一部を本ブログ上でも公開しています。(Review Committee Report の詳細については、過去の記事一覧を参照してください)
鶏が先か、卵が先か?
写真を提供することに特化したphoto-provider
というモジュールと、ギャラリーで写真を表示するhome-gallery
というモジュールがあると想像してください。photo-provider
から提供された写真をホームギャラリーに表示したいとします。
以下は簡略化されたコードです。
photo-provider
モジュール:
// PhotoProvider.kt
class PhotoProvider {
fun getPhotos(): List<HomeGalleryPhotoItem> {
// リポジトリから写真を取得
return listOf(HomeGalleryPhotoItem("vacation.jpg", "Summer Vacation", ...))
}
}
// プロバイダーモジュール内のデータモデル
data class HomeGalleryPhotoItem(val fileName: String, val description: String, ...)
home-gallery
モジュール:
// build.gradle.kts
dependencies {
implementation(project(":photo-provider"))
}
// HomeGallery.kt (別のモジュール内)
class HomeGallery(private val photoProvider: PhotoProvider) {
fun displayPhotos() {
val photos = photoProvider.getPhotos()
// ホームギャラリーに写真を表示
photos.forEach { renderPhoto(it) }
}
private fun renderPhoto(photo: HomeGalleryPhotoItem) {
// UIで写真をレンダリング
}
}
このコードに何か問題はありますか?
概念的循環依存
問題は、PhotoProvider
がHomeGalleryPhotoItem
を定義して返していることです。このクラスは名前に「HomeGallery」への参照を含んでいます。これにより概念的循環依存が発生します。
- プロバイダーモジュールが特定の利用者(HomeGallery)について知っている