java:重构案例(MVC的M和C?)

时间:2010-01-28 18:12:09

标签: java architecture refactoring

我有一个Java的情况,我有一个外部设备,我想通过串行I / O进行通信。我知道怎么做,但我现在处于重构模式,以确保我有一个可维护的软件包,&正在寻找关于在高层做什么/不做的建议(以下具体问题)

从概念上讲,假设我有一个带有多个方法的低级DeviceIOChannel接口(getInputStream,getOutputStream和其他一些用于控制连接/断开检测的方法等),由一个或多个处理的类实现各种数据链路类型的I / O(RS232,TCPIP等)。我的一些软件,我们称之为Device类,致力于管理I / O(解析输入,构造输出,管理低级状态机),但不知道如何{{1做它的事情(所以我可以使用RS232或TCPIP而不必更改DeviceIOChannel类)。所以我可能会将Device作为参数传递给DeviceIOChannel的构造函数。我还想向外界公开某种数据模型。

  1. Device / DeviceIOChannel的分区是否合适?
  2. Device需要在工作线程上积极做一些事情。设置它的最佳方法是什么?我应该创建并管理自己的DeviceThread吗?或者我应该传递ScheduledExecutorService作为构造参数吗?
  3. 任何想法(链接到网上的好文章都是理想的!)关于如何ScheduledExecutorService类应该具有与构造不同的Device方法? (在构造中进行所有初始化让我感到紧张......似乎类实例构造应该很快,然后应该为稍后的init或启动阶段保留冗长的东西。)
  4. 如果startup()类具有一对关闭/重启方法,而不关闭+需要创建新的Device实例,该怎么办?
  5. 我还是MVC架构的新手:创建Device DeviceDataModel实现的Device接口是否有意义,或者我应该有一些单独的类DeviceDataModel以某种方式有两个 - 与Device班级进行沟通的方式?

1 个答案:

答案 0 :(得分:1)

一次一个地回答你的问题。

  1. 是的,听起来合理。
  2. 是的,为你的线程传递一个抽象肯定会让这个类更加可测试。构造函数中的两个依赖项听起来不合理。
  3. 使用启动方法会增加更多开销(在方法调用上你必须检查启动是否被调用,你不能假设它),但是我同意构造函数上的这种网络活动在看到它时总是看起来很奇怪。我认为这实际上是一种风格问题,但单独方法的一个优点是,如果您需要在启动之前调试或记录状态,您的Device类可以将其配置表示为实例,而不是使其他内容无法实现。掌握对象。
  4. 我认为这个问题的答案几乎完全取决于你如何处理#3。如果它在构造函数中启动,那么没有任何惊喜的API将无法重新启动,并且如果它通过方法启动,则会有一种方法。
  5. 鉴于此类的网络IO性质,DeviceDataModel接口将使其余代码更易于测试。但是,它不需要由Device类直接实现,而是从Device类的方法作为内部类返回,因此它可以轻松地与设备类通信,但仍然可以在测试期间进行模拟或存根。 。至少,只要不需要序列化DeviceDataModel。