我無法在例如以下兩種模式之間做出決定。保存一個dataObject(在我的情況下是bean)。這兩個選項是:哪種設計模式更適合保存/刪除數據?爲什麼?
abstract class DataService {
protected void save(Object data){
//persist the data
}
}
//the service for Project objects
class ProjectService extends DataService {
public void saveProject(Project prj, Object... args /*other save options*/){
// some preprocessing, checking, validation
save(prj); //call the method in DataService
// do postprocessing
}
}
//calling save
projectService.saveProjec(project, /*some args*/);
第二
abstract class DataService {
public void save(Object data){
if(beforeSave(data)){
// persist the data
afterSave(data);
}
}
protected boolean beforeSave(){
return true;
}
protected void afterSave(){
}
}
//the service for Project objects
class ProjectService extends DataService {
public initSave(Object... args /*other save options*/){
// store these options in class properties
}
@Override
protected bool beforeSave(Project objectAboutToBeSaved){
// some preprocessing, checking, validation
// use class properties set by initSave if needed
return true;//if we want to continue with the saving procedure
}
@Override
protected bool afterSave(Project savedObject){
// do postprocessing
// use class properties set by initSave if needed
}
}
//calling save
projectService.initSave(/*some args*/);
projectService.save(project);
在我們使用的是第一圖案的時刻,但我開始思考移動到第二個,因爲:
(PROS)
- 更好的邏輯分隔
- 統一的方法命名跨多個對象類型(將允許創建通用的單元測試:例如,初始化每個對象和它的服務,並調用保存)
(缺點)
- 有點難以成立(initSave) - 甚至可能包括一個拆卸方法
的想法來自CakePHP MVC框架,其中模型和控制器都包含這樣的回調方法,使用它我可以真正實現一些清晰的業務邏輯。
現在我正在開發Java - Spring + Spring Data Graph - (因此javaish代碼),但這個問題可以是一個非常通用的在我看來。
注意:該示例僅用於保存,但刪除過程也是如此。
在我的代碼中,我使用存儲庫來保存/刪除數據。第一個例子在'saveProject(...)'上有'@ Transactional'註釋,而'save(...)'和'ProjectService'上的第二個必須在''after-'和'beforeDelete'方法。 在這種情況下,你是否仍然有上述分歧? – Matyas
是的,我喜歡。在我看來,你的存儲庫不應該知道交易。服務知道工作單位。 – duffymo
同意,但文章中描述的類在服務層,並且它們使用存儲庫(在保存/刪除之內) - 因此名稱ProjectService(處理與項目數據對象相關的操作) – Matyas