Главная страница

Создание, анализ ирефакторинг


Скачать 3.16 Mb.
НазваниеСоздание, анализ ирефакторинг
Дата29.09.2022
Размер3.16 Mb.
Формат файлаpdf
Имя файлаChistyj_kod_-_Sozdanie_analiz_i_refaktoring_(2013).pdf
ТипКнига
#706087
страница47 из 49
1   ...   41   42   43   44   45   46   47   48   49
433
237 * Возвращает код, представляющий день недели.
238 *
239 * Коды определяются в классе {@link SerialDate} следующим образом:
240 * SUNDAY, MONDAY, TUESDAY,
241 * WEDNESDAY, THURSDAY, FRIDAY и
242 * SATURDAY.
243 *
244 * @return Код, представляющий день недели.
245 */
246 public int getDayOfWeek() {
247 return (this.serial + 6) % 7 + 1;
248 }
249 250 /**
251 * Проверяет равенство текущей даты с другим произвольным объектом.
252 *
253 * Метод возвращает true ТОЛЬКО в том случае, если объект является
254 * экземпляром базового класса {@link SerialDate} и представляет тот же
255 * день, что и {@link SpreadsheetDate}.
256 *
257 * @param object объект для сравнения (допускается null).
258 *
259 * @return Логический признак.
260 */
261 public boolean equals(final Object object) {
262 263 if (object instanceof SerialDate) {
264 final SerialDate s = (SerialDate) object;
265 return (s.toSerial() == this.toSerial());
266 }
267 else {
268 return false;
269 }
270 271 }
272 273 /**
274 * Возвращает хеш-код для экземпляра класса.
275 *
276 * @return хеш-код.
277 */
278 public int hashCode() {
279 return toSerial();
280 }
281 282 /**
283 * Возвращает разность (в днях) между текущей и заданной
284 * 'другой' датой.
285 *
286 * @param other дата для сравнения.
287 *
продолжение
433

434
Приложение Б . org.jfree.date.SerialDate
листинг Б .5 (продолжение)
288 * @return разность (в днях) между текущий и заданной
289 * 'другой' датой.
290 */
291 public int compare(final SerialDate other) {
292 return this.serial - other.toSerial();
293 }
294 295 /**
296 * Реализует метод, необходимый для интерфейса Comparable.
297 *
298 * @param other другой объект (обычно другой объект SerialDate).
299 *
300 * @return отрицательное целое, нуль или положительное целое число,
301 * если объект меньше, равен или больше заданного объекта.
302 */
303 public int compareTo(final Object other) {
304 return compare((SerialDate) other);
305 }
306 307 /**
308 * Возвращает true, если текущий объект SerialDate представляет ту же дату,
309 * что и заданный объект SerialDate.
310 *
311 * @param other дата для сравнения.
312 *
313 * @return true, если текущий объект SerialDate представляет
314 * ту же дату, что и заданный объект SerialDate.
315 */
316 public boolean isOn(final SerialDate other) {
317 return (this.serial == other.toSerial());
318 }
319 320 /**
321 * Возвращает true, если текущий объект SerialDate представляет более раннюю
322 * дату по сравнению с заданным объектом SerialDate.
323 *
324 * @param other дата для сравнения.
325 *
326 * @return true, если текущий объект SerialDate представляет
327 * более раннюю дату по сравнению с заданным объектом SerialDate.
328 */
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 дата для сравнения.
434
org.jfree.date.SerialDate
435
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 принадлежит
продолжение
435

436
Приложение Б . org.jfree.date.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;
436
org.jfree.date.SerialDate
437
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);
453 final int leaps = SerialDate.leapYearCount(overestimatedYYYY);
454 final int nonleapdays = days - leaps;
455 // Недооценка из-за переоцененных лет.
456 int underestimatedYYYY = 1900 + (nonleapdays / 365);
457 458 if (underestimatedYYYY == overestimatedYYYY) {
459 this.year = underestimatedYYYY;
460 }
461 else {
462 int ss1 = calcSerial(1, 1, underestimatedYYYY);
463 while (ss1 <= this.serial) {
464 underestimatedYYYY = underestimatedYYYY + 1;
465 ss1 = calcSerial(1, 1, underestimatedYYYY);
466 }
467 this.year = underestimatedYYYY - 1;
468 }
469 470 final int ss2 = calcSerial(1, 1, this.year);
471 472 int[] daysToEndOfPrecedingMonth
473 = AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH;
474 475 if (isLeapYear(this.year)) {
476 daysToEndOfPrecedingMonth
477 = LEAP_YEAR_AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH;
478 }
479 480 // Получение месяца по порядковому номеру
481 int mm = 1;
482 int sss = ss2 + daysToEndOfPrecedingMonth[mm] - 1;
483 while (sss < this.serial) {
484 mm = mm + 1;
485 sss = ss2 + daysToEndOfPrecedingMonth[mm] - 1;
486 }
487 this.month = mm - 1;
488
продолжение
437

