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

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


Скачать 3.16 Mb.
НазваниеСоздание, анализ ирефакторинг
Дата29.09.2022
Размер3.16 Mb.
Формат файлаpdf
Имя файлаChistyj_kod_-_Sozdanie_analiz_i_refaktoring_(2013).pdf
ТипКнига
#706087
страница44 из 49
1   ...   41   42   43   44   45   46   47   48   49
405
739 return SerialDate.createInstance(last, base.getMonth(), base.getYYYY());
740 }
741 742 /**
743 * Возвращает строку, соответствующую коду недели в месяце.
744 *
745 * Необходимо поискать более элегантное решение.
746 *
747 * @param count целочисленный код недели в месяце.
748 *
749 * @return строка, соответствующая коду недели в месяце.
750 */
751 public static String weekInMonthToString(final int count) {
752 753 switch (count) {
754 case SerialDate.FIRST_WEEK_IN_MONTH : return "First";
755 case SerialDate.SECOND_WEEK_IN_MONTH : return "Second";
756 case SerialDate.THIRD_WEEK_IN_MONTH : return "Third";
757 case SerialDate.FOURTH_WEEK_IN_MONTH : return "Fourth";
758 case SerialDate.LAST_WEEK_IN_MONTH : return "Last";
759 default :
760 return "SerialDate.weekInMonthToString(): invalid code.";
761 }
762 763 }
764 765 /**
766 * Возвращает строку, представляющую переданное значение relative.
767 *
768 * Необходимо поискать более элегантное решение.
769 *
770 * @param relative константа, представляющая значение’relative’.
771 *
772 * @return строка, представляющая переданное значение ‘relative’.
773 */
774 public static String relativeToString(final int relative) {
775 776 switch (relative) {
777 case SerialDate.PRECEDING : return "Preceding";
778 case SerialDate.NEAREST : return "Nearest";
779 case SerialDate.FOLLOWING : return "Following";
780 default : return "ERROR : Relative To String";
781 }
782 783 }
784 785 /**
786 * Метод-фабрика, возвращающий экземпляр конкретного субкласса
787 * {@link SerialDate}.
788 *
продолжение
405

406
Приложение Б . org.jfree.date.SerialDate
листинг Б .1 (продолжение)
789 * @param day день (1-31).
790 * @param month месяц (1-12).
791 * @param yyyy год (в диапазоне от 1900 до 9999).
792 *
793 * @return Экземпляр {@link SerialDate}.
794 */
795 public static SerialDate createInstance(final int day, final int month,
796 final int yyyy) {
797 return new SpreadsheetDate(day, month, yyyy);
798 }
799 800 /**
801 * Метод-фабрика, возвращающий экземпляр конкретного субкласса
802 * {@link SerialDate}.
803 *
804 * @param serial порядковый номер дня (1 января 1900 = 2).
805 *
806 * @return экземпляр SerialDate.
807 */
808 public static SerialDate createInstance(final int serial) {
809 return new SpreadsheetDate(serial);
810 }
811 812 /**
813 * Метод-фабрика, возвращающий экземпляр субкласса SerialDate.
814 *
815 * @param date объект даты Java.
816 *
817 * @return экземпляр SerialDate.
818 */
819 public static SerialDate createInstance(final java.util.Date date) {
820 821 final GregorianCalendar calendar = new GregorianCalendar();
822 calendar.setTime(date);
823 return new SpreadsheetDate(calendar.get(Calendar.DATE),
824 calendar.get(Calendar.MONTH) + 1,
825 calendar.get(Calendar.YEAR));
826 827 }
828 829 /**
830 * Возвращает порядковый номер для даты, где 1 January 1900 = 2 (что почти
831 * соответствует системе нумерации, используемой в Microsoft Excel for
832 * Windows и Lotus 1-2-3).
833 *
834 * @return порядковый номер даты.
835 */
836 public abstract int toSerial();
837 838 /**
406
org.jfree.date.SerialDate
407
839 * Возвращает java.util.Date. Поскольку java.util.Date превосходит SerialDate
840 * по точности, необходимо определить схему выбора ‘времени суток’.
841 *
842 * @return текущий объект в виде java.util.Date.
843 */
844 public abstract java.util.Date toDate();
845 846 /**
847 * Возвращает описание даты.
848 *
849 * @return описание даты.
850 */
851 public String getDescription() {
852 return this.description;
853 }
854 855 /**
856 * Задает описание даты.
857 *
858 * @param description новое описание даты.
859 */
860 public void setDescription(final String description) {
861 this.description = description;
862 }
863 864 /**
865 * Преобразует дату в строку.
866 *
867 * @return строковое представление даты.
868 */
869 public String toString() {
870 return getDayOfMonth() + "-" + SerialDate.monthCodeToString(getMonth())
871 + "-" + getYYYY();
872 }
873 874 /**
875 * Возвращает год (в действительном диапазоне от 1900 до 9999).
876 *
877 * @return год.
878 */
879 public abstract int getYYYY();
880 881 /**
882 * Возвращает месяц (январь = 1, февраль = 2, март = 3).
883 *
884 * @return месяц.
885 */
886 public abstract int getMonth();
887 888 /**
продолжение
407

408
Приложение Б . org.jfree.date.SerialDate
листинг Б .1 (продолжение)
889 * Возвращает день месяца.
890 *
891 * @return день месяца.
892 */
893 public abstract int getDayOfMonth();
894 895 /**
896 * Возвращает день недели.
897 *
898 * @return день недели.
899 */
900 public abstract int getDayOfWeek();
901 902 /**
903 * Возвращает разность (в днях) между текущей и заданной
904 * 'другой' датой.
905 *
906 * Результат положительный, если текущая дата следует после 'другой',
907 * или отрицателен, если текущая дата предшествует 'другой'.
908 *
909 * @param other дата для сравнения.
910 *
911 * @return разность между текущей и другой датой.
912 */
913 public abstract int compare(SerialDate other);
914 915 /**
916 * Возвращает true, если текущий объект SerialDate представляет ту же дату,
917 * что и заданный объект SerialDate.
918 *
919 * @param other дата для сравнения.
920 *
921 * @return true, если текущий объект SerialDate представляет
922 * ту же дату, что и заданный объект SerialDate.
923 */
924 public abstract boolean isOn(SerialDate other);
925 926 /**
927 * Возвращает true, если текущий объект SerialDate представляет более раннюю
928 * дату по сравнению с заданным объектом SerialDate.
929 *
930 * @param other дата для сравнения.
931 *
932 * @return true, если текущий объект SerialDate представляет
933 * более раннюю дату по сравнению с заданным объектом SerialDate.
934 */
935 public abstract boolean isBefore(SerialDate other);
936 937 /**
938 * Возвращает true, если текущий объект SerialDate представляет ту же
408
org.jfree.date.SerialDate
409
939 * дату, что и заданный объект SerialDate.
940 *
941 * @param other дата для сравнения.
942 *
943 * @return true, если текущий объект SerialDate представляет
944 * ту же дату, что и заданный объект SerialDate.
945 */
946 public abstract boolean isOnOrBefore(SerialDate other);
947 948 /**
949 * Возвращает true, если текущий объект SerialDate представляет ту же
950 * дату, что и заданный объект SerialDate.
951 *
952 * @param other дата для сравнения.
953 *
954 * @return true, если текущий объект SerialDate представляет
955 * ту же дату, что и заданный объект SerialDate.
956 */
957 public abstract boolean isAfter(SerialDate other);
958 959 /**
960 * Возвращает true, если текущий объект SerialDate представляет ту же
961 * дату, что и заданный объект SerialDate.
962 *
963 * @param other дата для сравнения.
964 *
965 * @return true, если текущий объект SerialDate представляет
966 * ту же дату, что и заданный объект SerialDate.
967 */
968 public abstract boolean isOnOrAfter(SerialDate other);
969 970 /**
971 * Возвращает true, если текущий {@link SerialDate} принадлежит
972 * заданному диапазону (режим INCLUSIVE). Порядок дат d1 и d2 973 * не важен.
974 *
975 * @param d1 граничная дата диапазона.
976 * @param d2 другая граничная дата диапазона.
977 *
978 * @return Логический признак.
979 */
980 public abstract boolean isInRange(SerialDate d1, SerialDate d2);
981 982 /**
983 * Возвращает true если текущий {@link SerialDate} принадлежит
984 * заданному диапазону (включение границ указывается при вызове). Порядок
985 * дат d1 и d2 не важен.
986 *
987 * @param d1 граничная дата диапазона.
988 * @param d2 другая граничная дата диапазона.
продолжение
409

410
Приложение Б . org.jfree.date.SerialDate
листинг Б .1 (продолжение)
989 * @param include код, управляющий включением начальной и конечной дат
990 * в диапазон.
991 *
992 * @return Логический признак.
993 */
994 public abstract boolean isInRange(SerialDate d1, SerialDate d2,
995 int include);
996 997 /**
998 * Возвращает последнюю дату, приходящуюся на заданный день недели,
999 * ПРЕДШЕСТВУЮЩУЮ текущей дате.
1000 *
1001 * @param targetDOW код дня недели.
1002 *
1003 * @return последняя дата, приходящаяся на заданный день недели,
1004 * ПРЕДШЕСТВУЮЩАЯ текущей дате.
1005 */
1006 public SerialDate getPreviousDayOfWeek(final int targetDOW) {
1007 return getPreviousDayOfWeek(targetDOW, this);
1008 }
1009 1010 /**
1011 * Возвращает самую раннюю дату, приходящуюся на заданный день недели,
1012 * ПОСЛЕ текущей даты.
1013 *
1014 * @param targetDOW код дня недели.
1015 *
1016 * @return самая ранняя дата, приходящаяся на заданный день недели
1017 * ПОСЛЕ текущей даты.
1018 */
1019 public SerialDate getFollowingDayOfWeek(final int targetDOW) {
1020 return getFollowingDayOfWeek(targetDOW, this);
1021 }
1022 1023 /**
1024 * Возвращает ближайшую дату, приходящуюся на заданный день недели,
1025 *
1026 * @param targetDOW код дня недели.
1027 *
1028 * @return ближайшая дата, приходящаяся на заданный день недели,
1029 */
1030 public SerialDate getNearestDayOfWeek(final int targetDOW) {
1031 return getNearestDayOfWeek(targetDOW, this);
1032 }
1033 1034 }
410
org.jfree.date.SerialDate
411
листинг Б .2 . SerialDateTest.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 * SerialDateTests.java
29 * --------------------
30 * (C) Copyright 2001-2005, by Object Refinery Limited.
31 *
32 * Автор: Дэвид Гилберт (для Object Refinery Limited);
33 * Участники: -;
34 *
35 * $Id: SerialDateTests.java,v 1.6 2005/11/16 15:58:40 taqua Exp $
36 *
37 * Изменения
38 * --------------------------
39 * 15.12.2001 : Версия 1 (DG);
40 * 25.06.2002 : Удаление лишнего импорта (DG);
41 * 24.10.2002 : Исправление ошибок по информации Checkstyle (DG);
42 * 13.03.2003 : Добавление теста сериализации (DG);
43 * 05.01.2005 : Добавление теста для ошибки по отчету 1096282 (DG);
44 *
45 */
46 47 package org.jfree.date.junit;
48 49 import java.io.ByteArrayInputStream;
50 import java.io.ByteArrayOutputStream;
продолжение
411

