#java #design-patterns
#java #шаблоны проектирования
Вопрос:
Итак, этот элемент кода может стать довольно уродливым. Существует возможность добавления нескольких элементов в список в каждом операторе if, а также многих других операторов if / else. Каким был бы наилучший шаблон или способ разработки этого фрагмента кода. Я думал о цепочке ответственности, но это означает, что нужно повсюду передавать список, что не является лучшим или даже шаблоном builder? Есть мысли??
List<String> aList = new ArrayList<>();
if (something.contains(Effect.HARD)) {
aList.add("");
}
if (something.contains(Effect.REFLECT)) {
aList.add("");
aList.add("");
} else {
aList.add("no reflect");
}
if (something.contains(Effect.OUTLINE)) {
aList.add("something");
}
if (something.contains(Effect.GRADIENT)) {
aList.add("gradient");
} else {
aList.add("no gradient");
}
Комментарии:
1. «… если y»? «Y» что?
2. не уверен, как это следует поместить в шаблон. шаблон создается для обработки событий / things /… которые работают таким же образом, не похоже, что здесь это так.
3. Что касается вашей проблемы, не могли бы вы, пожалуйста, подробнее рассказать о вашей реальной проблеме? Что должен решать этот код? Если мы знаем, какую реальную проблему вы пытаетесь решить, нам проще придумать другое и, возможно, лучшее решение. Прямо сейчас ваш вопрос является проблемой XY .
4. Вы можете использовать шаблон стратегии для реализации функциональности типа switch case, где вы проверяете Contains , каждый contains потенциально может стать стратегией, которая сохранит ваш код чистым и читаемым.
Ответ №1:
Используйте посетителя (ссылка на страницу википедии).
Вот несколько беззаботных примеров кода:
public interface Visilator
{
// Process the stuff and, maybe, add an element to the kerplungy list.
void doStuff(Stuff stuff, List<Kerplungy> kerplungyList);
}
public class Kerplungilator
{
// Actually create this however you choose.
@Autowired
private List<Visilator> visilatorList;
public List<Kerplungy> processStuffs(final Stuff stuff)
{
final List<Kerplungy> returnValue = LinkedList<>(); // ArrayList is for chumps.
for (final Visilator current : visilatorList)
{
current.doStuff(Stuff, returnValue);
}
return returnValue;
}
}
public clss HootVisilator
implements Visilator
{
public void doStuff(
@NotNull final Stuff stuff,
@NotNull final List<Kerplungy> kerplungyList)
{
if (stuff.hoot())
{
final Kerplungy hootKerplungy = new Kerplungy("hoot");
kerplungyList.add(hootkerplungy);
}
else
{
System.out.println("not hoot");
}
}
}
Ответ №2:
Обычно вы рассматриваете замену этих уродливых условий полиморфным кодом, но здесь это не сработает, поскольку условия ( something.contains(...)
) не основаны на типе объекта. Вы могли бы превратить их в объекты, но это также не было бы элегантным решением. Можно было бы использовать Builder и Visitor, но я очень сомневаюсь, что ваш код вообще был бы более читабельным.