Как я могу СУХОЙ Android модернизировать звонки? - PullRequest
0 голосов
/ 12 ноября 2018

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

Например, это UserRepository:

public class UserRepository {

public static String TAG = "UserRepository";

ApiService mApiService;

SharedPreferences mPrefs;
Context mContext;

RemoteDataSource<User> mRemoteDataSource;


public UserRepository() {
    mApiService = new RetrofitClient().getApiService();
    mContext = App.getAppContext();
    mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
    mRemoteDataSource = new RemoteDataSource<>();
}

public RemoteDataSource getRemoteDataSource() {
    mRemoteDataSource.setIsLoading();
    Call<ApiResponse> userCall = mApiService.getUserInfo(mPrefs.getString(User.TOKEN_NAME, null));
    userCall.enqueue(new Callback<ApiResponse>() {
        @Override
        public void onResponse(Call<ApiResponse> call, Response<ApiResponse> response) {
            mRemoteDataSource.setIsLoaded();
            mRemoteDataSource.setData(response.body().getUser());
            mRemoteDataSource.setStatus(response.body().getStatus());
            mRemoteDataSource.setMessage(response.body().getMessage());
        }

        @Override
        public void onFailure(Call<ApiResponse> call, Throwable t) {
            Log.e(TAG, t.getMessage());
            mRemoteDataSource.setFailed(t.getMessage());
        }
    });

return mRemoteDataSource;
}

}

А это BonusRepository:

public class BonusRepository {

public static String TAG = "BonusRepository";

ApiService mApiService;

SharedPreferences mPrefs;
Context mContext;

LiveData<Bonus> mBonus;
String mId;
RemoteDataSource<Bonus> mRemoteDataSource;

public BonusRepository(String id) {
    mId = id;
    mApiService = new RetrofitClient().getApiService();
    mContext = App.getAppContext();
    mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
    mRemoteDataSource = new RemoteDataSource<>();
}

public RemoteDataSource getRemoteDataSource() {
    mRemoteDataSource.setIsLoading();
    Call<ApiResponse> bonusCall = mApiService.getBonus(mPrefs.getString(User.TOKEN_NAME, null), mId);
    bonusCall.enqueue(new Callback<ApiResponse>() {
        @Override
        public void onResponse(Call<ApiResponse> call, Response<ApiResponse> response) {
            mRemoteDataSource.setIsLoaded();
            mRemoteDataSource.setData(response.body().getBonus());
            mRemoteDataSource.setStatus(response.body().getStatus());
            mRemoteDataSource.setMessage(response.body().getMessage());
        }

        @Override
        public void onFailure(Call<ApiResponse> call, Throwable t) {
            Log.e(TAG, t.getMessage());
            mRemoteDataSource.setFailed(t.getMessage());
        }
    });
    return mRemoteDataSource;
}
}

getRemoteDataSource методы в обоих классах равны, кроме

Call<ApiResponse> userCall = mApiService.getUserInfo(mPrefs.getString(User.TOKEN_NAME, null));

и mRemoteDataSource.setData(response.body().getUser()); в репозитории пользователей

отличается от:

Call<ApiResponse> bonusCall = ApiService.getBonus(mPrefs.getString(User.TOKEN_NAME, null), mId);

и mRemoteDataSource.setData(response.body().getBonus()); в BonusRepository.

В других репозиториях у меня есть похожий дубликат кода.

Я хочу удалить эти дубликаты, но не могу найти хорошего решения.

Как лучше СУШИТЬ мой код?

1 Ответ

0 голосов
/ 12 ноября 2018

Создайте родительский класс абстрактного класса для всех ваших репозиториев и реализуйте метод getRemoteDataSource () , вызывая новый абстрактный метод, который будет единственным конкретным, в каждой конкретной реализации.

Например:

public class AbstractRepository {

protected abstract Call<ApiResponse> performCall();

public RemoteDataSource getRemoteDataSource() {
    mRemoteDataSource.setIsLoading();
    Call<ApiResponse> userCall = performCall();
    userCall.enqueue(new Callback<ApiResponse>() {
        @Override
        public void onResponse(Call<ApiResponse> call, Response<ApiResponse> response) {
            mRemoteDataSource.setIsLoaded();
            mRemoteDataSource.setData(response.body().getUser());
            mRemoteDataSource.setStatus(response.body().getStatus());
            mRemoteDataSource.setMessage(response.body().getMessage());
        }

        @Override
        public void onFailure(Call<ApiResponse> call, Throwable t) {
            Log.e(TAG, t.getMessage());
            mRemoteDataSource.setFailed(t.getMessage());
        }
    });

return mRemoteDataSource;
}

}

И тогда вы можете выполнить что-то вроде:

public class UserRepository extends AbstractRepository {

public static String TAG = "UserRepository";

ApiService mApiService;

SharedPreferences mPrefs;
Context mContext;

RemoteDataSource<User> mRemoteDataSource;

public UserRepository() {
    mApiService = new RetrofitClient().getApiService();
    mContext = App.getAppContext();
    mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
    mRemoteDataSource = new RemoteDataSource<>();
}

protected Call<ApiResponse> performCall() {
    return mApiService.getUserInfo(mPrefs.getString(User.TOKEN_NAME, null));
}

}

Я позволю вам адаптироваться к вашим потребностям, но этолучшее решение.

...