| | 1 | '''2013年10月11日和2013年10月18日代码道场活动纪实'''[[BR]] |
| | 2 | '''代码道场的参与者:'''李峰,秦鸿源,张艺辉,陈阳,丁健勇,李炳岳,黄志强,李剑文,江毅超,刘必晓[[BR]] |
| | 3 | '''地点:'''4G会议室[[BR]] |
| | 4 | 本期代码道场题目,依旧是上期代码题目,因为上期重构的方法,我们还可以重构得更好,并且有了上两期讨论的积累,对本期代码[[BR]] |
| | 5 | 道场活动也起到一定的作用。[[BR]] |
| | 6 | 上一期的代码道场活动的代码:[wiki:codekata/refactor2 2013-10-04 Functions类htmlUrl方法重构2 活动][[BR]] |
| | 7 | 这次我们是整组人一起讨论如何更好地重构htmlUrl方法,每个人都会提出自己的观点,想法以及给大家分析为什么要这样重构方法。[[BR]] |
| | 8 | 当然,让我们先来看下代码[[BR]] |
| | 9 | |
| | 10 | ''版块对象'' |
| | 11 | [[BR]] |
| | 12 | |
| | 13 | {{{ |
| | 14 | /** |
| | 15 | * 版块对象 |
| | 16 | */ |
| | 17 | public class Forum { |
| | 18 | private long fid; |
| | 19 | |
| | 20 | public long getFid() { |
| | 21 | return fid; |
| | 22 | } |
| | 23 | |
| | 24 | public void setFid(long fid) { |
| | 25 | this.fid = fid; |
| | 26 | } |
| | 27 | |
| | 28 | public String getRedirectUrl(){ |
| | 29 | return ""; |
| | 30 | } |
| | 31 | } |
| | 32 | }}} |
| | 33 | |
| | 34 | ''发帖''[[BR]] |
| | 35 | |
| | 36 | {{{ |
| | 37 | public class Post { |
| | 38 | public long getPid(){ |
| | 39 | return 2424242; |
| | 40 | } |
| | 41 | public long getTid(){ |
| | 42 | return 789789; |
| | 43 | } |
| | 44 | |
| | 45 | } |
| | 46 | }}} |
| | 47 | |
| | 48 | ''帖子''[[BR]] |
| | 49 | |
| | 50 | {{{ |
| | 51 | public class Topic { |
| | 52 | public long getTid(){ |
| | 53 | return 1342; |
| | 54 | } |
| | 55 | } |
| | 56 | }}} |
| | 57 | |
| | 58 | ''用户''[[BR]] |
| | 59 | |
| | 60 | {{{ |
| | 61 | public class User { |
| | 62 | public long getUid(){ |
| | 63 | return 2424; |
| | 64 | } |
| | 65 | } |
| | 66 | }}} |
| | 67 | |
| | 68 | 当然了,这个时候就少不了测试类了[[BR]] |
| | 69 | |
| | 70 | {{{ |
| | 71 | import junit.framework.Assert; |
| | 72 | |
| | 73 | import org.junit.Before; |
| | 74 | import org.junit.Ignore; |
| | 75 | import org.junit.Test; |
| | 76 | |
| | 77 | public class FunctionsTest { |
| | 78 | |
| | 79 | private String appName = null; |
| | 80 | private String itAppName = null; |
| | 81 | private String rootUrl = null; |
| | 82 | private String ucRoot = null; |
| | 83 | private Topic topic = null; |
| | 84 | private Forum forum = null; |
| | 85 | private Post post = null; |
| | 86 | private User user = null; |
| | 87 | |
| | 88 | @Before |
| | 89 | public void setUp() { |
| | 90 | appName = "pcauto"; |
| | 91 | itAppName = "itbbs"; |
| | 92 | rootUrl = "http://bbs.pcauto.com.cn"; |
| | 93 | ucRoot = "http://my.pcauto.com.cn"; |
| | 94 | topic = new Topic(); |
| | 95 | forum = new Forum(); |
| | 96 | post = new Post(); |
| | 97 | user = new User(); |
| | 98 | forum.setFid(123L); |
| | 99 | } |
| | 100 | |
| | 101 | @Ignore |
| | 102 | public void testHtmlUrl() { |
| | 103 | // 变化的对象 Object,rootUrl,appName, |
| | 104 | // Object是变化的,rootUrl,appName=auto 是固定的 |
| | 105 | Assert.assertEquals(rootUrl + "/topic-1342.html", |
| | 106 | Functions.htmlUrl(topic)); |
| | 107 | Assert.assertEquals(rootUrl + "/404.html", |
| | 108 | Functions.htmlUrl((Topic) null)); |
| | 109 | Assert.assertEquals(rootUrl + "/forum-123.html", |
| | 110 | Functions.htmlUrl(forum)); |
| | 111 | Assert.assertEquals(rootUrl + "/post-789789_2424242.html", |
| | 112 | Functions.htmlUrl(post)); |
| | 113 | Assert.assertEquals(ucRoot + "/2424", |
| | 114 | Functions.htmlUrl(user)); |
| | 115 | Assert.assertEquals("1234567", |
| | 116 | Functions.htmlUrl("1234567")); |
| | 117 | |
| | 118 | } |
| | 119 | |
| | 120 | @Test |
| | 121 | public void testHtmlUrlForum() { |
| | 122 | Assert.assertEquals(rootUrl + "/forum-123.html", |
| | 123 | Functions.htmlUrl(forum)); |
| | 124 | |
| | 125 | // Assert.assertEquals(rootUrl + "/f123.html", |
| | 126 | // Functions.htmlUrl(forum, rootUrl, itAppName)); |
| | 127 | |
| | 128 | Assert.assertEquals(rootUrl + "/404.html", |
| | 129 | Functions.htmlUrl((Forum) null)); |
| | 130 | |
| | 131 | } |
| | 132 | |
| | 133 | @Test |
| | 134 | public void testHtmlUrlTopic() { |
| | 135 | Assert.assertEquals(rootUrl + "/topic-1342.html", |
| | 136 | Functions.htmlUrl(topic)); |
| | 137 | |
| | 138 | // Assert.assertEquals(rootUrl + "/1342.html", |
| | 139 | // Functions.htmlUrl(topic, rootUrl, itAppName)); |
| | 140 | |
| | 141 | Assert.assertEquals(rootUrl + "/404.html", |
| | 142 | Functions.htmlUrl((Topic) null)); |
| | 143 | } |
| | 144 | |
| | 145 | @Test |
| | 146 | public void testHtmlUrlUser() { |
| | 147 | Assert.assertEquals(ucRoot + "/2424/", |
| | 148 | Functions.htmlUrl(user)); |
| | 149 | |
| | 150 | // Assert.assertEquals(rootUrl + "/123.html", |
| | 151 | // Functions.htmlUrl(user, ucRoot, itAppName)); |
| | 152 | |
| | 153 | Assert.assertEquals(rootUrl + "/404.html", |
| | 154 | Functions.htmlUrl((User) null)); |
| | 155 | } |
| | 156 | |
| | 157 | @Test |
| | 158 | public void testHtmlUrlPost() { |
| | 159 | Assert.assertEquals(rootUrl + "/post-789789_2424242.html", |
| | 160 | Functions.htmlUrl(post)); |
| | 161 | |
| | 162 | // Assert.assertEquals(rootUrl + "/p789789_2424242.html", |
| | 163 | // Functions.htmlUrl(post, rootUrl, itAppName)); |
| | 164 | |
| | 165 | Assert.assertEquals(rootUrl + "/404.html", |
| | 166 | Functions.htmlUrl((Post) null)); |
| | 167 | } |
| | 168 | |
| | 169 | @Test |
| | 170 | public void testHtmlUrlString() { |
| | 171 | Assert.assertEquals("123456", |
| | 172 | Functions.htmlUrl("123456")); |
| | 173 | |
| | 174 | // Assert.assertEquals("123456", |
| | 175 | // Functions.htmlUrl("123456", rootUrl, itAppName)); |
| | 176 | |
| | 177 | Assert.assertEquals(rootUrl + "/404.html", |
| | 178 | Functions.htmlUrl((String) null)); |
| | 179 | } |
| | 180 | |
| | 181 | |
| | 182 | |
| | 183 | |
| | 184 | |
| | 185 | } |
| | 186 | }}} |
| | 187 | |
| | 188 | 好不容易啊,终于可以写实现方法了。其实同事们都是喜欢写实现方法多于写测试方法的,但工作不是喜欢就行得了,[[BR]] |
| | 189 | 还要考虑很多因素,最根本的,写出来的实现方法必须得通过严格的测试,并且提交代码之前,我们也得测试代码,[[BR]] |
| | 190 | 从而促使我们使用测试驱动开发的方法进行开发。闲话也少说了,下面看下实现代码吧[[BR]] |
| | 191 | |
| | 192 | {{{ |
| | 193 | import java.text.MessageFormat; |
| | 194 | |
| | 195 | public class Functions{ |
| | 196 | private static String rootUrl = "http://bbs.pcauto.com.cn"; |
| | 197 | private static String appName = "pcauto"; |
| | 198 | /** |
| | 199 | * |
| | 200 | * 将页面链接静态化(wap),目前只支持Forum,Topic,Post,User对象,其他的如果是字符串则返回原字符串 |
| | 201 | * <br/>修改些方法的规则的同时也要修改parserUrl方法 |
| | 202 | * tid等于{4018911,4027940, 4040395}销售配合,此帖子跳转到指定链接 |
| | 203 | * |
| | 204 | * @param object |
| | 205 | * |
| | 206 | * |
| | 207 | * @param type 1:web, 2:wap |
| | 208 | * @return |
| | 209 | */ |
| | 210 | public static String htmlUrl(Object object, int type) { |
| | 211 | boolean isIt = false; |
| | 212 | if (isIt && type != SystemConstant.TYPE_WAP ) { |
| | 213 | return ""; |
| | 214 | } else { |
| | 215 | |
| | 216 | switch (type) { |
| | 217 | case SystemConstant.TYPE_WEB: |
| | 218 | rootUrl = rootUrl; |
| | 219 | break; |
| | 220 | case SystemConstant.TYPE_WAP: |
| | 221 | rootUrl = rootUrl; |
| | 222 | break; |
| | 223 | default: |
| | 224 | break; |
| | 225 | } |
| | 226 | |
| | 227 | if ("".equals(rootUrl) || rootUrl == null) { |
| | 228 | return ""; |
| | 229 | } |
| | 230 | |
| | 231 | if (object instanceof Forum) { |
| | 232 | Forum forum = (Forum) object; |
| | 233 | if (!isEmpty(forum.getRedirectUrl()) && SystemConstant.TYPE_WEB == type) { |
| | 234 | return forum.getRedirectUrl(); |
| | 235 | } else { |
| | 236 | return rootUrl + "/forum-" + forum.getFid() + ".html"; |
| | 237 | } |
| | 238 | } else if (object instanceof Topic) { |
| | 239 | //销售配合,此帖子跳转到指定链接 |
| | 240 | if(SystemConstant.AUTO_APP_NAME.equals(appName) && ((Topic) object).getTid() == 4018911){ |
| | 241 | return "http://ad.doubleclick.net/clk;275446626;102403463;a?http://bbs.pcauto.com.cn/topic-4018911.html"; |
| | 242 | } |
| | 243 | if(SystemConstant.AUTO_APP_NAME.equals(appName) && ((Topic) object).getTid() == 4027940){ |
| | 244 | return "http://ad.doubleclick.net/clk;275446638;102403466;g?http://bbs.pcauto.com.cn/topic-4027940.html"; |
| | 245 | } |
| | 246 | if(SystemConstant.AUTO_APP_NAME.equals(appName) && ((Topic) object).getTid() == 4040395){ |
| | 247 | return "http://ad.doubleclick.net/clk;275446642;102403468;d?http://bbs.pcauto.com.cn/topic-4040395.html"; |
| | 248 | } |
| | 249 | return rootUrl + "/topic-" + ((Topic) object).getTid() + ".html"; |
| | 250 | } else if (object instanceof Post) { |
| | 251 | return rootUrl + "/post-" + ((Post) object).getTid() + '_' + ((Post) object).getPid() + ".html"; |
| | 252 | } else if (object instanceof String) { |
| | 253 | return (String) object; |
| | 254 | } else if (object instanceof User) { |
| | 255 | return "/" + ((User) object).getUid(); |
| | 256 | } else if (object instanceof ftree.Forum) { |
| | 257 | ftree.Forum forum = (ftree.Forum) object; |
| | 258 | return rootUrl + "/forum-" + forum.getFid() + ".html"; |
| | 259 | } else { |
| | 260 | return ""; |
| | 261 | } |
| | 262 | } |
| | 263 | } |
| | 264 | |
| | 265 | public static boolean isEmpty(String text){ |
| | 266 | return (null == text || "".equals(text)); |
| | 267 | } |
| | 268 | |
| | 269 | |
| | 270 | /** |
| | 271 | * 板块URL静态化 |
| | 272 | * @param forum 板块 |
| | 273 | * @param rootUrl 应用路径 |
| | 274 | * @param appName |
| | 275 | * @return |
| | 276 | */ |
| | 277 | public static String htmlUrl(Forum forum) { |
| | 278 | if (forum == null) { |
| | 279 | return Tpl.NOT_FOUND_URL; |
| | 280 | } |
| | 281 | // if ("itbbs".equals(appName)) { |
| | 282 | // return rootUrl + "/f" + forum.getFid() + ".html"; |
| | 283 | // } else { |
| | 284 | // return rootUrl + "/forum-" + forum.getFid() + ".html"; |
| | 285 | // } |
| | 286 | |
| | 287 | return MessageFormat.format(Tpl.FORUM_URL, String.valueOf(forum.getFid())); |
| | 288 | |
| | 289 | } |
| | 290 | |
| | 291 | /** |
| | 292 | * 主题URL静态化 |
| | 293 | * @param topic 主题 |
| | 294 | * @param rootUrl 应用路径 |
| | 295 | * @param appName |
| | 296 | * @return |
| | 297 | */ |
| | 298 | public static String htmlUrl(Topic topic) { |
| | 299 | if (topic == null) { |
| | 300 | return Tpl.NOT_FOUND_URL; |
| | 301 | } |
| | 302 | // if ("itbbs".equals(appName)) { |
| | 303 | // return rootUrl + "/" + topic.getTid() + ".html"; |
| | 304 | // } else { |
| | 305 | // return rootUrl + "/topic-" + topic.getTid() + ".html"; |
| | 306 | // } |
| | 307 | |
| | 308 | return MessageFormat.format(Tpl.TOPIC_URL, String.valueOf(topic.getTid())); |
| | 309 | |
| | 310 | |
| | 311 | |
| | 312 | } |
| | 313 | |
| | 314 | |
| | 315 | /** |
| | 316 | * 帖子URL静态化 |
| | 317 | * @param post 帖子 |
| | 318 | * @param rootUrl 应用路径 |
| | 319 | * @param appName |
| | 320 | * @return |
| | 321 | */ |
| | 322 | |
| | 323 | public static String htmlUrl(Post post) { |
| | 324 | |
| | 325 | if (post == null) { |
| | 326 | return Tpl.NOT_FOUND_URL; |
| | 327 | } |
| | 328 | String pid = String.valueOf(post.getPid()); |
| | 329 | String tid = String.valueOf(post.getTid()); |
| | 330 | return MessageFormat.format(Tpl.POST_URL, new Object[]{tid, pid}); |
| | 331 | } |
| | 332 | |
| | 333 | |
| | 334 | /** |
| | 335 | * 用户URL静态化 |
| | 336 | * @param post 帖子 |
| | 337 | * @param rootUrl 应用路径 |
| | 338 | * @param appName |
| | 339 | * @return |
| | 340 | */ |
| | 341 | public static String htmlUrl(User user) { |
| | 342 | if (user == null) { |
| | 343 | return Tpl.NOT_FOUND_URL; |
| | 344 | } |
| | 345 | return MessageFormat.format(Tpl.USER_URL, String.valueOf(user.getUid())); |
| | 346 | } |
| | 347 | |
| | 348 | /** |
| | 349 | * URL静态化 |
| | 350 | * @param str string |
| | 351 | * @param rootUrl 应用路径 |
| | 352 | * @param appName |
| | 353 | * @return |
| | 354 | */ |
| | 355 | public static String htmlUrl(String str) { |
| | 356 | if (str == null) { |
| | 357 | return Tpl.NOT_FOUND_URL; |
| | 358 | } |
| | 359 | return str; |
| | 360 | } |
| | 361 | |
| | 362 | /** |
| | 363 | * wap版版块URL静态化 |
| | 364 | * @param forum 版块 |
| | 365 | * @param rootUrl 应用路径 |
| | 366 | * @param appName |
| | 367 | * @return |
| | 368 | */ |
| | 369 | public static String htmlUrl4Wap(Forum forum) { |
| | 370 | |
| | 371 | return ""; |
| | 372 | } |
| | 373 | |
| | 374 | /** |
| | 375 | * wap版帖子URL静态化 |
| | 376 | * @param post 帖子 |
| | 377 | * @param rootUrl 应用路径 |
| | 378 | * @param appName |
| | 379 | * @return |
| | 380 | */ |
| | 381 | public static String htmlUrl4Wap(Post post) { |
| | 382 | |
| | 383 | return ""; |
| | 384 | } |
| | 385 | |
| | 386 | /** |
| | 387 | * wap版主题URL静态化 |
| | 388 | * @param topic 主题 |
| | 389 | * @param rootUrl 应用路径 |
| | 390 | * @param appName |
| | 391 | * @return |
| | 392 | */ |
| | 393 | public static String htmlUrl4Wap(Topic topic) { |
| | 394 | |
| | 395 | return ""; |
| | 396 | } |
| | 397 | |
| | 398 | /** |
| | 399 | * wap版字符串URL静态化 |
| | 400 | * @param str string |
| | 401 | * @param rootUrl 应用路径 |
| | 402 | * @param appName |
| | 403 | * @return |
| | 404 | */ |
| | 405 | public static String htmlUrl4Wap(String str) { |
| | 406 | |
| | 407 | return ""; |
| | 408 | } |
| | 409 | |
| | 410 | /** |
| | 411 | * wap版用户URL静态化 |
| | 412 | * @param user 用户 |
| | 413 | * @param rootUrl 应用路径 |
| | 414 | * @param appName |
| | 415 | * @return |
| | 416 | */ |
| | 417 | public static String htmlUrl4Wap(User user) { |
| | 418 | |
| | 419 | return ""; |
| | 420 | } |
| | 421 | |
| | 422 | |
| | 423 | } |
| | 424 | |
| | 425 | }}} |
| | 426 | |
| | 427 | 每一期的代码道场活动,同事们都是快速思考问题的,并且根据对方提出的方案提出自己的疑问,同时对方也必须进行快速思考回答,没错,[[BR]] |
| | 428 | 是快速思考,练的就是快速思考问题的习惯,当这习惯一旦养成,对以后的工作,必定起着致关重要的作用,再加上这两期的题目都是与工作[[BR]] |
| | 429 | 相关的,现在研究透彻,那对于工作只会有益而无害的,并且还能学习到其他同事不同的想法,知识面不停地在扩张,真的是一举多得![[BR]] |
| | 430 | 本期代码道场报道到此为止,欢迎同事们发表自己的想法,丰富这文档。 |