1

我有一門課需要通過幾種不同的方式進行排序,其中許多課程打破equals()合同,所以我需要一組不同的Comparator類。我擁有的問題是這些課程應該在哪裏生活?比較器在域驅動的MVC世界中的位置在哪裏?

所以,有一些具體的作爲例子的命名空間結構,使用和限制封裝結構,而不是文件結構的問題,讓我們假設下面的命名空間:

app 
    domain 
    exception 
    hibernatemapping 
    mvc 
    propertyeditor 
    tags 
    persistence 
    hibernate 

域類生活在domain命名空間以及分別在exceptionhibernatemapping中的相關異常和休眠映射文件。 persistence擁有DAO接口,在hibernate中使用基於休眠的實現。所有的MVC控制器都生活在mvc中,其中有propertyeditor的專用屬性編輯器(這是Spring MVC)以及返回tags中的自定義標籤的類。

我的直覺說Comparators應該在domain命名空間下生存,也許在domain.comparator,但我不確定。

你會把它們放在哪裏,爲什麼?


更新:許多人建議使用一般的Util包。當走這條路線,你會分開UI助手與域助手的Util類嗎?例如,如果域需要根據業務邏輯原因對事物進行排序,但UI需要域不關心的其他排序?基本上,你會傾向於每層都有一個幫手包嗎?

回答

3

正如所建議的,像util或commons軟件包似乎是最有意義的,儘管如果你不知道把東西放在什麼位置,你最終不會把它用作「goto」軟件包。

我也建議看看package by feature。在這個原因中,你的分區只會隨其使用的任何相應的功能而去。再次,這只是一個建議 - 您必須呼籲您的項目的最佳佈局。

+0

+1按包裝進行分類。對於某些項目來說,這更有意義的是香草域/道路/服務/控制器公式。 – Kevin

+0

那麼,在一個包通過特徵的世界裏,'Comparator'將在同一個包去的東西是比較?例如。 'foo'比較器會放在'app.foo'包中? – cdeszaq

+0

在包通過特徵的世界裏,你將有app.myfeature,將有模型,DAO,服務以及其他類構成該功能。據推測,控制器仍然存在於其他一些軟件包中,只能與服務層通話。 – Kevin

0

我通常用以下結構去:

company 
    appname 
    model 
    util 
    dao 
    service 
    controller 

在這種類型的結構比較可能會得到倒入util包(如果真有很多比較的)。

但是,通常我發現比較器只用在一個地方,所以我在他們實際使用的地方聲明它們是內聯的,例如,

public class SomeService { 
    public void someMethod(String id) { 
     List<ListType> list = dao.getSomeListById(id); 
     Collections.sort(list, new Comparator<ListType>() { 
      public compare(ListType a, ListType b) { 
      // ... 
      } 
     }); 
    } 
} 
0

我做了一個名爲comparators的包,這是我存放的地方。