438
Приложение Б . org.jfree.date.SerialDate
листинг Б .5 (продолжение)
489 // Остается d(+1);
490 this.day = this.serial - ss2 491 - daysToEndOfPrecedingMonth[this.month] + 1;
492 493 }
494 495 }
листинг Б .6 . RelativeDayOfWeekRule.java
1 /* ========================================================================
2 * JCommon : библиотека классов общего назначения для платформы Java(tm)
3 * ========================================================================
4 *
5 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
6 *
7 * Информация о проекте: http://www.jfree.org/jcommon/index.html
8 *
9 * Библиотека распространяется бесплатно; вы можете свободно распространять
10 * и/или изменять ее на условиях лицензии Lesser General Public License
11 * в формулировке Free Software Foundation; либо версии 2.1 лицензии, либо
12 * (на ваше усмотрение) любой последующей версии.
13 *
14 * Библиотека распространяется в надежде, что она будет полезна, но
15 * БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, даже без подразумеваемой гарантии ПРИГОДНОСТИ
16 * для КОНКРЕТНОЙ ЦЕЛИ. За подробностями обращайтесь к GNU Lesser General
17 * Public License.
18 *
19 * Вы должны получить копию лицензии GNU Lesser General Public License
20 * с этой библиотекой; если этого не произошло, обратитесь в Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
22 * USA.
23 *
24 * [Java является зарегистрированной торговой маркой Sun Microsystems, Inc.
25 * в Соединенных Штатах и других странах].
26 *
27 * --------------------------
28 * RelativeDayOfWeekRule.java
29 * --------------------------
30 * (C) Copyright 2000-2003, by Object Refinery Limited and Contributors.
31 *
32 * Автор: Дэвид Гилберт (для Object Refinery Limited);
33 * Участники: -;
34 *
35 * $Id: RelativeDayOfWeekRule.java,v 1.6 2005/11/16 15:58:40 taqua Exp $
36 *
37 * Изменения (начиная с 26 октября 2001)
38 * --------------------------
39 * 26-Oct-2001 : Пакет изменен на com.jrefinery.date.*;
40 * 03-Oct-2002 : Исправлены ошибки по информации Checkstyle (DG);
41 *
438
org.jfree.date.SerialDate
439
42 */
43 44 package org.jfree.date;
45 46 /**
47 * Правило ежегодной даты, возвращающее дату для каждого года на основании
48 * (a) эталонного правила; (б) дня недели; и (в) параметра выбора.
49 * (SerialDate.PRECEDING, SerialDate.NEAREST, SerialDate.FOLLOWING).
50 *
51 * Например, Страстная пятница может задаваться как 'пятница, ПРЕДШЕСТВУЮЩАЯ
52 * Пасхе'.
53 *
54 * @author Дэвид Гилберт
55 */
56 public class RelativeDayOfWeekRule extends AnnualDateRule {
57 58 /** Ссылка на правило ежегодной даты, на котором основано данное правило. */
59 private AnnualDateRule subrule;
60 61 /**
62 * День недели (SerialDate.MONDAY, SerialDate.TUESDAY и т.д.).
63 */
64 private int dayOfWeek;
65 66 /** Признак выбора дня недели (PRECEDING, NEAREST или FOLLOWING). */
67 private int relative;
68 69 /**
70 * Конструктор по умолчанию - строит правило для понедельника после
1 января.
71 */
72 public RelativeDayOfWeekRule() {
73 this(new DayAndMonthRule(), SerialDate.MONDAY, SerialDate.FOLLOWING);
74 }
75 76 /**
77 * Стандартный конструктор - строит правило на основании субправила.
78 *
79 * @param subrule правило, определяющее эталонную дату.
80 * @param dayOfWeek день недели по отношению к эталонной дате.
81 * @param relative признак выбора дня недели (preceding, nearest
82 * или following).
83 */
84 public RelativeDayOfWeekRule(final AnnualDateRule subrule,
85 final int dayOfWeek, final int relative) {
86 this.subrule = subrule;
87 this.dayOfWeek = dayOfWeek;
88 this.relative = relative;
89 }
90 91 /**
продолжение
439

440
Приложение Б . org.jfree.date.SerialDate
листинг Б .6 (продолжение)
92 * Возвращает субправило (также называемое эталонным правилом).
93 *
94 * @return Правило ежегодной даты, определяющее эталонную дату
95 * для текущего правила.
96 */
97 public AnnualDateRule getSubrule() {
98 return this.subrule;
99 }
100 101 /**
102 * Назначает субправило.
103 *
104 * @param subrule Правило ежегодной даты, определяющее эталонную дату
105 * для текущего правила.
106 */
107 public void setSubrule(final AnnualDateRule subrule) {
108 this.subrule = subrule;
109 }
110 111 /**
112 * Возвращает день недели для текущего правила.
113 *
114 * @return день недели для текущего правила.
115 */
116 public int getDayOfWeek() {
117 return this.dayOfWeek;
118 }
119 120 /**
121 * Назначает день недели для текущего правила.
122 *
123 * @param dayOfWeek день недели (SerialDate.MONDAY,
124 * SerialDate.TUESDAY и т.д.).
125 */
126 public void setDayOfWeek(final int dayOfWeek) {
127 this.dayOfWeek = dayOfWeek;
128 }
129 130 /**
131 * Возвращает атрибут ‘relative’, который определяет,
132 * *какой* день недели нас интересует (SerialDate.PRECEDING,
133 * SerialDate.NEAREST или SerialDate.FOLLOWING).
134 *
135 * @return атрибут 'relative'.
136 */
137 public int getRelative() {
138 return this.relative;
139 }
140 141 /**
440
org.jfree.date.SerialDate
441
142 * Задает атрибут 'relative' (SerialDate.PRECEDING, SerialDate.NEAREST,
143 * SerialDate.FOLLOWING).
144 *
145 * @param relative определяет, *какой* день недели выбирается
146 * текущим правилом.
147 */
148 public void setRelative(final int relative) {
149 this.relative = relative;
150 }
151 152 /**
153 * Создает копию текущего правила.
154 *
155 * @return копия текущего правила.
156 *
157 * @throws CloneNotSupportedException this should never happen.
158 */
159 public Object clone() throws CloneNotSupportedException {
160 final RelativeDayOfWeekRule duplicate
161 = (RelativeDayOfWeekRule) super.clone();
162 duplicate.subrule = (AnnualDateRule) duplicate.getSubrule().clone();
163 return duplicate;
164 }
165 166 /**
167 * Возвращает дату, сгенерированную текущим правилом для заданного года.
168 *
169 * @param year год (1900 <= год <= 9999).
170 *
171 * @return дата, сгенерированная правилом для заданного года
172 * (допускается null).
173 */
174 public SerialDate getDate(final int year) {
175 176 // Проверить аргумент...
177 if ((year < SerialDate.MINIMUM_YEAR_SUPPORTED)
178 || (year > SerialDate.MAXIMUM_YEAR_SUPPORTED)) {
179 throw new IllegalArgumentException(
180 "RelativeDayOfWeekRule.getDate(): year outside valid range.");
181 }
182 183 // Вычислить дату...
184 SerialDate result = null;
185 final SerialDate base = this.subrule.getDate(year);
186 187 if (base != null) {
188 switch (this.relative) {
189 case(SerialDate.PRECEDING):
190 result = SerialDate.getPreviousDayOfWeek(this.dayOfWeek,
191 base);
192 break;
продолжение
441

442
Приложение Б . org.jfree.date.SerialDate
листинг Б .6 (продолжение)
193 case(SerialDate.NEAREST):
194 result = SerialDate.getNearestDayOfWeek(this.dayOfWeek,
195 base);
196 break;
197 case(SerialDate.FOLLOWING):
198 result = SerialDate.getFollowingDayOfWeek(this.dayOfWeek,
199 base);
200 break;
201 default:
202 break;
203 }
204 }
205 return result;
206 207 }
208 209 }
листинг Б .7 . DayDate.java (окончательная версия)
1 /* ========================================================================
2 * JCommon : библиотека классов общего назначения для платформы Java(tm)
3 * ========================================================================
4 *
5 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
36 */
37 package org.jfree.date;
38 39 import java.io.Serializable;
40 import java.util.*;
41 42 /**
43 * Абстрактный класс, представляющий неизменяемые даты с точностью
44 * до одного дня. Реализация отображает дату на целое число, представляющее
45 * смещение в днях от фиксированной точки отсчета.
46 *
47 * Почему не использовать java.util.Date? Будем использовать, где это имеет смысл.
48 * Класс java.util.Date бывает *слишком* точным - он представляет момент
49 * времени с точностью до 1/100 секунды (при этом сама дата зависит от часового
50 * пояса). Иногда бывает нужно просто представить конкретный день (скажем,
51 * 21 января 2015), не заботясь о времени суток, часовом поясе и т.д.
52 * Именно для таких ситуаций определяется класс DayDate.
53 *
54 * Для создания экземпляра используется DayDateFactory.makeDate.
55 *
56 * @author Дэвид Гилберт
57 * @author Роберт С. Мартин провел значительную переработку.
58 */
59 60 public abstract class DayDate implements Comparable, Serializable {
61 public abstract int getOrdinalDay();
62 public abstract int getYear();
442
org.jfree.date.SerialDate
1   ...   41   42   43   44   45   46   47   48   49


написать администратору сайта