Как рефакторировать большой класс репозитория с динамическим переключением?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как рефакторировать большой класс репозитория с динамическим переключением?

Сообщение Anonymous »

У меня есть устаревший код со следующей структурой: < /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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»