Я не могу выбрать между следующими двумя образцами, например.сохранение dataObject (бин в моем случае).Два варианта:
1-й
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*/);
2-й
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)
- лучшее логическое разделение
- унифицированный метод именования нескольких объектовтипы (позволят создать общие модульные тесты: например, инициализировать каждый объект и его службу и сохранить вызов)
(CONS)
- сложнее в настройке (initSave) - возможно, даже придется включить метод разрыва
Идея пришла ко мне из инфраструктуры CakePHP MVC, где и модель, и контроллер включили такие методы обратного вызова, используя которыеможет действительно реализовать некоторую ясную бизнес-логику.
Сейчас я занимаюсь разработкой на Java - Spring + Spring Data Graph - (таким образом, Java-код), но, на мой взгляд, этот вопрос может быть довольно общим.
Примечание: пример был приведен для сохранения, но то же самое будет и для процесса удаления.