Java 使用具有MVP模式的实体时,将业务逻辑放在何处

Java 使用具有MVP模式的实体时,将业务逻辑放在何处,java,android,oop,design-patterns,mvp,Java,Android,Oop,Design Patterns,Mvp,我有一些非常愚蠢的实体,它们只保存数据。我过去常常在实体或演示器中放置一些业务逻辑,即 Movie.findMostWatchedTopenMovies 电影。已观看此电影 TheaterPresenter.canScreenMoreMovies (假设这些方法包含一些复杂的逻辑,而不仅仅是getter) 但这似乎违背了坚实的原则,而且它不是测试友好的代码。 那么,把这种逻辑放在哪里最合适呢?类名应该是什么 您是对的,这违反了实体原则,您的模型必须是原子的,这意味着它们只保存值,本身不做任何

我有一些非常愚蠢的实体,它们只保存数据。我过去常常在实体或演示器中放置一些业务逻辑,即

  • Movie.findMostWatchedTopenMovies
  • 电影。已观看此电影
  • TheaterPresenter.canScreenMoreMovies
(假设这些方法包含一些复杂的逻辑,而不仅仅是getter)

但这似乎违背了坚实的原则,而且它不是测试友好的代码。
那么,把这种逻辑放在哪里最合适呢?类名应该是什么

您是对的,这违反了实体原则,您的模型必须是原子的,这意味着它们只保存值,本身不做任何更改

通过引用,您必须使用相关名称声明一些进行所需更改的类,例如:

class MovieFinder{
    public static List<Movie> findMostWatchedTopTenMovies(List<Movie> moviesList){

    // do the fining stuff

    return mostWatchedTopTenMoviesList;
    }
}
classmoviefinder{
公共静态列表FindMostWatchedTopenMovies(列表电影列表){
//做罚款的事
返回MOSTwatchedoptenMoviesList;
}
}
甚至最好的办法就是把一份新的物品清单装进板条箱,并将其退回


此外,对于纯原子模型,您可以使用库来阻止您使用模型做不寻常的事情

您应该在与实体相关的BL项目和类中执行数据操作/逻辑

我假设您使用的是某种数据源,比如DB,因此您需要对数据访问进行相同的隔离。 通常,您希望BL只包含逻辑(例如,数据验证),并且您的数据访问发生在没有逻辑的DAL(数据访问层)内

例如,如果您有一个
电影
实体:

namespace BO
{
    public class Movie
    {
        public string Name{ get; set; }
        ...
    }
}

namespace BL
{
    public class MovieBL
    {
        public Movie GetMovieByName(string name)
        {
            return MovieDAL.GetMovieByName(name);
        }
    }
}