2015-02-18 6 views
0

У меня есть несколько методов в классе, как это:Могу ли я создать следующий код?

@Override 
public void sendRemoteRecord(String token, int channelId, int eventId, final ServiceCallback<RemoteRecordResponse> callback) { 

    epgServicesApiManager.sendRemoteRecord(token, channelId, eventId) 
      .observeOn(scheduler) 
      .subscribe(new Action1<RemoteRecordResponse>() { 
       @Override 
       public void call(RemoteRecordResponse model) { 
        if (callback != null) 
         callback.onSuccess(model); 
       } 
      }, new Action1<Throwable>() { 
       @Override 
       public void call(Throwable throwable) { 
        if (callback != null) 
         callback.onError(); 
       } 
      }); 
} 

@Override 
public void activateRemoteRecord(String token, String cardNumber, final ServiceCallback<RemoteRecordActivateResponse> callback) { 

    epgServicesApiManager.activateRemoteRecord(token, cardNumber) 
      .observeOn(scheduler) 
      .subscribe(new Action1<RemoteRecordActivateResponse>() { 
       @Override 
       public void call(RemoteRecordActivateResponse remoteRecordActivateResponse) { 
        if (callback != null) 
         callback.onSuccess(remoteRecordActivateResponse); 
       } 
      }, new Action1<Throwable>() { 
       @Override 
       public void call(Throwable throwable) { 
        if (callback != null) 
         callback.onError(); 
       } 
      }); 
} 

Можно ли удалить дублирование вокруг кода после строки observeOn()?

Досадной частью является проверка нулевой проверки обратного вызова перед ее использованием.

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

+0

Он должен быть опубликован в [Обзор кодекса] (http://codereview.stackexchange.com/) –

+0

Должен ли я снова заплатить? – FinalFive

+1

Пройдите через этот [тур] (http://codereview.stackexchange.com/tour) –

ответ

1

К сожалению, на Java 1.7 нет возможности исправить это, не увеличивая количество кода. You может уменьшить количество кода, необходимого локально, путем введения некоторых вспомогательных классов.

Одним из решений является перемещение ваших анонимных внутренних классов в классы верхнего уровня. Оттуда вы можете ввести фиктивный обратный вызов и некоторую операцию проверки нулевой последовательности - абстрактный класс.

Возможно, это выглядит примерно так (горизонтальные правила используются, чтобы подчеркнуть, что эти классы находятся в отдельных файлах).

Это классный класс обратного вызова, он ничего не делает, но безопасен для вызова. Это заменит значения null.

public class NullServiceCallBack<T> implements ServiceCallBack<T> { 
    @Override 
    public void onSuccess(T target) {} 

    @Override 
    public void onError() {} 
} 

Это абстрактный класс, который обрабатывает проверки, преобразования null значений экземпляров NullServiceCallback:

public abstract class CallBackAction<T> implements Action1<T> { 
    private final ServiceCallBack<T> Callback; 

    public CallBackAction(ServiceCallBack<T> callback) { 
     this.Callback = (null != callback) ? callback : new NullServiceCallBack<>(); 
    } 

    protected ServiceCallBack<T> getCallback() { 
     return Callback; 
    } 
} 

Это конкретный класс, который вы будете использовать для достижения успеха.

public class SuccessCallbackAction<T> extends CallBackAction<T> { 

    public SuccessCallbackAction(ServiceCallBack<T> callback) { 
     super(callback); 
    } 

    @Override 
    public void call(T target) { 
     getCallback().onSuccess(target); 
    } 
} 

Это конкретный класс ошибок. Это не делает ничего с аргументами для вызова, поэтому мы можем сделать это приложение для Object один раз и сделать с ним.

public class ErrorCallbackAction extends CallBackAction<Object> { 
    public ErrorCallbackAction(ServiceCallBack<Object> callback) { 
     super(callback); 
    } 

    @Override 
    public void call(Throwable target) { 
     getCallback().onError(); 
    } 
} 

Таким образом, в конце концов, ваш пример выше должен выглядеть следующим образом:

@Override 
public void sendRemoteRecord(String token, int channelId, int eventId, final ServiceCallback<RemoteRecordResponse> callback) { 

    epgServicesApiManager.sendRemoteRecord(token, channelId, eventId) 
      .observeOn(scheduler) 
      .subscribe(new SuccessCallbackAction<RemoteRecordResponse>(callback), 
         new ErrorCallbackAction(callback)); 
} 

@Override 
public void activateRemoteRecord(String token, String cardNumber, final ServiceCallback<RemoteRecordActivateResponse> callback) { 

    epgServicesApiManager.activateRemoteRecord(token, cardNumber) 
      .observeOn(scheduler) 
      .subscribe(new SuccessCallbackAction<RemoteRecordActivateResponse>(callback), 
         new ErrorCallbackAction(callback)); 
} 

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

+0

Я пошел с этим кодом минус обратный вызов манекена. Благодаря! – FinalFive

0

Введем фиктивную функцию обратного вызова, который ничего не делает, то не safeCallback().onSuccess() или safeCallback().onError()

Кроме того, вы можете сделать это:

class SuccessCallback<T> extends Action1<T>() { 
       @Override 
       public void call(T value) { 
        safeCallback().onSuccess(value); 
       } 
} 

class ErrorCallback extends Action1<Throwable>() { 
       @Override 
       public void call(T value) { 
        safeCallback().onError(); 
       } 
} 

тогда ...

subscribe(new SuccessCallback<RemoteRecordActivateResponse>(), new ErrorCallback()); 

ли эта работа?

+0

Я не понимаю, как работает обратный вызов манекена с этим? – FinalFive

+0

safeCallback() {return callback == null? dummy: callback} – Arkadiy

Смежные вопросы