Можно как-то такое зарефакторить ?

 
 
 
Сообщения:10
есть код, написанный не мною,
который так и просит рефакторигна

конкретно интересует вот такой кусок
можно ли что-то сделать

java 1.7

        try {
            organizationName = fileXML.getДокумент().getСвСчФакт().getСвПрод().getИдСв().getСвЮЛУч().getНаимОрг();
            outLog("read getСвЮЛУч().getНаимОрг() ");
        } catch (Exception e) {
            outLog("getСвЮЛУч().getНаимОрг() not exists " + e.getMessage() + String.valueOf(e));
            try {
                organizationName = fileXML.getДокумент().getСвСчФакт().getСвПрод().getИдСв().getСвЮлНеУч().getНаимОрг();
                outLog("read getСвЮлНеУч().getНаимОрг() ");
            } catch (Exception e2) {
                outLog(" getСвЮлНеУч().getНаимОрг()  not exists " + e2.getMessage() + " " + String.valueOf(e2));
                try {
                    organizationName = fileXML.getДокумент().getСвСчФакт().getСвПрод().getИдСв().getСвИП().getФИО().getФамилия() + " " +
                            fileXML.getДокумент().getСвСчФакт().getСвПрод().getИдСв().getСвИП().getФИО().getИмя() + " " +
                            fileXML.getДокумент().getСвСчФакт().getСвПрод().getИдСв().getСвИП().getФИО().getОтчество();
                    outLog("read getСвЮлНеУч().getНаимОрг() ");
                } catch (Exception e3) {
                    outLog(" getИдСв().getСвИП()  not exists " + e3.getMessage() + " " + String.valueOf(e3));
                }
            }
        }


и так считается не одно поле, а куча
разница с точностью до путей
геттеры идут по модели JAXB
 
 
Сообщения:298
1. Я так понимаю, что в систему приходит XML на русском. Это треш конечно, но что делать. Есть специальные мапперы (например Orika), которые можно попробовать прикрутить, чтобы замапить входные поля на латинские в ДТО, которые уже будут использоваться в коде. Кровь из глас идет, когда такое читаешь =)

2. Конкретно здесь везде используется `fileXML.getДокумент().getСвСчФакт().getСвПрод().getИдСв()` так что можно вынести. Остальное можно попробовать переписать на Optional, если java 7, то использовать guava от google.

"Мы же профессионалы! Мы всегда делаем чуть больше, чем требуется!" (с)
Изменен:15 янв 2020 08:47
 
 
Сообщения:10
MuH3gPaB:
1. Я так понимаю, что в систему приходит XML на русском. Это треш конечно, но что делать. Есть специальные мапперы (например Orika), которые можно попробовать прикрутить, чтобы замапить входные поля на латинские в ДТО, которые уже будут использоваться в коде. Кровь из глас идет, когда такое читаешь =)

2. Конкретно здесь везде используется `fileXML.getДокумент().getСвСчФакт().getСвПрод().getИдСв()` так что можно вынести. Остальное можно попробовать переписать на Optional, если java 7, то использовать guava от google.


меня больше интересует можно ли избавиться от кучи вложенных try

про guava от google - можно подробнее ?
 
 
Сообщения:298
spin:
про guava от google - можно подробнее ?


Это как java 8 только по другому :)
Библиотека от гугл
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>21.0</version>
        </dependency>


Версию посмотрите там какая подойдет.

Получится что-то вроде
		Object идСв = getИдСв(fileXML);

		return getНаимОрг(идСв)
				.or(getНаимОрг1(идСв))
				.or(getOrganizationName(идСв))
				.or((String) null);


Внутри будет не очень красиво без лямбд, но бизнес логика будет хорошо читаться.

И с лагированием придется поколдовать.

"Мы же профессионалы! Мы всегда делаем чуть больше, чем требуется!" (с)
 
 
Сообщения:10
MuH3gPaB:


Получится что-то вроде
		Object идСв = getИдСв(fileXML);

		return getНаимОрг(идСв)
				.or(getНаимОрг1(идСв))
				.or(getOrganizationName(идСв))
				.or((String) null);


Внутри будет не очень красиво без лямбд, но бизнес логика будет хорошо читаться.

И с лагированием придется поколдовать.


не понятно

что в вашем примере передается в качестве агрумента, значение ?

как это совместить с теми цепочками ?
(даже если их сократить)

выглядит как альтернатива вложенным IF, но не вложенным TRY

