Чистый код. Создание, анализ и рефакторинг — страница 86 из 94

329     public boolean isBefore(final SerialDate other) {

330         return (this.serial < other.toSerial());

331     }

332

333     /**

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

335      * что и заданный объект SerialDate.

336      *

337      * @param other  дата для сравнения.

338      *

339      * @return true, если текущий объект SerialDate представляет

340      *         ту же дату, что и заданный объект SerialDate.

341      */

342     public boolean isOnOrBefore(final SerialDate other) {

343         return (this.serial <= other.toSerial());

344     }

345

346     /**

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

348      * что и заданный объект SerialDate.

349      *

350      * @param other  дата для сравнения.

351      *

352      * @return true, если текущий объект SerialDate представляет

353      *         ту же дату, что и заданный объект SerialDate.

354      */

355     public boolean isAfter(final SerialDate other) {

356         return (this.serial > other.toSerial());

357     }

358

359     /**

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

361      * что и заданный объект SerialDate.

362      *

363      * @param other  дата для сравнения.

364      *

365      * @return true, если текущий объект SerialDate представляет

366      *          ту же дату, что и заданный объект SerialDate.

367      */

368     public boolean isOnOrAfter(final SerialDate other) {

369         return (this.serial >= other.toSerial());

370     }

371

372     /**

373      * Возвращает true, если текущий объект {@link SerialDate}

          принадлежит

374      * заданному диапазону (режим INCLUSIVE).  Порядок дат d1 и d2

375      * не важен.

376      *

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

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() {

448

449         // Вычислить год по порядковому номеру

450         final int days = this.serial - SERIAL_LOWER_BOUND;

451         // Переоценка из-за проигнорированных високосных дней.

452         final int overestimatedYYYY = 1900 + (days / 365);