¿Cuál es la mejor práctica para evitar dependencias circulares? Tuve este problema con Javascript pero también se aplica a cualquier otro lenguaje de programación.
Por ejemplo, tengo este módulo translationService.ts donde cada vez que se cambia una configuración regional, quiero volver a cargar la configuración (por lo que necesito importar settingsService.ts . Pero en mi settingsService.ts tengo una función reloadSettings que usa translationService para traducir el mensaje de error.
Supongo que se podría decir que el servicio de translationService no debería saber nada sobre el servicio de settingsService , pero ¿cómo se escribe realmente el código para lograrlo?
serviciodetraduccion.ts
import { reloadSettings } from '@/services/settingsService.ts' // When the locale is changed, we want to reload the settings const changeLocale = (locale: string) => { i18n.locale = locale reloadSettings() } Pero en mi settingsService.ts tengo una dependencia en translationService para mostrar la excepción en la configuración regional correcta.
settingsService.ts
import settingsApi from '@/api/settingsApi.ts' import { translate } from '@/services/translationService.ts' const reloadSettings = () => { try { settingsStore.settings = settingsApi.getSettings() } catch (error) { console.log( translate(error.message) ) } } Entonces termino con dependencias circulares donde settingsService depende de translationService y translationService depende de settingsService
settingsService -> translationService -> settingsService
En la mayoría de los casos como este, debe evitar el acoplamiento bidireccional eliminando al menos una dependencia y reemplazándola con un acoplamiento indirecto.
Toma tu ejemplo.
Pero en mi settingsService.ts tengo una función reloadSettings que usa el servicio de traducción para traducir el mensaje de error.
Suena correcto, su servicio de traducción parece estar en un nivel inferior. Mantenga esta dependencia como directa.
Tengo este módulo translationService.ts donde cada vez que se cambia una configuración regional, quiero volver a cargar la configuración (por lo que necesito importar settingsService.ts)
No, no tienes que tener una dependencia directa aquí.
Puede introducir fácilmente un emisor de eventos que simplemente emita un evento de cambio de configuración regional y el servicio de configuración simplemente se suscriba al evento.
No hay una dependencia directa, ambos dependen del emisor de eventos, pero aún así se comunican a través de eventos.