PS или я совсем нихрена не понял
Изменен:15 янв 2020 10:44
 
 
Сообщения:1719
1 - длинные цепочки можно выделить в отдельную переменную, вроде
 idSv = fileXML.getДокумент().getСвСчФакт().getСвПрод().getИдСв();
        try {
            organizationName = idSv.getСвЮЛУч().getНаимОрг();
            outLog("read getСвЮЛУч().getНаимОрг() ");
        } catch (Exception e) {
            outLog("getСвЮЛУч().getНаимОрг() not exists " + e.getMessage() + String.valueOf(e));
            try {
                organizationName = idSv.getСвЮлНеУч().getНаимОрг();
                outLog("read getСвЮлНеУч().getНаимОрг() ");
            } catch (Exception e2) {
                outLog(" getСвЮлНеУч().getНаимОрг()  not exists " + e2.getMessage() + " " + String.valueOf(e2));
                try {
                    fio = idSv.getСвИП().getФИО();
                    organizationName = idSv.getФамилия() + " " +
                            idSv.getИмя() + " " +
                            idSv.getОтчество();
                    outLog("read getСвЮлНеУч().getНаимОрг() ");
                } catch (Exception e3) {
                    outLog(" getИдСв().getСвИП()  not exists " + e3.getMessage() + " " + String.valueOf(e3));
                }
            }
        }

2 - outLog лучше переделать на стандартную систему логгирования
3 - try {} catch не лучшее решение, у xml должны быть методы вроде .isElementExist()
        idSv = fileXML.getДокумент().getСвСчФакт().getСвПрод().getИдСв();
        if(idSv.getСвЮЛУч().isExist() && idSv.getСвЮЛУч().getНаимОрг().isExist()){
            organizationName = idSv.getСвЮЛУч().getНаимОрг();
            outLog("read getСвЮЛУч().getНаимОрг() ");
        } else if(idSv.getСвЮлНеУч().isExist() && idSv.getСвЮлНеУч().getНаимОрг().isExist()){
            organizationName = idSv.getСвЮлНеУч().getНаимОрг();
            outLog("read getСвЮлНеУч().getНаимОрг() ");
        } else if(idSv.getСвИП().getФИО().isExist()){
            fio = idSv.getСвИП().getФИО();
            organizationName = idSv.getФамилия() + " " +
                    idSv.getИмя() + " " +
                    idSv.getОтчество();
            outLog("read getСвЮлНеУч().getНаимОрг() ");
        } else {
            outLog(" getИдСв().getСвИП()  not exists " + e3.getMessage() + " " + String.valueOf(e3));
        }
 
 
Сообщения:298
Цепочки можно разворачивать вот так
package guava;

import com.google.common.base.Function;
import com.google.common.base.Optional;


public class Main
{
	public static void main(String[] args)
	{
		A a = new A();

		String value = Optional.fromNullable(a.getB())
				.transform(getC())
				.transform(getValue())
				.orNull();

		System.out.println(value);
	}

	private static Function<C, String> getValue()
	{
		return new Function<C, String>()
		{
			@Override
			public String apply(C c)
			{
				return c.getValue();
			}
		};
	}

	private static Function<B, C> getC()
	{
		return new Function<B, C>()
		{
			@Override
			public C apply(B b)
			{
				return b.getC();
			}
		};
	}
}

class A
{
	private B b = new B();

	B getB()
	{
		return b;
	}
}

class B
{
	private C c = new C();

	C getC()
	{
		return c;
	}
}

class C
{
	private String value = "hello";

	String getValue()
	{
		return value;
	}
}


Как и говорил - без лямбд не очень красиво, но лучше, чем на эксепшенах.

"Мы же профессионалы! Мы всегда делаем чуть больше, чем требуется!" (с)
 
 
Сообщения:10
MuH3gPaB:
Цепочки можно разворачивать вот так


спасибо
примерно то что надо
 
 
Сообщения:10
еще вопрос про Guava

пишут что
If you need support for JDK 1.7 or Android, use the Android flavor.

там только реализация отличается ?
API один ?

если нет, где взять доку именно на это
 
 
Сообщения:298
Гуглите =)

https://stackoverflow.com/questions/36045121/which-version-of-guava-is-compatible-with-java-1-7

Разделение пошло с 21 версии, берите 20 и будет счастье.

"Мы же профессионалы! Мы всегда делаем чуть больше, чем требуется!" (с)
 
Модераторы:frymock
Сейчас эту тему просматривают:Нет