我有非常笨的實體,只能保存數據。我習慣把實體或演示裏面的一些業務邏輯,即在MVP模式下使用實體時的商業邏輯
Movie.findMostWatchedTopTenMovies
Movie.hasWatchedThisMovie
TheatrePresenter.canScreenMoreMovies
(假設這些方法包含一些複雜的邏輯,它不只是吸氣劑)
但這似乎違背了SOLID原則,它不是測試友好的代碼。 那麼最適合放置這種邏輯的地方在哪裏?班級名稱應該是什麼?
我有非常笨的實體,只能保存數據。我習慣把實體或演示裏面的一些業務邏輯,即在MVP模式下使用實體時的商業邏輯
Movie.findMostWatchedTopTenMovies
Movie.hasWatchedThisMovie
TheatrePresenter.canScreenMoreMovies
(假設這些方法包含一些複雜的邏輯,它不只是吸氣劑)
但這似乎違背了SOLID原則,它不是測試友好的代碼。 那麼最適合放置這種邏輯的地方在哪裏?班級名稱應該是什麼?
你是對的,它違背了SOLID原則,你的模型必須是原子的,這意味着它們只保存值並且不會自己做任何修改。
通過參考Clean Code book,您必須聲明一些類,做你想做相關名稱的變化,例如:
class MovieFinder{
public static List<Movie> findMostWatchedTopTenMovies(List<Movie> moviesList){
// do the fining stuff
return mostWatchedTopTenMoviesList;
}
}
,甚至最好的東西做的是箱子項目的新的列表,並作爲結果返回它。
另外,如果你有一個純原子模型,你可以使用google AutoValue這個庫來阻止你用模型做不尋常的事情。 ;)
您應該在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);
}
}
}