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

  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     /**


Листинг Б.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     /**

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;


Листинг Б.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 /* ========================================================================