powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как бы вы отрефакторили
16 сообщений из 16, страница 1 из 1
Как бы вы отрефакторили
    #38300843
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как же все-таки не хватает лямбд:) Как бы вы отрефакторили такой код? -

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
public void requestStatus() throws Exception {
        JSONObject jsn = new JSONObject();
        try {
            AdidasService.Result res = adidasService.getAccountStatus(getEntityNumber());
            jsn.put("accountStatus", res.getStatus());
            jsn.put("accountIdentifier", res.getAccountIdentifier());
        } catch (AdidasServiceException e) {
            logError(e);
            jsn.put("message", e.getMessage());
            jsn.put("serviceError", true);
        } catch (Exception e) {
            logError(e);
            jsn.put("message", e.getMessage());
            jsn.put("serviceError", true);
        }

        respond(jsn.toString()).contentType("application/json").status(200);
    }

    @POST
    public void activateAccount() throws Exception {
        String email = param("email");
        JSONObject jsn = new JSONObject();
        try {
            AdidasService.Result res = adidasService.activateAccount(getEntityNumber(), email);
            jsn.put("accountStatus", res.getStatus());
            jsn.put("accountIdentifier", res.getAccountIdentifier());
        } catch (AdidasServiceException e) {
            logError(e);
            jsn.put("message", e.getMessage());
        } catch (Exception e) {
            logError(e);
            jsn.put("message", e.getMessage());
        }

        respond(jsn.toString()).contentType("application/json").status(200);
    }



Вот руки так и чешутся, а нормального способа не могу придумать.
...
Рейтинг: 0 / 0
Как бы вы отрефакторили
    #38300851
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,

Например, убрать catch -блоки с параметром AdidasServiceException .
...
Рейтинг: 0 / 0
Как бы вы отрефакторили
    #38300857
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
enum AccountAction {
	Status,
	Activate
}

public void adidasResponse(AccountAction action, AdidasService.Result res) {
	JSONObject jsn = new JSONObject();
	switch (action) {
	case Activate:
                jsn.put("...", res...);
                jsn.put("...", res...);
		break;
	case Status:
                jsn.put("...", res...);
                jsn.put("...", res...);
		break;
	}
        respond(jsn.toString()).contentType("application/json").status(200);	
}

P.S.
Не знаю как быть в этом случае с аннотацией @POST

P.P.S.
Думаю, что можно всю логику формирования JSON'а загнать в функцию respond , если это возможно.
...
Рейтинг: 0 / 0
Как бы вы отрефакторили
    #38300858
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну это понятно, меня интересует как люди рефакторят

Код: java
1.
2.
3.
4.
5.
   public void method1(){
        someInfrastructureCode();// в том числе try
        businessCall();
        someInfrastructureCode();// в том числе catch
   }


Пока вижу только такой вариант - создать интерфейс коллбэка и два анонимных класса, для такой задачи конечно как из пушки по воробьям.. Буду ждать лямбды(пока писал понял что мой вариант и есть лямбды без сахара:)).
...
Рейтинг: 0 / 0
Как бы вы отрефакторили
    #38300859
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usmanзабыл ник,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
enum AccountAction {
	Status,
	Activate
}

public void adidasResponse(AccountAction action, AdidasService.Result res) {
	JSONObject jsn = new JSONObject();
	switch (action) {
	case Activate:
                jsn.put("...", res...);
                jsn.put("...", res...);
		break;
	case Status:
                jsn.put("...", res...);
                jsn.put("...", res...);
		break;
	}
        respond(jsn.toString()).contentType("application/json").status(200);	
}

P.S.
Не знаю как быть в этом случае с аннотацией @POST

P.P.S.
Думаю, что можно всю логику формирования JSON'а загнать в функцию respond , если это возможно.


не, уж лучше так пусть останется:)
...
Рейтинг: 0 / 0
Как бы вы отрефакторили
    #38300860
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перефразирую вопрос так - вы видите такой код ваши действия -

1) хер с ним
2) имитируете функцональный стиль
3) создаете энумерейшн и разруливаете через if\else switch\case в зависимости от значения энума
...
Рейтинг: 0 / 0
Как бы вы отрефакторили
    #38300902
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Речь о том, что все методы отличаются только одним вызовом? Тогда так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
void executeRequest(Action action) {
        JSONObject jsn = new JSONObject();
        try {
            AdidasService.Result res = action.execute();
            jsn.put("accountStatus", res.getStatus());
            jsn.put("accountIdentifier", res.getAccountIdentifier());
        } catch (AdidasServiceException e) { 
            logError(e);
            jsn.put("message", e.getMessage());
            jsn.put("serviceError", true);
        } catch (Exception e) {
            logError(e);
            jsn.put("message", e.getMessage());
            jsn.put("serviceError", true);
        }

        respond(jsn.toString()).contentType("application/json").status(200);
    }
}



И вызов:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public void requestStatus() throws Exception {
     executeRequest(new Action{
       public Result execute() {
          return adidasService.getAccountStatus(getEntityNumber());
        }
    });
}

    @POST
    public void activateAccount() throws Exception {
     executeRequest(new Action{
       public Result execute() {
           return adidasService.activateAccount(getEntityNumber(), email);
        }
    });
    }
...
Рейтинг: 0 / 0
Как бы вы отрефакторили
    #38300942
pulp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никну это понятно, меня интересует как люди рефакторят

Код: java
1.
2.
3.
4.
5.
   public void method1(){
        someInfrastructureCode();// в том числе try
        businessCall();
        someInfrastructureCode();// в том числе catch
   }


