Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 最佳实践是什么:垂直或独立的业务逻辑?_Kotlin_Design Patterns_Vert.x - Fatal编程技术网

Kotlin 最佳实践是什么:垂直或独立的业务逻辑?

Kotlin 最佳实践是什么:垂直或独立的业务逻辑?,kotlin,design-patterns,vert.x,Kotlin,Design Patterns,Vert.x,最近我开始用Kotlin在Vert.x中编程,这个问题对于我们使用Vertx工具包的任何技术都是通用的。 我创建了我的竖梃,但在这些竖梃中我有业务逻辑,我想知道什么是最佳实践: 1.将逻辑分离为一个独立的类,在verticle中实例化它并执行其操作,只留下verticle接收消息并将消息传递给eventBus 2.尽可能在同一垂直方向上实现逻辑 下面我展示了一个代码的示例,但正如您所看到的,是verticle本身的逻辑。从设计的角度来看,它是这样的,或者你应该把它带到一个独立的类中,把垂直部分留

最近我开始用Kotlin在Vert.x中编程,这个问题对于我们使用Vertx工具包的任何技术都是通用的。 我创建了我的竖梃,但在这些竖梃中我有业务逻辑,我想知道什么是最佳实践:

1.将逻辑分离为一个独立的类,在verticle中实例化它并执行其操作,只留下verticle接收消息并将消息传递给eventBus

2.尽可能在同一垂直方向上实现逻辑

下面我展示了一个代码的示例,但正如您所看到的,是verticle本身的逻辑。从设计的角度来看,它是这样的,或者你应该把它带到一个独立的类中,把垂直部分留给在总线上接收和发送消息的操作

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)
  }
}
类MyAPIAgentImpl(vertx:vertx):CoroutineVerticle(){ var httpClient=httpClient(vertx) var apiConfig:JsonObject=Config.get().getJsonObject(“myapi”) 覆盖暂停乐趣开始(){ vertx.eventBus().consumer(总线通道.我的API通道){ message->launch{message.reply(findElem(message.body().getLong(“Id”), message.body().getString(“countryCode”)} } } 覆盖挂起findElem(Id:Long,countryCode:String):String{ var hashMap=hashMap() hashMap.put(“接受”,“*/*”) hashMap.put(“授权”、“持有人XXXX”) val baseUrl:String=apiConfig.get(“apiBaseUrl”) val-port:Int=apiConfig.get(“apiPort”) val-apirativeUrl:String=apiConfig.get(“apirativeUrl”) val resp:HttpResponse=httpClient.GET(String.format(baseUrl,countryCode),端口, String.format(apiRelativeUrl,Id)、hashMap、apiConfig.getLong(“请求超时”)) if(resp.status==HttpCode.OK){ 返回相应的消息获取(“消息”) }否则{ logger.error(“[HTTP调用]我的API响应,错误状态代码:${resp.status}”) 抛出ApiException(错误消息(-1,对应状态,“调用外部API时出错”)) } } 伴星{ private val logger=LoggerFactory.getLogger(MyAPIAgentImpl::class.java) } }
我想知道您在使用Vertx设计应用程序时对这方面的意见和经验,正如您在RestController/Servlet中没有逻辑一样,最好直接将逻辑远离垂直面。
原因是一样的,如果您以后想使用另一个反应式库,您唯一担心的是用该库的细节更改此垂直层,而不是业务逻辑。
另外,如果您考虑分层方法,则处理事件和决定如何处理事件属于两个不同的层。

将垂直和逻辑结合在一起将违反单一责任原则。

我始终建议不要将业务逻辑与垂直结合在一起。在这种方法中,如果您决定更改框架/方法等,可以重用具有业务逻辑的类。在变得(超过)复杂之前,最好将所有内容保持在一起。突然“改变框架”的想法是世界上最无关紧要的事情。