Чистый код. Создание, анализ и рефакторинг (Мартин) - страница 297

>378      * @param d2  другая граничная дата диапазона.

>379      *

>380      * @return логический признак.

>381      */

>382     public boolean isInRange(final SerialDate d1, final SerialDate d2) {

>383         return isInRange(d1, d2, SerialDate.INCLUDE_BOTH);

>384     }

>385

>386     /**

>387      * Возвращает true, если текущий объект SerialDate принадлежит


Листинг Б.5 (продолжение)

>388      * заданному диапазону (включение границ указывается при вызове). Порядок

>389      * d1 и d2 не важен.

>390      *

>391      * @param d1  граничная дата диапазона.

>392      * @param d2  другая граничная дата диапазона.

>393      * @param include  код, управляющий включением начальной и конечной дат

>394      *                 в диапазон.

>395      *

>396      * @return true, если текущий объект SerialDate принадлежит

>397      *         заданному диапазону.

>398      */

>399     public boolean isInRange(final SerialDate d1, final SerialDate d2,

>400                              final int include) {

>401         final int s1 = d1.toSerial();

>402         final int s2 = d2.toSerial();

>403         final int start = Math.min(s1, s2);

>404         final int end = Math.max(s1, s2);

>405

>406         final int s = toSerial();

>407         if (include == SerialDate.INCLUDE_BOTH) {

>408             return (s >= start && s <= end);

>409         }

>410         else if (include == SerialDate.INCLUDE_FIRST) {

>411             return (s >= start && s < end);

>412         }

>413         else if (include == SerialDate.INCLUDE_SECOND) {

>414             return (s > start && s <= end);

>415         }

>416         else {

>417             return (s > start && s < end);

>418         }

>419     }

>420

>421     /**

>422      * Вычисляет порядковый номер по дню, месяцу и году.

>423      *

>424      * 1 января 1900 = 2.

>425      *

>426      * @param d  день.

>427      * @param m  месяц.

>428      * @param y  год.

>429      *

>430      * @return порядковый номер для заданного дня, месяца и года.

>431      */

>432     private int calcSerial(final int d, final int m, final int y) {

>433         final int yy = ((y - 1900) * 365) + SerialDate.leapYearCount(y - 1);

>434         int mm = SerialDate.AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH[m];

>435         if (m > MonthConstants.FEBRUARY) {

>436             if (SerialDate.isLeapYear(y)) {

>437                 mm = mm + 1;

>438             }

>439         }

>440         final int dd = d;

>441         return yy + mm + dd + 1;

>442     }

>443

>444     /**

>445      * Вычисляет день, месяц и год по порядковому номеру.

>446      */

>447     private void calcDayMonthYear() {