我目前正在编写用于与设备通信的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);
...
我错过了一个明显更好的选择吗?
答案 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
}