我繼承了使用JPA來訪問數據庫的用Java編寫的應用程序。該應用程序使用了我之前沒有遇到過的設計模式,並且我真的會對使用此模式的原因進行一些指導。像許多應用程序一樣,我們有一個前端,中間件和後端數據庫。數據庫通過DAO訪問。 DAO上的每個方法加載一個實體DTO,它只是一個POJO,只有getter和setter,然後該實體DTO被傳入一個實體,它具有改變實體狀態的其他方法。一個例子[類名稱變更爲保護inocent]每個實體的DTO對象
enum Gender
{
Male,
Female
}
class PersonDTO
{
private String mFirstName;
private String mLastName;
private Gender mGender;
...
String getFirstName() { return this.mFirstName; }
String setFirstName(String name) { this.mFirstName = name; }
// etc
}
class Person
{
PersonDTO mDTO;
Person(PersonDTO dto)
{
mDTO = dto;
}
String getFirstName() { return mDTO.getFirstName() }
String setFirstName(String name) { mDTO.setFirstName(name); }
// and so on
void marry(Person aNotherPerson)
{
if(this.getGender()==Gender.Female &&
aNotherPerson.getGender()==Gender.Male)
{
this.setLastName(aNotherPerson.getLastName());
}
aNotherPerson.marry(this);
}
}
這是在全國30個左右的實體類重複,倍增至60與DTO的,我只是不能讓我的身邊,爲什麼頭。我理解有關分離收斂的(比特),我也理解(比特)基於EAO的設計與基於活動記錄的設計之間的區別。
但它真的要走這麼遠嗎?是否至少應該有一個「DB」對象,它只包含映射到數據庫字段的getter和setter?
由於Web服務調用都是由定時器運行的一個類處理的,因此DTO被創建。它會關閉,調用Web服務,填充DTO,持久化它們,然後創建存儲在內存中的「實體」。然後前端訪問實體並通過控制器對它們進行變異。至於「pojo爲什麼要知道只有異性的人才能結婚?」 (21世紀不好的例子!) - 不是OOP的一個核心部分嗎?所以你可以說有一個CelebrityPerson覆蓋了marry(),並且不需要他們的配偶名稱嗎?Vs是你的服務層類型的一個開關,方式? –
@詹姆斯霍布森 - 問題是爲什麼人處理結婚?還有離婚方法嗎?如何通過電子郵件讓人們知道離婚已經最終確定(現在您的Person類知道電子郵件了)?添加新功能時,方法列表可以變得無限長。這就是爲什麼應該有MarriageService來處理結婚和離婚操作,所以POJO不必知道它被使用的每個場景。分離關注將是這裏的指導性OOP負責人。至於處理不同的婚姻類型,請查看策略模式。 – SergeyB
@JamesHobson - 我想它歸結爲Person類,在一個典型的N層應用程序中可疑地看起來很像服務。考慮寫一個單元測試。如果Person是一個沒有getFirstName()/ getLastName()的服務,那麼你只需測試marry(Person person1,Person person2)。但是在這個設置中,你必須測試你的setter和getters。 – SergeyB