'''2013年10月11日和2013年10月18日代码道场活动纪实'''[[BR]] '''代码道场的参与者:'''李峰,秦鸿源,张艺辉,陈阳,丁健勇,李炳岳,黄志强,李剑文,江毅超,刘必晓[[BR]] '''地点:'''4G会议室[[BR]] 本期代码道场题目,依旧是上期代码题目,因为上期重构的方法,我们还可以重构得更好,并且有了上两期讨论的积累,对本期代码[[BR]] 道场活动也起到一定的作用。[[BR]] 上一期的代码道场活动的代码:[wiki:codekata/refactor2 2013-10-04 Functions类htmlUrl方法重构2 活动][[BR]] 这次我们是整组人一起讨论如何更好地重构htmlUrl方法,每个人都会提出自己的观点,想法以及给大家分析为什么要这样重构方法。[[BR]] 当然,让我们先来看下代码[[BR]] ''版块对象'' [[BR]] {{{ /** * 版块对象 */ public class Forum { private long fid; public long getFid() { return fid; } public void setFid(long fid) { this.fid = fid; } public String getRedirectUrl(){ return ""; } } }}} ''发帖''[[BR]] {{{ public class Post { public long getPid(){ return 2424242; } public long getTid(){ return 789789; } } }}} ''帖子''[[BR]] {{{ public class Topic { public long getTid(){ return 1342; } } }}} ''用户''[[BR]] {{{ public class User { public long getUid(){ return 2424; } } }}} 当然了,这个时候就少不了测试类了[[BR]] {{{ import junit.framework.Assert; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; public class FunctionsTest { private String appName = null; private String itAppName = null; private String rootUrl = null; private String ucRoot = null; private Topic topic = null; private Forum forum = null; private Post post = null; private User user = null; @Before public void setUp() { appName = "pcauto"; itAppName = "itbbs"; rootUrl = "http://bbs.pcauto.com.cn"; ucRoot = "http://my.pcauto.com.cn"; topic = new Topic(); forum = new Forum(); post = new Post(); user = new User(); forum.setFid(123L); } @Ignore public void testHtmlUrl() { // 变化的对象 Object,rootUrl,appName, // Object是变化的,rootUrl,appName=auto 是固定的 Assert.assertEquals(rootUrl + "/topic-1342.html", Functions.htmlUrl(topic)); Assert.assertEquals(rootUrl + "/404.html", Functions.htmlUrl((Topic) null)); Assert.assertEquals(rootUrl + "/forum-123.html", Functions.htmlUrl(forum)); Assert.assertEquals(rootUrl + "/post-789789_2424242.html", Functions.htmlUrl(post)); Assert.assertEquals(ucRoot + "/2424", Functions.htmlUrl(user)); Assert.assertEquals("1234567", Functions.htmlUrl("1234567")); } @Test public void testHtmlUrlForum() { Assert.assertEquals(rootUrl + "/forum-123.html", Functions.htmlUrl(forum)); // Assert.assertEquals(rootUrl + "/f123.html", // Functions.htmlUrl(forum, rootUrl, itAppName)); Assert.assertEquals(rootUrl + "/404.html", Functions.htmlUrl((Forum) null)); } @Test public void testHtmlUrlTopic() { Assert.assertEquals(rootUrl + "/topic-1342.html", Functions.htmlUrl(topic)); // Assert.assertEquals(rootUrl + "/1342.html", // Functions.htmlUrl(topic, rootUrl, itAppName)); Assert.assertEquals(rootUrl + "/404.html", Functions.htmlUrl((Topic) null)); } @Test public void testHtmlUrlUser() { Assert.assertEquals(ucRoot + "/2424/", Functions.htmlUrl(user)); // Assert.assertEquals(rootUrl + "/123.html", // Functions.htmlUrl(user, ucRoot, itAppName)); Assert.assertEquals(rootUrl + "/404.html", Functions.htmlUrl((User) null)); } @Test public void testHtmlUrlPost() { Assert.assertEquals(rootUrl + "/post-789789_2424242.html", Functions.htmlUrl(post)); // Assert.assertEquals(rootUrl + "/p789789_2424242.html", // Functions.htmlUrl(post, rootUrl, itAppName)); Assert.assertEquals(rootUrl + "/404.html", Functions.htmlUrl((Post) null)); } @Test public void testHtmlUrlString() { Assert.assertEquals("123456", Functions.htmlUrl("123456")); // Assert.assertEquals("123456", // Functions.htmlUrl("123456", rootUrl, itAppName)); Assert.assertEquals(rootUrl + "/404.html", Functions.htmlUrl((String) null)); } } }}} 好不容易啊,终于可以写实现方法了。其实同事们都是喜欢写实现方法多于写测试方法的,但工作不是喜欢就行得了,[[BR]] 还要考虑很多因素,最根本的,写出来的实现方法必须得通过严格的测试,并且提交代码之前,我们也得测试代码,[[BR]] 从而促使我们使用测试驱动开发的方法进行开发。闲话也少说了,下面看下实现代码吧[[BR]] {{{ import java.text.MessageFormat; public class Functions{ private static String rootUrl = "http://bbs.pcauto.com.cn"; private static String appName = "pcauto"; /** * * 将页面链接静态化(wap),目前只支持Forum,Topic,Post,User对象,其他的如果是字符串则返回原字符串 *
修改些方法的规则的同时也要修改parserUrl方法 * tid等于{4018911,4027940, 4040395}销售配合,此帖子跳转到指定链接 * * @param object * * * @param type 1:web, 2:wap * @return */ public static String htmlUrl(Object object, int type) { boolean isIt = false; if (isIt && type != SystemConstant.TYPE_WAP ) { return ""; } else { switch (type) { case SystemConstant.TYPE_WEB: rootUrl = rootUrl; break; case SystemConstant.TYPE_WAP: rootUrl = rootUrl; break; default: break; } if ("".equals(rootUrl) || rootUrl == null) { return ""; } if (object instanceof Forum) { Forum forum = (Forum) object; if (!isEmpty(forum.getRedirectUrl()) && SystemConstant.TYPE_WEB == type) { return forum.getRedirectUrl(); } else { return rootUrl + "/forum-" + forum.getFid() + ".html"; } } else if (object instanceof Topic) { //销售配合,此帖子跳转到指定链接 if(SystemConstant.AUTO_APP_NAME.equals(appName) && ((Topic) object).getTid() == 4018911){ return "http://ad.doubleclick.net/clk;275446626;102403463;a?http://bbs.pcauto.com.cn/topic-4018911.html"; } if(SystemConstant.AUTO_APP_NAME.equals(appName) && ((Topic) object).getTid() == 4027940){ return "http://ad.doubleclick.net/clk;275446638;102403466;g?http://bbs.pcauto.com.cn/topic-4027940.html"; } if(SystemConstant.AUTO_APP_NAME.equals(appName) && ((Topic) object).getTid() == 4040395){ return "http://ad.doubleclick.net/clk;275446642;102403468;d?http://bbs.pcauto.com.cn/topic-4040395.html"; } return rootUrl + "/topic-" + ((Topic) object).getTid() + ".html"; } else if (object instanceof Post) { return rootUrl + "/post-" + ((Post) object).getTid() + '_' + ((Post) object).getPid() + ".html"; } else if (object instanceof String) { return (String) object; } else if (object instanceof User) { return "/" + ((User) object).getUid(); } else if (object instanceof ftree.Forum) { ftree.Forum forum = (ftree.Forum) object; return rootUrl + "/forum-" + forum.getFid() + ".html"; } else { return ""; } } } public static boolean isEmpty(String text){ return (null == text || "".equals(text)); } /** * 板块URL静态化 * @param forum 板块 * @param rootUrl 应用路径 * @param appName * @return */ public static String htmlUrl(Forum forum) { if (forum == null) { return Tpl.NOT_FOUND_URL; } // if ("itbbs".equals(appName)) { // return rootUrl + "/f" + forum.getFid() + ".html"; // } else { // return rootUrl + "/forum-" + forum.getFid() + ".html"; // } return MessageFormat.format(Tpl.FORUM_URL, String.valueOf(forum.getFid())); } /** * 主题URL静态化 * @param topic 主题 * @param rootUrl 应用路径 * @param appName * @return */ public static String htmlUrl(Topic topic) { if (topic == null) { return Tpl.NOT_FOUND_URL; } // if ("itbbs".equals(appName)) { // return rootUrl + "/" + topic.getTid() + ".html"; // } else { // return rootUrl + "/topic-" + topic.getTid() + ".html"; // } return MessageFormat.format(Tpl.TOPIC_URL, String.valueOf(topic.getTid())); } /** * 帖子URL静态化 * @param post 帖子 * @param rootUrl 应用路径 * @param appName * @return */ public static String htmlUrl(Post post) { if (post == null) { return Tpl.NOT_FOUND_URL; } String pid = String.valueOf(post.getPid()); String tid = String.valueOf(post.getTid()); return MessageFormat.format(Tpl.POST_URL, new Object[]{tid, pid}); } /** * 用户URL静态化 * @param post 帖子 * @param rootUrl 应用路径 * @param appName * @return */ public static String htmlUrl(User user) { if (user == null) { return Tpl.NOT_FOUND_URL; } return MessageFormat.format(Tpl.USER_URL, String.valueOf(user.getUid())); } /** * URL静态化 * @param str string * @param rootUrl 应用路径 * @param appName * @return */ public static String htmlUrl(String str) { if (str == null) { return Tpl.NOT_FOUND_URL; } return str; } /** * wap版版块URL静态化 * @param forum 版块 * @param rootUrl 应用路径 * @param appName * @return */ public static String htmlUrl4Wap(Forum forum) { return ""; } /** * wap版帖子URL静态化 * @param post 帖子 * @param rootUrl 应用路径 * @param appName * @return */ public static String htmlUrl4Wap(Post post) { return ""; } /** * wap版主题URL静态化 * @param topic 主题 * @param rootUrl 应用路径 * @param appName * @return */ public static String htmlUrl4Wap(Topic topic) { return ""; } /** * wap版字符串URL静态化 * @param str string * @param rootUrl 应用路径 * @param appName * @return */ public static String htmlUrl4Wap(String str) { return ""; } /** * wap版用户URL静态化 * @param user 用户 * @param rootUrl 应用路径 * @param appName * @return */ public static String htmlUrl4Wap(User user) { return ""; } } }}} 每一期的代码道场活动,同事们都是快速思考问题的,并且根据对方提出的方案提出自己的疑问,同时对方也必须进行快速思考回答,没错,[[BR]] 是快速思考,练的就是快速思考问题的习惯,当这习惯一旦养成,对以后的工作,必定起着致关重要的作用,再加上这两期的题目都是与工作[[BR]] 相关的,现在研究透彻,那对于工作只会有益而无害的,并且还能学习到其他同事不同的想法,知识面不停地在扩张,真的是一举多得![[BR]] 本期代码道场报道到此为止,欢迎同事们发表自己的想法,丰富这文档。