как отделить данные от бизнес-логики - PullRequest
8 голосов
/ 26 октября 2010

Вот сценарий,

Допустим, у меня есть пользовательский класс, подобный этому:

public class User{
  private String firstName;
  private String lastName;
//...
// setter, getters
}

Тогда у меня есть класс, подобный такому для обработки пользователя. Комментарии:

public class Comments{
  // some fields
  public static loadComments(User user, int count){...}
}

Пока что очень простые вещи.Тем не менее, я хочу добавить несколько помощников, чтобы упростить загрузку комментариев для пользователя.Так что я мог бы создать что-то в классе User:

final static int defaultCount = 10;
...
public Comment comments(){
  return Comments.loadComments(this, defaultCount);
}

Я думаю, что это простой способ не обойти пользовательские экземпляры.Но в этот момент я несчастлив, потому что я связал свой объект пользовательского компонента с бизнес-логикой, которая загружает комментарий.Я также сохранил счетчик по умолчанию в пользовательском классе, который не должен там принадлежать.Так каков наилучший способ сделать это?Моя цель - передать этот объект в jsp, чтобы можно было вызывать функции JSTL.У меня была идея создать UserWrapper, который бы выглядел следующим образом ...

public class UserWrapper{
  private final static defaultCount = 10;
  private final User user;
  public UserWrapper(User user){
    this.user = user;
  }

  // should probably cache this but i am not going to show this for simplicity
  public Comments getComments(){return Comments.loadComments(user, 10);}
}

Надеюсь, я все понял.Мне не нравится использовать тег useBean, потому что он не нужен для чего-то подобного.Я надеюсь, что есть более чистый способ приблизиться к чему-то подобному!Буду признателен за любую помощь!

Редактировать : Я забыл упомянуть одну вещь.Я хочу иметь возможность использовать этот код в JSTL.Что означает, что это должен быть добытчик.Модель DAO хорошо известна, но она не очень помогает, когда моему внешнему разработчику нужно написать сценарий или мне нужно загрузить его для мест, которые ему могут понадобиться или не понадобиться.

Ответы [ 2 ]

3 голосов
/ 26 октября 2010

С технологически независимой точки зрения ...

Да, вы абсолютно правы в том, что эта связь является запретительной. Обратитесь к архитектурному шаблону Layers , чтобы предложить некоторые рекомендации по структуре бизнес-логики и данных. Например, может быть хорошей идеей спроектировать две подсистемы: одну для вашей логики, другую для слоев. Ограничьте связь между ними только , позволяя логике передавать сообщения на уровень данных. Кроме того, вы можете использовать шаблон фасада для представления каждой подсистемы и, таким образом, еще больше уменьшить сцепление. Рассматривайте каждый слой как черный ящик.

Другой полезный шаблон - это Шаблон доступа к данным . Это поможет вам в определении договора между слоями для передачи данных, когда это необходимо.

2 голосов
/ 26 октября 2010

Мне нравится использовать объекты доступа к данным (DAO) для этого.Ваши классы User и Comment будут содержать только поля для этих объектов, а затем вы создадите отдельные классы для извлечения данных об этих объектах.В DAO вы включаете логику о том, как извлекать, обновлять, выбирать и т. Д. Например,

public class UserDAO {

     public UserDAO() {
        //maybe setup a Hibernate connection or JDBC connection here
     }

     public User getUser(int userId) {
        User user;
        //code to retrieve user from datasource
        return user;
     }

     //other methods for update, delete, select, etc
  }

  public class CommentsDAO {
     private static int DEFAULT_COUNT = 10;

     public CommentsDAO() {
        //maybe setup a Hibernate connection or JDBC connection here
     }

     public Collection getCommmentsForUserWithCount(User user, int count) {
        Collection comments = new Set();
        //retrieve comments from datasource limit to count

        return comments;
     }

     public Collection getCommentsForUser(User user) {
        return getCommentsForUserWithCount(user, DEFAULT_COUNT);
     }

     //other methods for update, delete, etc
  }
...