【问题标题】:Java OOP in MVC LegacyMVC Legacy 中的 Java OOP
【发布时间】:2015-09-24 22:37:41
【问题描述】:

总的来说,我的问题是关于最佳实践和效率。今天,我和老师讨论了 MVC Legacy 中的 OOP。我们正在经历我以前的一个项目,问题是“有什么意义?” 我的项目(以及我所有的项目)的结构方式对我来说没有意义。这是一个示例,后面是我的代码。

Controller- 从表单/视图中获取字符串值并将它们传递给服务类。 Single Responsibility 会声明这就是它的全部责任,不是创建要传递的对象,而是创建一个 > 根据我的理解完全没问题。

服务类- 遵循最佳实践/单一职责,这些方法除了调用请求的方法/传递值之外不应该做任何事情。

DAO- DAO 应该负责将所有数据/对象转换为 D.B 访问器可用的形式并将它们原样返回。

但是为什么要构建一个对象只是为了拆掉它呢?尤其是当您可以将值列表作为 Map 向下传递时,所有值和列都匹配?

以下是帮助说明我的问题的代码sn-ps:

服务类:

 public class ClientService {

      private Client_SQL_DAO_Strategy dao;

      public ClientService(Client_SQL_DAO_Strategy dao){
           setDaoStrategy(dao);
      }

      public void sendClientToStorage(Client client) throws SQLException, ClassNotFoundException{
        dao.sendClientToDatabase(client);
      }

      public void updateClient(List values) throws SQLException, ClassNotFoundException {
       dao.updateClient(values);
      }
 }

DAO

 public void saveClient(Client client) throws ClassNotFoundException, SQLException {

    List columns = new ArrayList<>();
    columns.add("Last_Name");
    columns.add("First_Name");
    columns.add("Business_Name");
    columns.add("Phone");

    List<Object> values = new ArrayList<>();
    values.add(client.getClientLastName());
    values.add(client.getClientFirstName());
    values.add(client.getClientBusiness());
    values.add(client.getClientPhone());

    accessor.createRecord(TABLE_NAME, columns, values);
}

public void updateClient(List listOfValues) throws ClassNotFoundException, SQLException{

    List<Object> columns = new ArrayList<>();
    columns.add("Last_Name");
    columns.add("First_Name");
    columns.add("Business_Name");
    columns.add("Phone");

    int primaryKey = Integer.valueOf(listOfValues.get(0).toString());

        accessor.updateRecord(TABLE_NAME, columns, listOfValues, PK_COLUMN, primaryKey);

}

比较 DAO 中提供的两种方法,哪种方法更有意义?创建客户端以将其拆除或将关联的值和列传递给访问器?这个 Map 似乎对这两种方法都很理想。

是的,我也知道更新的技术,但在本学期的当前时间,传统是本周的课程。

【问题讨论】:

  • 您能澄清一下您所说的“遗产”是什么意思吗?您是指不使用 ORM 的遗留问题吗?
  • @jrahhali 我可能使用了错误的术语并且对 ORM 的理解非常松散。我对对象关系映射的理解是一种 OOP 技术,用于在使用相似但也不同数据类型的两个系统之间转换数据,例如 java 存储日期的方式与数据库存储日期的方式。由于这是一种较老的技术,我猜“遗留”,在我使用它的意义上,意味着“老派编程技术”。
  • 问题不在于它是在比较我提供的 DAO 中的两种方法。问题是,为什么在 DAO 中构建一个对象只是为了将其拆除?
  • 对您的问题的简短回答是,您正在学习如何构建一个包含数百个数据库表和数千个网页的大型 OOP 系统。

标签: java oop legacy


【解决方案1】:

Spring MVC 实现了Model-View-Controller 设计模式。

Controller 的职责是获取/创建/填充 Model 并为 View 准备环境。

View 负责显示 Model 数据,在 Spring MVC 中通常通过 JSP,但您也可以指定 View 类来执行诸如渲染 Excel 或 PDF 之类的操作。

模型实现领域逻辑。根据您的实现,这可能是仅包含前端逻辑的“视图模型”,也可能包含真正的业务规则。它应该是一个真正的类。永远不要使用Map&lt;String, Object&gt;。使用 map 会牺牲类型安全,而不是 OOP。

Service 类就像一个控制器类,用于协调外部服务,如持久化、电子邮件、支付等。

DAO 类是一个仅用于持久性的服务提供者。它将对象表示转换为数据库操作。该层可以用 ORM 代替。不要乱转Map&lt;String, Object&gt;

如果您的应用使用的唯一外部服务是持久性,您可以避免单独的 Service 和 DAO 类,并推迟分离直到您需要更多服务。

有关此类对象建模的更多信息,请查看Domain Driven Design

【讨论】:

    猜你喜欢
    • 2013-05-03
    • 2018-11-06
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2013-07-26
    • 2023-04-01
    • 2016-04-14
    • 2012-02-24
    相关资源
    最近更新 更多