Какова лучшая практика: бизнес-логика в статьях или отдельная? - PullRequest
0 голосов
/ 31 октября 2019

Недавно я начал программировать на Vert.x с помощью Kotlin, этот вопрос является общим для любой технологии, с которой мы используем инструментарий Vertx. Я создал свои статьи, но в них у меня есть бизнес-логика, и я хотел бы знать, что является лучшей практикой:

1. Разделить логику на независимый класс, создать ее экземпляр в статье и выполнить ее операции. , оставляя только вертикалку для получения и доставки сообщений на eventBus.

2. Реализация по возможности логики в той же вертикалке.

Ниже я покажу пример того, как код был, но, как вы можете видеть, это логика внутри самой вертикали. Это хорошо с точки зрения дизайна, или вы должны отнести его к независимому классу и оставить этот шаблон только для операций приема и отправки сообщений на шине

class MyAPIAgentImpl(vertx: Vertx) : CoroutineVerticle() {

    var httpClient = HttpClient(vertx)
    var apiConfig: JsonObject = Config.get().getJsonObject("myapi")

override suspend fun start() {
      vertx.eventBus().consumer<JsonObject>(BusChannel.MY_API_CHANNEL) {
        message -> launch { message.reply(findElem(message.body().getLong("Id"),
        message.body().getString("countryCode"))) }
      }
  }

  override suspend fun findElem(Id: Long, countryCode: String): String {

      var hashMap = HashMap<String, String>()
      hashMap.put("Accept", "*/*")
      hashMap.put("Authorization", "Bearer XXXX")

      val baseUrl: String = apiConfig.get("apiBaseUrl")
      val port: Int = apiConfig.get("apiPort")
      val apiRelativeUrl: String = apiConfig.get("apiRelativeUrl")

      val resp: HttpResponse = httpClient.GET(String.format(baseUrl, countryCode), port,
        String.format(apiRelativeUrl, Id), hashMap, apiConfig.getLong("requestTimeout"))

    if (resp.status == HttpCode.OK) {
        return resp.message.get("msg")
      } else {
        logger.error("[HTTP CALL] My API response with error status code: ${resp.status}")
        throw ApiException(ErrorMessage(-1, resp.status, "Error calling external API"))
      }
  }

  companion object {
    private val logger = LoggerFactory.getLogger(MyAPIAgentImpl::class.java)
  }
}

Я хотел бызнать ваши комментарии и опыт в этом отношении при разработке приложений с Vertx

1 Ответ

0 голосов
/ 02 ноября 2019

Так же, как у вас не будет логики в вашем RestController / Servlet, хорошей практикой будет держать логику подальше от Verticle.
Причина остается той же, если вы захотите использовать другую библиотеку Reactive позже, вашЕдинственное, что может волновать, это изменить этот слой Verticle со спецификой этой библиотеки, но не с бизнес-логикой.
Плюс, если вы рассматриваете многоуровневый подход, обработка событий и решение, что с ними делать, подпадают под два разных слоя.
Наличие как вертикали, так и логики в одном было бы нарушением принципа единой ответственности.

...