2016-05-10 3 views
1

У меня есть класс под названием FirstClass, и у него есть один метод, который имеет более 100 строк. Теперь я пишу новый класс под названием SecondClass, который имеет метод, который точно подобен методу в FirstClass, за исключением одной строки.Рефакторинг. Копировать код вставки, когда код отличается только одной строкой

Я могу скопировать содержимое firstMethod() и вставить его в secondMethod() и просто изменить строку, которая отличается. Но мне это не кажется правильным.

Как я могу справиться с этой ситуацией без копирования/вставки кода?

FirstClass не может быть изменен.

public class FirstClass { 
    public void firstMethod() { 
     //100 lines of code 
    } 
} 

public class SecondClass { 
    public void secondMethod() { 
     // Copy/paste the content of firstMethod() from above? 
    } 
} 
+3

100-строчный метод в большинстве случаев является плохим дизайном, поэтому не похоже, что вы первыми сделаете что-то, что не является оптимальным в этой кодовой базе. – Kayaman

+1

Хотя я согласен с @Kayaman, это не значит, что вы должны быть рядом с добавлением неоптимального кода. Похоже, что какой-то рефакторинг в порядке. – cjstehno

+0

Почему нельзя изменить «FirstClass»? Является ли это частью сторонней библиотеки? – cjstehno

ответ

1

Используйте абстрактный класс с общим кодом и продлить его, а затем overide метод, вызвав супер метод и выполнение другого кода:

public class CommonClass { 
    public void method() { 
     // 100 lines of code 
    } 
} 

public class FirstClass extends CommonClass { 
    public void method() { 
     super.method(); 
     // other code 
    } 
} 

public class SecondClass extends CommonClass { 
    public method() { 
     super.method(); 
     // other code 
    } 
} 
+1

Первый класс не может быть изменен ... –

1

Я думаю, что ваш лучший вариант в этом случае будет decorator. Here вы можете увидеть реализацию на Java.

public class SecondClass extends FirstClass { 
    private FirstClass firstClass; 

    ... 

    @Override 
    void firstMethod() { 
     // do something before 
     firstClass.firstMethod(); 
     // do something after 
    } 

Но 100 строк кода в одном методе для меня не подходят.

1

FirstClass не может быть изменен.

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

Первая возможность зависит от того, что на самом деле делает первый метод, и что второй должен делать. Если вам повезет, может быть, вы можете написать второй метод, чтобы он;

  • Может быть, устанавливает некоторые специальные условия или специальные среды,
  • Вызывает первый метод, может быть, в какой-то особым образом,
  • Может быть, фиксирует вверх результат в некотором роде.

Если вы не можете сделать эту работу, тогда единственная возможная возможность, которую я вижу, - вырезать/скопировать/вставить/изменить, а затем помыть руки.

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

  • Нет связанных вопросов^_^