【问题标题】:I have two methods which are nearly the same, how to refactor them?我有两种几乎相同的方法,如何重构它们?
【发布时间】:2016-05-09 19:52:35
【问题描述】:

我有两个DatePickerFragments,因为我需要确定开始和结束时间。

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

还有一个Fragment,也是一样的。

所以在我看来,如果我设置第一个日期,我需要做setCallBack,但我有两个单独的按钮,所以据我了解,我需要另一个方法,它设置另一个回调。我想避免这种重复,因为它不是很干燥。

我该如何解决这个问题?

【问题讨论】:

  • 它们是否具有相同的功能?
  • ondate 会设置开始时间标记,ondateSecond 只会设置结束标记,因此有一段时间。所以是的,除了其他变量之外,它们都有相同的。

标签: java android android-fragments dry


【解决方案1】:

从技术上讲,因为它设置了不同的变量,所以它是不同的功能并且没有做太多的重复。压缩复制代码的一种方法是将其移动到另一种方法。试试这个:

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

【讨论】:

    【解决方案2】:

    如果我理解正确(如果不让我知道,我会删除它),你可以这样做

    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() 函数本身。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多