使用具有MVP模式的实体时在哪里放置业务逻辑

时间:2016-09-28 16:02:23

标签: java android oop design-patterns mvp

我的实体非常愚蠢,只保存数据。我曾经在实体或演示者中加入一些业务逻辑,即

  • Movie.findMostWatchedTopTenMovies
  • Movie.hasWatchedThisMovie
  • TheatrePresenter.canScreenMoreMovies

(假设这些方法包含一些复杂的逻辑,它不仅仅是吸气剂)

但这似乎违反了SOLID原则,并且它不是测试友好代码。 那么这个逻辑最合适的地方在哪里?班级名称应该是什么?

2 个答案:

答案 0 :(得分:0)

你是对的,这是违反SOLID原则的,你的模型必须是原子的,这意味着它们只保留值,不自行做任何修改。

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

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

    // do the fining stuff

    return mostWatchedTopTenMoviesList;
    }
}

甚至最好的做法是创建一个新的项目列表并将其作为结果返回。

此外,对于拥有纯粹的原子模型,您可以使用google AutoValue库来阻止您使用模型进行不寻常的事情。 ;)

答案 1 :(得分:0)

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

我认为您正在使用某种类型的数据源,例如数据库,因此您需要与数据访问相同的隔离。 通常,您希望BL仅包含逻辑(例如,数据验证),并且您的数据访问发生在DAL(数据访问层)内,而DAL(数据访问层)没有逻辑。

例如,如果您有Movie实体:

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

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