2016-09-28 52 views
2

我有非常笨的實體,只能保存數據。我習慣把實體或演示裏面的一些業務邏輯,即在MVP模式下使用實體時的商業邏輯

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

(假設這些方法包含一些複雜的邏輯,它不只是吸氣劑)

但這似乎違背了SOLID原則,它不是測試友好的代碼。 那麼最適合放置這種邏輯的地方在哪裏?班級名稱應該是什麼?

回答

0

你是對的,它違背了SOLID原則,你的模型必須是原子的,這意味着它們只保存值並且不會自己做任何修改。

通過參考Clean Code book,您必須聲明一些類,做你想做相關名稱的變化,例如:

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

    // do the fining stuff 

    return mostWatchedTopTenMoviesList; 
    } 
} 

,甚至最好的東西做的是箱子項目的新的列表,並作爲結果返回它。

另外,如果你有一個純原子模型,你可以使用google AutoValue這個庫來阻止你用模型做不尋常的事情。 ;)

0

您應該在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); 
     } 
    } 
}