【问题标题】:Thermostat to DB, OOP Design恒温器转 DB,OOP 设计
【发布时间】:2013-06-09 19:21:23
【问题描述】:

我正在尝试我的第一个 Java 项目(刚开始学习它/OOP)。我已经构建了一个恒温器电路,我可以使用驱动程序获取温度,现在正在设计一个与恒温器接口并将数据插入 mysql DB 的 Java 程序。

我正在尝试正确地做到这一点,因此想出了我的类/对象以及它们如何交互的基本 UML 图。

我打算使用一个数据库接口类来扩展一个数据库连接类。该数据库接口将插入数据库,数据库连接构造函数将创建数据库连接。

我还将有一个与恒温器本身接口的恒温器类,它将有 2 个私有变量,温度和湿度。它将具有方法 update temp,该方法将更新私有变量。 get temp 方法将为这些私有变量提供接口。

最终控制类由恒温器和数据库接口类组成,调用这两个类的方法将温湿度数据存入数据库。

UML 图:

你有什么想法吗?我不知道这个设计有多好。控制器是否以正确的方式与其他类交互?

感谢您的宝贵时间。

X。

【问题讨论】:

    标签: java oop uml


    【解决方案1】:

    首先,对于刚刚“开始学习它/OOP”的人来说,它看起来不错!

    像我一样跳出来的一件事:它有效,但似乎习惯性错误(我们通常不这样做)是让你的 DAO(数据访问对象,“数据库接口”)扩展 创建连接的类。而是应该使用这个类——或者更好的是,这个类的结果,一个连接。

    为什么?随着您编写更多 DAO 类(在本项目或其他项目中),您可能会发现这是两个不同的问题:

    (1) 处理温度/湿度表和相关 SQL 以及温度特定逻辑和异常的代码。

    (2) 负责连接数据库和创建连接对象的代码。

    如果你有一个 databaseInterface.setConnection(Connection c) 方法,你会发现你的 databaseInterface 类更可重用。您可以设置来自各种来源的连接、创建具有不同连接的多个实例、在测试用例中注入 mock 连接等。

    这些是我多年来学到的想法,通常适用于具有数十到数百个数据访问类的项目。它在一个小项目中并不是非常重要,但仍然是一个可能的改进。

    编辑:可能的控制器构造函数:

    // My hardware interface
    private Thermostat thermostat;
    
    // My temperature DB tables interface
    private TemperatureDAO temperatureDAO;
    
    public Controller() {
        thermostat = new Thermostat();
        temperatureDAO = new TemperatureDAO();     
        // As the controller, I get to decide what connection the application uses.
        temperatureDAO.setConnection(new ConnectionProvider().getConnection());
    }
    

    在这段代码中,控制器决定使用哪个数据库连接,而不是每个单独的 DAO。

    【讨论】:

    • 是的,在这种情况下,组合优于继承。
    • 控制器的存在我觉得是个不错的设计。在大型应用程序中,如今人们通常将事物连接起来(将所有东西捆绑在一起)的方式是使用 Spring(或其他一些依赖注入框架)。但是,您可能不想在这个简单的项目中使用它。也许从简单的开始,在控制器构造函数中......让我编辑上面的答案,使其格式化......
    • 嗯,java中有一个接口:java.sql.Connection。这是 JDBC 驱动程序为所有数据库(MySQL、Oracle 等)返回的 THE 接口。所以只要你的二传手接受了,你应该没问题。
    • 这可能超出了您的项目范围,但是....在上面的示例中,我将连接注入 DAO。我猜更常见的方法是注入 javax.sql.DataSource 的实现,它有一个 getConnection() 方法。这样做的原因是人们通常不编写自己的连接提供程序(或数据源),而是使用他们的框架/应用程序服务器提供的连接提供程序,它委托给一个连接池......但也许这太多了现在的信息:-)
    • 嗯,我确实想知道为什么“恒温器”必须将它们作为本地字段,而不是直接在硬件上读取/设置值——有可能的原因.. .. 例如,如果您需要在 Thermostat 类中进行缓存。大概它们需要在控制器中,因为您可以从那里显示它们,或打印它们,或者以其他方式定期访问它们。但是,是的,如果可以,请消除重复项。
    猜你喜欢
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    相关资源
    最近更新 更多