ОО-дизайн с литьем / выдачей конструкции - PullRequest
1 голос
/ 19 ноября 2011

У меня есть класс, который выполняет операции с базой данных, но я хочу сохранить его как можно более общим и абстрактным, таким образом, с помощью типов возвращаемых объектов.

Вот пример метода этого класса:

public static List<Object> getAll(String table) throws HibernateException{
        Session sessie = HibernateUtil.getSessionFactory().openSession();
        Transaction trans = sessie.beginTransaction();

        List<Object> objects = sessie.createSQLQuery("SELECT * FROM " + table + ";").list();
        trans.commit();
        sessie.close();
        return objects;
 }

Теперь у меня есть другой класс User, который должен иметь метод getAll с типом возврата List<User>, и реализация метода такая же.

Это вообще возможно? Я знаю, что невозможно перегрузить методы с разными типами возвращаемых данных. Это выполнимо с каким-то шаблоном проектирования, настройкой интерфейса?

Так что в принципе я не хочу делать реализацию снова, она уже указана в методе getAll, который возвращает объект. Я просто хочу выполнить этот метод, но с динамическими типами возврата.

Причина, по которой я спрашиваю это, состоит в том, что я не хочу делать что-то еще в моем коде:

User user = new User(...);
// this should be user.getAll() and the type of that method should be an User, not an object
(User)user.getAll() 

Причина, по которой я делаю это таким образом, состоит в том, что в будущем у меня могут быть другие таблицы, которые смогут вызывать метод getAll, но получить приведенный объект в качестве возвращаемого типа, а не объекта типа.

Я смотрю на самое чистое и лучшее ОО-решение, даже если это означает, что мне нужно реструктурировать мой код.

Ответы [ 3 ]

1 голос
/ 19 ноября 2011

Если вам это действительно нужно, вы можете сделать свой класс универсальным с возвращаемым типом в качестве параметра универсального типа, чтобы вы могли иметь:

public static List<T> getAll(String table)

и затем

user = new YourGenericClass<User>();
List<User> list = user.getAll("user");

Это ужасно, если вы передаете имя таблицы в качестве параметра. Возможно, вам следует переосмыслить дизайн слоя доступа к данным.

редактирование:

Хорошо, чтобы было понятнее:

//Template generic class
public class GenericDAOAndModelClass<T> {
    public static List<T> getAll(String table) { your code};
    public static T getOne(String table) { your other code };

}

public class User extends GenericDAOAndModelClass<User> {
    user methods and fields

}

и тогда вы можете назвать это как

List<User> userList = User.getAll("user");

User u = User.getOne("user");

Вы можете поместить статическое поле в каждый класс, расширяющий GenericDAOAndModelClass для представления имени таблицы, чтобы вам не приходилось передавать параметр в getAll и getOne.

1 голос
/ 19 ноября 2011

Коллекция объектов, реализующих различные интерфейсы, IMO, противоречит разумному замыслу.Полностью обобщенная реализация заставит вас повторно реализовать функциональность псевдо-ООП, используя instanceof и т. Д.

В качестве базовых DAO можно использовать шаблон для сокращения шаблонов.

Например, Hibernate DAOsочень часто генерируются .Типы, которые они возвращают , относятся к типо-специфическим функциям.

0 голосов
/ 19 ноября 2011

На вашем месте я бы создал DAO для каждой сущности в моем приложении. Я думаю, что это более чистый и лучший дизайн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...