阶级功能困境

时间:2014-03-17 08:19:43

标签: function class architecture model

我目前正在处理一个项目并偶然发现一个非常常见的问题

"我应该在哪里放置此功能?"

基本上我有代表

等模型的类
Store, Area, User, Item, Menu, Product and more...

我只考虑一些基本功能,如CRUD和其他搜索功能。

我在互联网上的教程和示例中看到的大部分内容都是

User.create(), User.delete(), User.update() and User.getUserById(int Id) User.getAllUsers() so on..

我的问题是它对我没有意义。

为什么用户模型能够搜索所有用户?甚至创建一个新用户?

更新和删除可能更有意义,但getUserById和getAllUsers也没有意义

我在想的不是商店模型有责任在该商店中添加用户,或者在该商店中创建菜单,商品和区域,然后&#&#&# 39;菜单模型有责任将产品添加到其菜单等等吗?

然后在搜索用户时,对于Store.getAllUsers()或Store.getUserById()或类似Menu.getAllCategories()和Category.getAllProducts()

更有意义。

我知道我的想法会需要更多的代码和功能,但我不确定我所思考的是一个合理的架构,但我觉得它是。

我需要一些指导,或者可能是为了让自己直接思考。

1 个答案:

答案 0 :(得分:1)

在决定如何在网络应用程序中实现持久性之前,您可能需要掌握一些概念。在我看来,有许多不同的设计模式,没有一个通用的解决方案。正确的答案应该与语言无关,但允许我举例说明您可能希望使用基本Java实现遵循的可能设计之一:

基本上,您创建了一个DAO,可以在您的应用程序中实现持久性(CRUD/SCRUD)。

此DAO将应用程序调用映射到持久层。我在Hibernate上使用tutorialORM)作为JPQL/HQL

package org.mywebapp.pojos;

import org.hibernate.Query;
import org.hibernate.Session;

import java.io.Serializable;
import java.util.List;

public class myWebAppDAO {
    private static myWebAppDAO _this = new myWebAppDAO();

    public static myWebAppDAO getInstance() {
        return _this;
    }

    public void persist(Object object) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        session.persist(object);
        session.getTransaction().commit();
        session.disconnect();
    }

    public void update(Object object) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        session.update(object);
        session.getTransaction().commit();
        session.disconnect();
    }

    public void delete(Object object) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        session.delete(object);
        session.getTransaction().commit();
        session.disconnect();
    }

    public Object getById(Class clazz, Serializable id) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        Object o = session.load(clazz, id);
        session.getTransaction().commit();
        session.disconnect();
        return o;
    }

    public List getTopicsByRef(int ref) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Query q = session.createQuery("from Topic AS t WHERE t.ref = :ref");
        q.setParameter("ref", ref);
        List topic = q.list();
        session.getTransaction().commit();
        return topic;
    }

    public long getTopicCount(int ref) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Query q = session.createQuery("SELECT COUNT(t) FROM Topic AS t WHERE t.ref = :ref");
        q.setParameter("ref", ref);
        Long l = (Long) q.uniqueResult();
        session.getTransaction().commit();
        return l;
    }

    public User getUser(String email, String password) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Query q = session.createQuery("from User AS e WHERE e.email = :email AND e.password = :password");
        q.setParameter("email", email);
        q.setParameter("password", password);
        User user = (User) q.uniqueResult();
        session.getTransaction().commit();
        return user;
    }

//...

}

了解ORM如何处理数据库查询/查询结果的详细信息< - >对象转换,这个想法是通过在查询中使用Topic pojo来使您的应用数据库不可知。 MySQL的?甲骨文? PostgreSQL的? SQLite的?谁在乎?设置您想要/需要的数据源并且代码保持不变(通常,您只需将JDBC与适当的驱动程序一起使用)。

这是一个用于实例化User对象的非常简单的实现的示例(例如DAO上的getUser返回的实现);只是一个没有约束检查或任何东西的getter和setter的集合(另请查看Topic mapping的这个例子):

package org.mywebapp.pojos;

import java.io.Serializable;

public class User
        implements Serializable {
    private static final long serialVersionUID = 1L;
    private String id;
    private String email;
    private String password;
    private String firstName;
    private String lastName;

    public String getId() {
        return this.id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return this.password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

这里是User.hbm.xml Hibernate映射,在这个简单的例子中,你只需要指定用户类中哪个属性匹配哪个表和列(同时检查Spring framework的这个例子):

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="org.mywebapp.pojos.User" table="user">
        <id name="id" column="id">
            <generator class="uuid" />
        </id>
        <property name="email" column="email"/>
        <property name="firstName" column="firstName"/>
        <property name="lastName" column="lastName"/>
        <property name="password" column="password"/>
    </class>
</hibernate-mapping>

所以现在你可以通过id选择用户,获取用户列表......无论你想做什么,你只需要在这些类和DAO上实现它,然后将它们导入到应用程序需要的任何地方并且你已经设置好了。

最重要的是:如果您想避免这些任务,有许多IDE和框架可以自动为您处理此过程。例如了解使用此Java web-app framework comparison上的Java django framework向/您的模型添加/修改参数是多么容易;或者如何在python Creating models中处理模型和应用程序之间的所有交互非常好,正如您在教程中看到的那样:Making queries和{{3}}