简体   繁体   English

我有两种几乎相同的方法,如何重构它们?

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

I am having two DatePickerFragment s because I need to pick up a start and end time. 我有两个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();
    }
};

The Fragment(s): 片段:

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);
    }
}

And there is one more Fragment, which is the same. 还有一个片段,也是一样。

So it appears to me, if I set up the first Date, I need to do setCallBack , but I have two separate buttons, so to my understanding, I need another method, which sets another callback. 在我看来,如果我设置了第一个Date,则需要执行setCallBack ,但是我有两个单独的按钮,所以据我所知,我需要另一个方法,该方法可以设置另一个回调。 I want to avoid this repetition because it's not very DRY. 我想避免这种重复,因为它不是很干。

How do I fix this? 我该如何解决?

Technically, since it's setting different vars, it is different functionality and is not doing too much repetition. 从技术上讲,由于它设置了不同的变量,因此它具有不同的功能,并且没有进行过多的重复。 One way to condense the replicated code would be to move it to another method. 压缩复制代码的一种方法是将其移至另一种方法。 Try this: 尝试这个:

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

Then you can simply have your callbacks call the above method. 然后,您可以简单地让您的回调调用上述方法。

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);
    }
};

If I understand this correctly (if not let me know and I will delete this), you could do something like this 如果我正确理解了这一点(如果不告诉我,我将删除它),则可以执行以下操作

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
    }
}

Then all you would have to do in your DatePickerFragment's is override setTime(long timeInMillis) and do what you want with the value. 然后,在DatePickerFragment中要做的就是重写setTime(long timeInMillis)并使用该值做您想做的事情。

For example 例如

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
    ...
}

You can also override the getCallback() function itself if you didn't want to utilize the default listener. 如果您不想使用默认的侦听器,也可以覆盖getCallback()函数本身。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM