У меня есть устаревший код со следующей структурой: < /p>
abstract class AbstractRepository(
protected val dataSource: DataSource
) {
fun getClientById(id: Long): Client {
return dataSource.connection.use { conn ->
// implementation
}
}
fun updateOrderStatus(orderId: Long, status: String) {
dataSource.connection.use { conn ->
// implementation
}
}
fun calculateMetrics(date: LocalDate): Statistics {
return dataSource.connection.use { conn ->
// complex statistics calculations
}
}
fun processPayment(payment: Payment) {
dataSource.connection.use { conn ->
// payment processing
}
}
// ... about 15-20 more similar methods
}
@Repository
class RepositoryA(
@Value("\${datasource.a.url}")
dataSource: DataSource
) : AbstractRepository(dataSource)
@Repository
class RepositoryB(
@Value("\${datasource.b.url}")
dataSource: DataSource
) : AbstractRepository(dataSource)
@Service
class RepositorySelector {
@Autowired
private lateinit var repositoryA: RepositoryA
@Autowired
private lateinit var repositoryB: RepositoryB
fun getRepository(someBusinessLogic: Boolean): AbstractRepository {
return if (someBusinessLogic) repositoryA else repositoryB
}
}
@Service
class BusinessService(
private val repositorySelector: RepositorySelector
) {
fun doSomething(param: String) {
val shouldUseRepoA = // some business logic
val repository = repositorySelector.getRepository(shouldUseRepoA)
// Repository usage
val client = repository.getClientById(1L)
repository.processPayment(Payment())
}
}
< /code>
Я борюсь с устаревшей кодовой базой, где у меня есть абстрактный класс репозитория, который со временем стал слишком большим. Он содержит около 20 различных методов для операций с базами данных, каждый из которых работает с различными организациями, такими как клиент, заказ, оплата и статистика. Два конкретных хранилища наследуют от этого абстрактного класса, и они различаются только по своей конфигурации данных. услуга. Хотя текущее решение работает, оно кажется неправильным - абстрактный класс нарушает принцип единственной ответственности, и механизм переключения кажется неуклюжим. Сохранение возможности повторного использования кода между репозиториями. Мне нужно решение, которое позволит легко добавить новые репозитории в будущем и обеспечить более элегантный способ динамического переключения между ними. Я особенно заинтересован в шаблонах или лучших практиках, которые могут помочь как с большой абстрактной проблемой класса, так и с требованиями динамического переключения репозитория. Чтобы разделить большой абстрактный класс на более мелкие и добавить их, используя композицию через «новое» ключевое слово. Однако проблема с этим подходом заключается в том, что было бы чрезвычайно трудно проверить этот код.
Подробнее здесь: https://stackoverflow.com/questions/794 ... -switching
Как рефакторировать большой класс репозитория с динамическим переключением? ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Проблема с динамическим переключением темного режима в Codename One — граница остается белой
Anonymous » » в форуме IOS - 0 Ответы
- 37 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Проблема с динамическим переключением темного режима в Codename One — граница остается белой
Anonymous » » в форуме IOS - 0 Ответы
- 27 Просмотры
-
Последнее сообщение Anonymous
-