如何构建大班?

时间:2016-05-26 10:10:25

标签: java class

我目前正在编写用于与设备通信的Java API。设备制造商提供的设备的原始API是用C语言编写的,基本上只是一个大的头文件,用于定义与设备通信所需的每个结构,枚举和功能。很多这些结构和功能实际上是用于更改设备设置或检索设备信息。

由于我将此API移植到Java,因此我希望使API更易于使用,并且对于对设备及其C API没有实际了解的人来说更容易使用。我的目标是让一个类Device具有连接和检索设备数据的方法。

现在我想知道我应该如何在课堂上整合所有的设置和信息。如果我基本上做了原始API的OO-Port,那么这个类会变得非常大而且难以使用。我开始做的是将所有设置信息放在自己的类中,并使该类成为我的Device类的成员。 DeviceSettings类将引用其Device类Connection对象(基本上是一个通过JNI / JNA处理与C API通信的对象)。

现在看起来像这样:

class Device {
    private JNIDeviceConnection connection;

    private DeviceSettings settings;
    private DeviceInformation information;
    private SpecificDeviceSettingsA spSettingsA;
    ...

    public void connect();
    public void disconnect();
    public DataObject getData();

    public Device() {
        settings = new DeviceSettings(connection);
        ...
    }
}

使用该类将如下所示:

Device dev = new Device();
dev.connect();
dev.getDeviceSettings().changeSettingA(newValue);
dev.getData();
dev.disconnect();

您认为这是解决此类问题的好方法吗?我觉得这个课程做得太多了,但我宁愿让一个班级做得太多而不是这样:

Device dev = new Device()
dev.connect()
DeviceSettingsUtility.changeSettingsA(dev, newValue);
...

我错过了一个明显更好的选择吗?

2 个答案:

答案 0 :(得分:2)

我的两分钱:不要这样做。

不要将单个/静态类monolith放入java代码中,只是为了类似于一些古老的C API。因为:这确实增加了很少的价值。并将立即成为维护的噩梦。

没有严肃的java程序员会喜欢使用您的新产品&#34 ;;如果没有真正的收获,没有严肃的C程序员会看到需要转向新语言。

长话短说:不要浪费你的时间"复制"什么已经存在。相反,要了解要求;并设计一个干净,易于使用,最先进的技术。 API有可能吸引人们(以及其他长期支持你的维护者)。含义:完整的OO,提供合理的抽象等等......

答案 1 :(得分:0)

如果我必须构建这个,我会在下面做这样的事情:

型号:

//With getter and setter and other details

Device : composed of {DeviceSettings, DeviceInformation}
DeviceSettings:
DeviceInformation:

<强>管理器/服务:

ConnectionManager:
                |
                -getCnnection(Device device)
DeviceManager:
             |
             - connect(Device device)
             - disconnect(Device device)
             - changeSettings(Device device)

用法:

DeviceManager.changeSettings(device, setting){
  //get the current setting and update
}