2014-12-08 2 views
1

У меня есть несколько сервисов (в Spring MVC), которые являются дочерними элементами глобальной службы. Поэтому мне нужно знать о лучшей практике (или ваши мнения) с несколькими методами с этим, например:Повторение кода против readablility

//Domain classes 
public class MyParentObject{} 
public class MyObj extends MyParentObject{} 

//Services 
public class MyParentObjectServiceImpl implements MyParentObjectService{ 

    @Override 
    public MyParentObject findObjectByProp(String prop, String objectType){ 
     //myCode (not abstract class) 
    } 

} 

public class MyObjServiceImpl extends MyParentObjectServiceImpl implements MyObjectService{ 

    private myObjType = "MyObj"; 

    @Override 
    public MyObj findMyObjByProp(String prop){ 

    return (MyObj) super.findObjectByProp(prop, this.myObjType); 

    } 
} 

И в этом подходе, я использую вызовы, как это:

MyObj foo = myObjService.findMyObjByProp(prop); 

Поэтому мне нужно знать, является ли этот подход «лучше» или более апериодированным, что вызывает прямо родительский метод со вторым параметром. Например:

MyObj foo = (MyObj)myParentObjectService.findObjectByProp(prop, "MyObj"); 

.. и избегать создания вторых методов, более конкретных. Важно знать, что детские службы будут созданы в любом случае, потому что у нас есть много кода, специфичного для объектов домена.

У меня есть идея, что первый подход лучше, потому что он более читабельен, но мне нужно поддержать это решение с помощью некоторых документов, блога или мнений, чтобы обсудить эти проекты с моими коллегами.

+0

Возможно, у вас несколько детей, которые имеют ту же форму, что и MyObjServiceImpl? Я пытаюсь выяснить, что означает «повторение», упомянутое в вашем названии. Если у вас несколько дочерних элементов, то я вижу, как 'findMyObjByProp' будет повторяться. Но, возможно, есть другой путь вокруг этой проблемы. – ajb

+0

Да! У меня много MyObjServiceImpl: MyObjServiceImpl, MyOtherServiceImpl ... bla bla. Как 10 различных объектов, которые являются дочерью MyParentObject – MarcosTonina

ответ

3

Это похоже на иерархию классов с тегами. Трудно комментировать ценность этого дизайна в целом, не зная деталей. Тем не менее, несколько иной подход, который я бы рекомендовал, состоит в том, чтобы создать базовый класс, чтобы получить немного безопасности типа.

В частности:

public /* abstract */ class MyParentObjectServiceImpl<T extends MyParentObject> 
    implements MyParentObjectService{ 

    MyParentObjectServiceImpl(Class<T> type) { this.type = type; } 

    private final Class<T> type; // subclasses provide this 

    @Override 
    public T findObjectByProp(String prop){ 
    //you can use type for object specific stuff 
    } 
} 

public class MyObjServiceImpl extends MyParentObjectServiceImpl<MyObj> 
    // You might not need this interface anymore 
    // if the only method defined is findMyObjByProp 
    /* implements MyObjectService */ { 
    MyObjServiceImpl() { 
    super(MyObj.class); 
    } 

    @Override 
    public /* final */ MyObj findMyObjByProp(String prop) { 
    return (MyObj) super.findObjectByProp(prop, this.myObjType); 
    } 
} 

Вы, безусловно, получить в безопасности типа (отливка будет появляться только в базовом классе), то избавиться от «метки» (строки, которые идентифицируют различные объекты) и, возможно, уменьшить количество классов/интерфейсов, необходимых для реализации всей иерархии. Я успешно использовал этот подход несколько раз. Обратите внимание, что это лучше всего работает, если базовый класс является абстрактным. Пища для мыслей.

+0

Спасибо за ответ! Это именно то, что я ищу: еда для мыслей, потому что я думаю о лучшем подходе к одному новому проекту. – MarcosTonina

+0

Я читал «Эффективный JAVA» (Джошуа Блох), и он сказал: «Предпочитайте иерархию классов для помеченных классов» So Я не уверен, какой подход может быть лучше. Я полагаю, что все зависит от сходства детских услуг. Я имею в виду: если findMyObj ... очень похожи, тегированные классы должны быть лучше? – MarcosTonina

+0

@MarcosTonina В конечном итоге тегированные классы никогда не окупаются в моем опыте, я согласен с Блохом. Этот подход является достойной альтернативой, если вы можете упаковать множество общих функций в базовом классе. Еще раз, не зная больше об архитектуре, трудно определить, какой лучший подход в этом случае. Удачи! –

Смежные вопросы