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

java:重构案例(MVC的M和C?),java,architecture,refactoring,Java,Architecture,Refactoring,在Java中,我有一个外部设备,我想通过串行I/O进行通信。我知道如何做到这一点,但我现在处于重构模式,以确保我有一个可维护的软件包,并在高级别上寻求关于做什么/不做什么的建议(具体问题如下) 从概念上讲,假设我有一个低级的DeviceIOChannel接口,它有几种方法(getInputStream、getOutputStream和其他一些用于控制连接/断开检测的方法等),由一个或多个类实现,这些类处理各种数据链路类型(RS232、TCPIP等)的I/O。我的一些软件,让我们称之为设备类,专门

在Java中,我有一个外部设备,我想通过串行I/O进行通信。我知道如何做到这一点,但我现在处于重构模式,以确保我有一个可维护的软件包,并在高级别上寻求关于做什么/不做什么的建议(具体问题如下)

从概念上讲,假设我有一个低级的
DeviceIOChannel
接口,它有几种方法(getInputStream、getOutputStream和其他一些用于控制连接/断开检测的方法等),由一个或多个类实现,这些类处理各种数据链路类型(RS232、TCPIP等)的I/O。我的一些软件,让我们称之为
设备
类,专门用于管理I/O(解析输入、构造输出、管理低级状态机),但不知道
设备通道
如何工作的细节(因此我可以将其与RS232或TCPIP一起使用,而无需更改
设备
类)。因此,我可能会将
DeviceIOChannel
作为参数传递给
Device
的构造函数。我还想向外界公开某种数据模型

  • 我对
    设备通道的分区是否正确
  • 设备
    需要在工作线程上主动执行某些操作。最好的设置方法是什么?我应该让它创建和管理自己的
    线程
    还是
    ScheduledExecutorService
    ?或者我应该传入一个
    ScheduledExecutorService
    作为构造参数吗
  • 关于如何确定
    设备
    类是否应该有一个与构造不同的
    startup()
    方法,您有什么想法(链接到web上的好文章会很理想!)?(在构造中完成所有初始化让我感到紧张……似乎类实例构造应该很快,然后应该为稍后的初始化或启动阶段保留冗长的内容。)
  • 与不关机+需要创建新的
    设备
    实例相比,是否有一个带有一对关机/重启方法的
    设备
  • 我还是MVC架构新手:创建一个
    Device
    实现的
    DeviceDataModel
    接口有意义吗,还是应该有一个单独的类
    DeviceDataModel
    ,以某种方式与
    Device
    类进行双向通信

  • 一次回答一个问题

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

  • 一次回答一个问题

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