Я сталкиваюсь с множеством подобных методов с некоторым повторяющимся кодом в своих проектах. Общая картина кажется выглядеть (извинения за туманный код, лицензирование не позволит мне дать конкретный пример):Показатели эффективности рефакторинга аналогичных методов в схеме стратегии?
public void modifyType1Person() {
Map<String, ?> parameters = new HashMap<>();
parameters.put("type", "type1");
parameters.put("stringArgument", "some name");
editPersonBasedOnType(parameters);
}
public void modifyType2Person() {
Map<String, ?> parameters = new HashMap<>();
parameters.put("type", "type2");
editPersonBasedOnType(parameters);
}
public void modifyDefaultTypePerson() {
Map<String, ?> parameters = new HashMap<>();
parameters.put("type", "otherType");
parameters.put("booleanArgument", true);
editPersonBasedOnType(parameters);
}
public void editPersonBasedOnType(Map<String, ?> parameters) {
// assume some stuff is done
switch (parameters.get("type")) {
case "type1":
editType1Person(parameters.get("stringArgument"));
case "type2":
editType2Person();
default:
editOtherType(parameters.get("type"), parameters.get("booleanArgument"));
}
// assume more stuff is done
}
private void editType1Person(String stringArg) {
Person person = PersonService.getPerson(stringArg);
person.edit();
doMoreThingsForType1Person(person);
}
private void editType2Person() {
Person person = PersonService.getPerson(HARDCODED_NAME);
person.edit();
doMoreThingsForType2Person(person);
}
private void editOtherType(String type, boolean boolArg) {
Person person = PersonService.getPerson(HARDCODED_NAME);
person.edit()
doMoreThingsForDefaultTypePerson(person)
}
«doMoreThingsForTypeXPerson» методы могут быть похожи или не похожи, в зависимости от контекста.
Лично я чувствую, что рисунок или зависимость инъекция стратегии может быть использована, чтобы избавиться от подобного кода и устранить необходимость написания нескольких методов каждого типа, поэтому он будет выглядеть следующим образом:
public void modifyType1Person() {
editPersonBasedOnType(new Type1Strategy("some name"));
}
public void modifyType2Person() {
editPersonBasedOnType(new Type2Strategy());
}
public void modifyDefaultTypePerson() {
editPersonBasedOnType(new DefaultTypeStrategy("other type", true));
}
public void editPersonBasedOnType(TypeStrategy typeStrategy) {
// assume some stuff is done
typeStrategy.doProcedure();
// assume more stuff is done
}
public interface TypeStrategy {
public void doProcedure()
}
public class Type1Strategy {
private String stringArgument;
public Type1Strategy(String stringArgument) {
this.stringArgument = stringArgument;
}
public void doProcedure() {
// editType1Person method
}
private void doMoreThingsForType1Person() {//implementation}
}
public class Type2Strategy {
public void doProcedure() {
// editType2Person method
}
private void doMoreThingsForType2Person() {//implementation}
}
public class DefaultTypeStrategy {
private String type;
private boolean boolArg;
public DefaultTypeStrategy(String type, boolean boolArg) {
this.type = type;
this.boolArg = boolArg;
}
public void doProcedure() {
// editOtherType code
}
private void doMoreThingsForDefaultTypePerson() {//implementation}
}
бы Вы использовать первый подход или реорганизованный подход? Или есть лучший подход для этой общей ситуации? Нужно ли беспокоиться о стоимости создания объекта стратегии?
Factory pattern - более подходящий образец в этой ситуации. Поскольку ваши Лицы отличаются только типом и некоторыми другими атрибутами. Вы можете создать базовый класс «Личность» и определить тип своего лица в вашем классе PersonFactory. –