簡體   English   中英

我有兩種幾乎相同的方法,如何重構它們?

[英]I have two methods which are nearly the same, how to refactor them?

我有兩個DatePickerFragment因為我需要選擇開始時間和結束時間。

private void showDatePickerTimePeriodStart() {
    final DatePickerFragment date = new DatePickerFragment();
    // Sets up the current date in Dialog.
    final Calendar calender = Calendar.getInstance();
    final Bundle args = new Bundle();
    args.putInt("year", calender.get(Calendar.YEAR));
    args.putInt("month", calender.get(Calendar.MONTH));
    args.putInt("day", calender.get(Calendar.DAY_OF_MONTH));
    date.setArguments(args);
    // Sets callback to the captured data.
    date.setCallBack(ondate);
    date.show(getFragmentManager(), "Date Picker");
}

OnDateSetListener ondate = new OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

        final Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(year, monthOfYear, dayOfMonth);
        millisSinceEpochStart = calendar.getTimeInMillis();
    }
};

private void showDatePickerTimePeriodEnd() {
    final DatePickerFragment date = new DatePickerFragment();
    // Sets up the current date in Dialog.
    final Calendar calender = Calendar.getInstance();
    final Bundle args = new Bundle();
    args.putInt("year", calender.get(Calendar.YEAR));
    args.putInt("month", calender.get(Calendar.MONTH));
    args.putInt("day", calender.get(Calendar.DAY_OF_MONTH));
    date.setArguments(args);
    /**
     * Set Call back to capture selected date
     */
    date.setCallBack(ondateSecond);
    date.show(getFragmentManager(), "Date Picker");
}

OnDateSetListener ondateSecond = new OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

        final Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(year, monthOfYear, dayOfMonth);
        millisSinceEpochEnd = calendar.getTimeInMillis();
    }
};

片段:

public class DatePickerFragment extends DialogFragment {
    OnDateSetListener ondateSet;
    public DatePickerFragment() {}

    public void setCallBack(OnDateSetListener ondate) {
        ondateSet = ondate;
    }
    private int year;
    private int month;
    private int day;

    @Override
    public void setArguments(Bundle args) {
        super.setArguments(args);
        year = args.getInt("year");
        month = args.getInt("month");
        day = args.getInt("day");
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new DatePickerDialog(getActivity(), ondateSet, year, month, day);
    }
}

還有一個片段,也是一樣。

在我看來,如果我設置了第一個Date,則需要執行setCallBack ,但是我有兩個單獨的按鈕,所以據我所知,我需要另一個方法,該方法可以設置另一個回調。 我想避免這種重復,因為它不是很干。

我該如何解決?

從技術上講,由於它設置了不同的變量,因此它具有不同的功能,並且沒有進行過多的重復。 壓縮復制代碼的一種方法是將其移至另一種方法。 嘗試這個:

public long getMillis(int year, int monthOfYear, int dayOfMonth){
    final Calendar calendar = Calendar.getInstance();
    calendar.clear();
    calendar.set(year, monthOfYear, dayOfMonth);
    return calendar.getTimeInMillis();
}

然后,您可以簡單地讓您的回調調用上述方法。

OnDateSetListener ondate= new OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        millisSinceEpochStart = getMillis(year, monthOfYear, dayOfMonth);
    }
};

...

OnDateSetListener ondateSecond = new OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        millisSinceEpochEnd = getMillis(year, monthOfYear, dayOfMonth);
    }
};

如果我正確理解了這一點(如果不告訴我,我將刪除它),則可以執行以下操作

public class DatePickerFragment extends DialogFragment{

    // What you already have
    ...

    // Show the date time picker on click
    // (assuming the click listener is already setup)
    public void showDateTimePicker(){
        final DatePickerFragment date = new DatePickerFragment();
        // Sets up the current date in Dialog.
        final Calendar calender = Calendar.getInstance();
        final Bundle args = new Bundle();
        args.putInt("year", calender.get(Calendar.YEAR));
        args.putInt("month", calender.get(Calendar.MONTH));
        args.putInt("day", calender.get(Calendar.DAY_OF_MONTH));
        date.setArguments(args);
        /**
         * Set Call back to capture selected date
         */
        date.setCallBack(getCallback());
        date.show(getFragmentManager(), "Date Picker");
    }

    public OnDateSetListener getCallback(){
        return new OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

                final Calendar calendar = Calendar.getInstance();
                calendar.clear();
                calendar.set(year, monthOfYear, dayOfMonth);
                setTime(calendar.getTimeInMillis());
            }
        };
    }

    public void setTime(long timeInMillis){
        // Override this method and do what you want with the millis
    }
}

然后,在DatePickerFragment中要做的就是重寫setTime(long timeInMillis)並使用該值做您想做的事情。

例如

public class StartDatePickerFragment extends DatePickerFragment{

    @Override
    public void setTime(long timeInMillis){
        millisSinceEpochStart = timeInMillis;
        // Do whatever else you want in the override call
        ...
    }

    // Do whatever else you want outside of the method
    ...
}

如果您不想使用默認的偵聽器,也可以覆蓋getCallback()函數本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM