Как реорганизовать этот код - PullRequest
1 голос
/ 03 августа 2010

В настоящее время я выполняю рефакторинг старого кода. Я ищу направления на лучший шаблон дизайна для использования здесь. Я думаю о заводском образце, но я не уверен, что это лучший путь или нет.

Итак, вот краткое описание псевдокода. Класс Foo содержит основную бизнес-логику.

Class Foo{
    private List<Things> stuff;
    private static Integer count; 
    //getter setter for stuff

    public Foo(List<Things> stuff){
        this.stuff = stuff; 
        this.count=1;
    }

    //the following 3 methods are 90% similar

    public List<Newthings> doSomeThingFirst(){
        //uses the list stuff and also increments the static member count for each entry in List<NewThings> based on certain conditions
    }

    public List<Newthings> doSomethingSecond(){
        //uses the list stuff and also increments the static member count for each entry in List<NewThings> based on certain conditions
    }

    public List<Newthings> doSomethingThird(){
        //uses the list stuff and also increments the static member count for each entry in List<NewThings> based on certain conditions
    }

    //in the future there may be doSomethingFourth(), doSomethingFifth() ... etc.

}


The caller of class Foo looks something like below.

Class SomeServiceImpl{
    public List<Things> getAllFoo(List<Things> stuff){
        Map<Integer,NewThings> fooList = new HashMap<Integer,NewThings>();
        Foo foo = new Foo(stuff);
        fooList.put(1,foo.doSomeThingFirst());
        fooList.put(2,foo.doSomeThingSecond());
        fooList.put(3,foo.doSomeThingThird());
            return new ArrayList<Things>(fooList.values());

    }
}

Дайте мне знать, как, по вашему мнению, этот код должен быть реорганизован для удобства сопровождения и повторного использования или все нормально, как есть?

Спасибо за ваш вклад.

Ответы [ 5 ]

5 голосов
/ 03 августа 2010
 // the following 3 methods are 90% similar

Поскольку вы не предлагали реальный код, это та часть, которую вы выделяете.

2 голосов
/ 03 августа 2010

Шаблон команды может помочь здесь. Это типичный случай применения принципа «Инкапсуляция, которая варьируется». Код будет:

public interface Command {
  public List<NewThings> doSomething();
}

class DoSomethingFirst implements Command {
  public DoSomethingFirst(Foo foo) {
  ...
  }
  public List<NewThings> doSomething() {
  ...
  }
}

тогда ваш сервисный код будет

   fooList.put(1,(new DoSomeThingFirst(foo)).doSomething());
   fooList.put(2,(new DoSomeThingSecond(foo)).doSomething());
   fooList.put(3,(new DoSomeThingThird(foo)).doSomething());

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

Если у производных классов Command большая часть кода похожа, сделайте что-то как:

public abstract class DoSomethingBasic implements Command {
...
// common code here.
...
} 

public class DoSomethingFirst extends DoSomething {
  public list<NewThings> doSomething() {
    super.doSomething(); //if possible
    ...
  }
}

мои 2 цента.

1 голос
/ 03 августа 2010

Я бы сказал, что нужно исключить 90% из общедоступного метода, который предоставляет услуги вызывающей стороне, а затем иметь частные вспомогательные методы для обработки doFirst(), doSecond() и т. Д. Таким образом, если вы добавите Более того, ваш публичный API не изменит и не сломает клиентов.

1 голос
/ 03 августа 2010

Прежде всего Вам необходимо заменить Список на Карту

Class SomeServiceImpl{
    public getAllFoo(List<Things> stuff){
        Map<Integer,NewThings> fooMap = new HashMap<Integer,NewThings>();
        Foo foo = new Foo(stuff);
        fooMap.add(1,foo.doSomeThingFirst());
        fooMap.add(2,foo.doSomeThingSecond());
        fooMap.add(3,foo.doSomeThingThird());

    }
}

Следующее, что пример действительно поры без логики, и трудно понять, что Вы действительно хотите сделать.

Класс SomeServiceImpl выполняет некоторые операции над списком, но под значением 1,2,3 вы всегда получаете один и тот же результат. Операция выполняется при добавлении в список, а не при получении списка с этой карты.

Я думаю, что вы выбрали неправильный шаблон проектирования, вместо этого вам следует использовать шаблон Builder.

http://en.wikipedia.org/wiki/Builder_pattern#Java

1 голос
/ 03 августа 2010

Похоже на шаблон BUILDER, вызывающий методы по порядку.

link http://en.wikipedia.org/wiki/Builder_pattern

Вероятно, шаблон STRATEGY удаляет 90% дублирования

ссылка http://en.wikipedia.org/wiki/Strategy_pattern

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...