Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как бы вы отрефакторили / 16 сообщений из 16, страница 1 из 1
18.06.2013, 02:01:07
    #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
18.06.2013, 02:32:07
    #38300851
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как бы вы отрефакторили
забыл ник,

Например, убрать catch -блоки с параметром AdidasServiceException .
...
Рейтинг: 0 / 0
18.06.2013, 03:01:27
    #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
18.06.2013, 03:02:51
    #38300858
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как бы вы отрефакторили
ну это понятно, меня интересует как люди рефакторят

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


Пока вижу только такой вариант - создать интерфейс коллбэка и два анонимных класса, для такой задачи конечно как из пушки по воробьям.. Буду ждать лямбды(пока писал понял что мой вариант и есть лямбды без сахара:)).
...
Рейтинг: 0 / 0
18.06.2013, 03:04:51
    #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
18.06.2013, 03:07:51
    #38300860
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как бы вы отрефакторили
Перефразирую вопрос так - вы видите такой код ваши действия -

1) хер с ним
2) имитируете функцональный стиль
3) создаете энумерейшн и разруливаете через if\else switch\case в зависимости от значения энума
...
Рейтинг: 0 / 0
18.06.2013, 08:10:02
    #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
18.06.2013, 09:01:34
    #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
18.06.2013, 09:40:33
    #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
18.06.2013, 10:04:20
    #38301038
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как бы вы отрефакторили
забыл ник,

Во-первых, лови и обрабатывай только один базой exception, throwable или exception.
...
Рейтинг: 0 / 0
18.06.2013, 10:19:01
    #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
18.06.2013, 10:23:03
    #38301071
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как бы вы отрефакторили
забыл никну это понятно, меня интересует как люди рефакторят

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


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

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

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

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

Всё остальное - частные варианты реализации разделения на слои. Никакие новые ухищрения не нужны. Слоёв может быть больше.
...
Рейтинг: 0 / 0
18.06.2013, 10:34:00
    #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
18.06.2013, 11:02:30
    #38301147
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как бы вы отрефакторили
MasterZivЭто что, анти рефакторинг?
Раньше не было диспатча явного, теперь он появился...Это всего лишь попытка обобщить несколько (по структуре одинаковых) действий в одну единую функцию-переключатель.MasterZivНадо, если уж в эту сторону копать, делать визитор, вторичную диспетчеризацию по типу запроса, но проблема то в том, что первичная диспетчеризация уже по типу запроса, но средствами мапинга запросов на методы сервлета.Все не настолько ужасно, как в оконной процедуре обработки сообщений (WinAPI).
ТС привел фрагмент кода, где формируется ответ для клиента. На счет запроса,
то там конечно будет задаваться тип операции/действия, который успешно будет
десериализирован и передан в качестве параметра в функцию ввиде константы enum.

MisterZiv,

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


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