【问题标题】:Where to put business logic when using entity with MVP pattern使用具有 MVP 模式的实体时将业务逻辑放在哪里
【发布时间】:2016-09-28 16:02:23
【问题描述】:
我的实体非常愚蠢,只保存数据。我曾经将一些业务逻辑放在实体或演示者中,即
-
Movie.findMostWatchedTopTenMovies
Movie.hasWatchedThisMovie
-
TheatrePresenter.canScreenMoreMovies
(假设这些方法包含一些复杂的逻辑,而不仅仅是getter)
但这似乎违反了 SOLID 原则,并且它不是测试友好的代码。
那么这个逻辑放在哪里最合适呢?类名应该是什么?
【问题讨论】:
标签:
java
android
oop
design-patterns
mvp
【解决方案1】:
你是对的,这违反了 SOLID 原则,你的模型必须是原子的,这意味着它们只保存值,不会自己做任何更改。
通过引用Clean Code book,您必须声明一些使用相关名称进行您想要的更改的类,例如:
class MovieFinder{
public static List<Movie> findMostWatchedTopTenMovies(List<Movie> moviesList){
// do the fining stuff
return mostWatchedTopTenMoviesList;
}
}
最好的办法是创建一个新的项目列表并将其作为结果返回。
另外,为了拥有一个纯原子模型,您可以使用google AutoValue 库,它可以阻止您对模型做不寻常的事情。 ;)
【解决方案2】:
您应该在与实体相关的 BL 项目和类中进行数据操作/逻辑。
我假设您正在使用某种数据源,例如数据库,因此您需要对数据访问进行相同的隔离。
通常,您希望您的 BL 仅包含逻辑(例如数据验证),并且您的数据访问发生在没有逻辑的 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);
}
}
}