412
Приложение Б . org.jfree.date.SerialDate
листинг Б .2 (продолжение)
51 import java.io.ObjectInput;
52 import java.io.ObjectInputStream;
53 import java.io.ObjectOutput;
54 import java.io.ObjectOutputStream;
55 56 import junit.framework.Test;
57 import junit.framework.TestCase;
58 import junit.framework.TestSuite;
59 60 import org.jfree.date.MonthConstants;
61 import org.jfree.date.SerialDate;
62 63 /**
64 * Тесты JUnit для класса {@link SerialDate}.
65 */
66 public class SerialDateTests extends TestCase {
67 68 /** Дата, представляющая 9 ноября. */
69 private SerialDate nov9Y2001;
70 71 /**
72 * Создает новый тестовый сценарий.
73 *
74 * @param name the name.
75 */
76 public SerialDateTests(final String name) {
77 super(name);
78 }
79 80 /**
81 * Возвращает пакет тестов для системы запуска тестов JUnit.
82 *
83 * @return тестовый пакет.
84 */
85 public static Test suite() {
86 return new TestSuite(SerialDateTests.class);
87 }
88 89 /**
90 * Подготовка задачи.
91 */
92 protected void setUp() {
93 this.nov9Y2001 = SerialDate.createInstance(9, MonthConstants.NOVEMBER, 2001);
94 }
95 96 /**
97 * 9 ноября 2001 + 2 месяца = должно быть 9 января 2002.
98 */
99 public void testAddMonthsTo9Nov2001() {
100 final SerialDate jan9Y2002 = SerialDate.addMonths(2, this.nov9Y2001);
101 final SerialDate answer = SerialDate.createInstance(9, 1, 2002);
412
org.jfree.date.SerialDate
413
102 assertEquals(answer, jan9Y2002);
103 }
104 105 /**
106 * Тестовый сценарий для известной ошибки (исправлено).
107 */
108 public void testAddMonthsTo5Oct2003() {
109 final SerialDate d1 = SerialDate.createInstance(5, MonthConstants.OCTOBER,
2003);
110 final SerialDate d2 = SerialDate.addMonths(2, d1);
111 assertEquals(d2, SerialDate.createInstance(5, MonthConstants.DECEMBER,
2003));
112 }
113 114 /**
115 * Тестовый сценарий для известной ошибки (исправлено).
116 */
117 public void testAddMonthsTo1Jan2003() {
118 final SerialDate d1 = SerialDate.createInstance(1, MonthConstants.JANUARY,
2003);
119 final SerialDate d2 = SerialDate.addMonths(0, d1);
120 assertEquals(d2, d1);
121 }
122 123 /**
124 * Понедельник, предшествующий 9 ноября 2001, - должно быть 5 ноября.
125 */
126 public void testMondayPrecedingFriday9Nov2001() {
127 SerialDate mondayBefore = SerialDate.getPreviousDayOfWeek(
128 SerialDate.MONDAY, this.nov9Y2001 129 );
130 assertEquals(5, mondayBefore.getDayOfMonth());
131 }
132 133 /**
134 * Понедельник, следующий за 9 ноября 2001, - должно быть 12 ноября.
135 */
136 public void testMondayFollowingFriday9Nov2001() {
137 SerialDate mondayAfter = SerialDate.getFollowingDayOfWeek(
138 SerialDate.MONDAY, this.nov9Y2001 139 );
140 assertEquals(12, mondayAfter.getDayOfMonth());
141 }
142 143 /**
144 * Понедельник, ближайший к 9 ноября 2001, - должно быть 12 ноября.
145 */
146 public void testMondayNearestFriday9Nov2001() {
147 SerialDate mondayNearest = SerialDate.getNearestDayOfWeek(
148 SerialDate.MONDAY, this.nov9Y2001 149 );
150 assertEquals(12, mondayNearest.getDayOfMonth());
продолжение
413

414
Приложение Б . org.jfree.date.SerialDate
листинг Б .2 (продолжение)x
151 }
152 153 /**
154 * Понедельник, ближайший к 22 января 1970, - должно быть 19-е января.
155 */
156 public void testMondayNearest22Jan1970() {
157 SerialDate jan22Y1970 = SerialDate.createInstance(22, MonthConstants.JANUARY,
1970);
158 SerialDate mondayNearest=SerialDate.getNearestDayOfWeek(SerialDate.MONDAY, jan22Y1970);
159 assertEquals(19, mondayNearest.getDayOfMonth());
160 }
161 162 /**
163 * Проверяет преобразование дней в строки. На самом деле результат
164 * зависит от локального контекста, так что тест следует изменить.
165 */
166 public void testWeekdayCodeToString() {
167 168 final String test = SerialDate.weekdayCodeToString(SerialDate.SATURDAY);
169 assertEquals("Saturday", test);
170 171 }
172 173 /**
174 * Проверяет преобразование строки в день недели. Если в локальном контексте
175 * не используются английские названия дней недели, тест не пройдет (улучшить)!
176 */
177 public void testStringToWeekday() {
178 179 int weekday = SerialDate.stringToWeekdayCode("Wednesday");
180 assertEquals(SerialDate.WEDNESDAY, weekday);
181 182 weekday = SerialDate.stringToWeekdayCode(" Wednesday ");
183 assertEquals(SerialDate.WEDNESDAY, weekday);
184 185 weekday = SerialDate.stringToWeekdayCode("Wed");
186 assertEquals(SerialDate.WEDNESDAY, weekday);
187 188 }
189 190 /**
191 * Проверяет преобразование строки в месяц. Если в локальном контексте
192 * не используются английские названия месяцев, тест не пройдет (улучшить)!
193 */
194 public void testStringToMonthCode() {
195 196 int m = SerialDate.stringToMonthCode("January");
197 assertEquals(MonthConstants.JANUARY, m);
198 199 m = SerialDate.stringToMonthCode(" January ");
414
org.jfree.date.SerialDate
415
200 assertEquals(MonthConstants.JANUARY, m);
201 202 m = SerialDate.stringToMonthCode("Jan");
203 assertEquals(MonthConstants.JANUARY, m);
204 205 }
206 207 /**
208 * Проверяет преобразование кода месяца в строку.
209 */
210 public void testMonthCodeToStringCode() {
211 212 final String test = SerialDate.monthCodeToString(MonthConstants.DECEMBER);
213 assertEquals("December", test);
214 215 }
216 217 /**
218 * Год 1900 не является високосным.
219 */
220 public void testIsNotLeapYear1900() {
221 assertTrue(!SerialDate.isLeapYear(1900));
222 }
223 224 /**
225 * Год 2000 - високосный.
226 */
227 public void testIsLeapYear2000() {
228 assertTrue(SerialDate.isLeapYear(2000));
229 }
230 231 /**
232 * Количество високосных годов с 1900 до 1899 включительно равно 0.
233 */
234 public void testLeapYearCount1899() {
235 assertEquals(SerialDate.leapYearCount(1899), 0);
236 }
237 238 /**
239 * Количество високосных годов с 1900 до 1903 включительно равно 0.
240 */
241 public void testLeapYearCount1903() {
242 assertEquals(SerialDate.leapYearCount(1903), 0);
243 }
244 245 /**
246 * Количество високосных годов с 1900 до 1904 включительно равно 1.
247 */
248 public void testLeapYearCount1904() {
249 assertEquals(SerialDate.leapYearCount(1904), 1);
250 }
251 252 /**
продолжение
415

1   ...   41   42   43   44   45   46   47   48   49


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