Пока вижу только такой вариант - создать интерфейс коллбэка и два анонимных класса, для такой задачи конечно как из пушки по воробьям.. Буду ждать лямбды(пока писал понял что мой вариант и есть лямбды без сахара:)).

А если так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
   public void method1(){
        someInfrastructureCode();// в том числе try
        try {
                businessCall();
        } catch () {}
        finally {
                someInfrastructureCode();// в том числе catch
        }
   }
...
Рейтинг: 0 / 0
Как бы вы отрефакторили
    #38301002
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,

Фактически-то происходит JSon-сериализация объекта AdidasService.Result . Делаем так:
Код: java
1.
respond(new Gson().toJson(adidasService.getAccountStatus(getEntityNumber()))).contentType("application/json").status(200);

P.S.
Gson().toJson будет сериализировать только проинициализированные поля.
...
Рейтинг: 0 / 0
Как бы вы отрефакторили
    #38301038
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,

Во-первых, лови и обрабатывай только один базой exception, throwable или exception.
...
Рейтинг: 0 / 0
Как бы вы отрефакторили
    #38301067
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usmanзабыл ник,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
enum AccountAction {
	Status,
	Activate
}

public void adidasResponse(AccountAction action, AdidasService.Result res) {
	JSONObject jsn = new JSONObject();
	switch (action) {
	case Activate:
                jsn.put("...", res...);
                jsn.put("...", res...);
		break;
	case Status:
                jsn.put("...", res...);
                jsn.put("...", res...);
		break;
	}
        respond(jsn.toString()).contentType("application/json").status(200);	
}

P.S.
Не знаю как быть в этом случае с аннотацией @POST

P.P.S.
Думаю, что можно всю логику формирования JSON'а загнать в функцию respond , если это возможно.


Это что, анти рефакторинг?
Раньше не было диспатча явного, теперь он появился...

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


Но я лично вообще не вижу там причин для рефакторинга, там есть только повторное использование кода обработки исключения и формирования json - на.
Его можно исключить использую тривиально функции.
...
Рейтинг: 0 / 0
Как бы вы отрефакторили
    #38301071
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никну это понятно, меня интересует как люди рефакторят

Код: java
1.
2.
3.
4.
5.
   public void method1(){
        someInfrastructureCode();// в том числе try
        businessCall();
        someInfrastructureCode();// в том числе catch
   }


Пока вижу только такой вариант - создать интерфейс коллбэка и два анонимных класса, для такой задачи конечно как из пушки по воробьям.. Буду ждать лямбды(пока писал понял что мой вариант и есть лямбды без сахара:)).

Как бы лямбда - это функция с данными.
Если у тебя уже есть все данные в твоем объекте сервера, то вот твоя лямблиоз уже и есть, что тебе ещё надо - не понятно.
...
Рейтинг: 0 / 0
Как бы вы отрефакторили
    #38301081
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Здесь ничего не надо делать, здесь надо использовать базовый класс сервлета который был бы уже с поддержкой json — возвращал бы всегда json и оборачивал все обработчики в стек исключений с формированием нужных Jain response.
...
Рейтинг: 0 / 0
Как бы вы отрефакторили
    #38301085
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,

Достаточно просто поделить на слои.
1) Слой обработки ошибок\отката транзакций - ServletFilter, Proxy или другой AOP
2) Слой сериализации Model->JSON, Java Serialization, Protobuf, etc
3) Dispatcher, которй редиректит запросы на методы бизнес-логику
4) Cлой логики, который формирует Model

Всё остальное - частные варианты реализации разделения на слои. Никакие новые ухищрения не нужны. Слоёв может быть больше.
...
Рейтинг: 0 / 0
Как бы вы отрефакторили
    #38301089
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никКак же все-таки не хватает лямбд:) Как бы вы отрефакторили такой код? -

Вообще говоря для лямбд нужны еще анонимные типы, вывод типов и полноценные замыкания. Например я шарпе я могу так.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
   public static T CrmClientFunc<T>(Func<CRMServiceN.ElarCrmServiceClient, T> func)
        {
            CRMServiceN.ElarCrmServiceClient client = null;
            try
            {
                client = new CRMServiceN.ElarCrmServiceClient();
                T res = func(client);
                client.Close();
                return res;
            }
            catch (Exception exc)
            {
                if (client != null)
                    client.Abort();
                throw Logger.WriteLogAndThrow(exc);
            }
        }


И использование.
Код: c#
1.
var org = Util.CrmClientFunc(client => client.GetOrganizationByGuid(orgGuid));


Компилятор сам выведет тип переменной org, причем это может быть анонимный тип и возмет из внешнего контекста orgGuid.
...
Рейтинг: 0 / 0
Как бы вы отрефакторили
    #38301147
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЭто что, анти рефакторинг?
Раньше не было диспатча явного, теперь он появился...Это всего лишь попытка обобщить несколько (по структуре одинаковых) действий в одну единую функцию-переключатель.MasterZivНадо, если уж в эту сторону копать, делать визитор, вторичную диспетчеризацию по типу запроса, но проблема то в том, что первичная диспетчеризация уже по типу запроса, но средствами мапинга запросов на методы сервлета.Все не настолько ужасно, как в оконной процедуре обработки сообщений (WinAPI).
ТС привел фрагмент кода, где формируется ответ для клиента. На счет запроса,
то там конечно будет задаваться тип операции/действия, который успешно будет
десериализирован и передан в качестве параметра в функцию ввиде константы enum.

MisterZiv,

Согласен, что все это избыточно, переосмыслил и уже предложил намного компактный вариант: 14445905
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как бы вы отрефакторили
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]