wiki:codekata/refactor3

2013年10月11日和2013年10月18日代码道场活动纪实
代码道场的参与者:李峰,秦鸿源,张艺辉,陈阳,丁健勇,李炳岳,黄志强,李剑文,江毅超,刘必晓
地点:4G会议室
本期代码道场题目,依旧是上期代码题目,因为上期重构的方法,我们还可以重构得更好,并且有了上两期讨论的积累,对本期代码
道场活动也起到一定的作用。
上一期的代码道场活动的代码:2013-10-04 Functions类htmlUrl方法重构2 活动
这次我们是整组人一起讨论如何更好地重构htmlUrl方法,每个人都会提出自己的观点,想法以及给大家分析为什么要这样重构方法。
当然,让我们先来看下代码

版块对象

/**
 * 版块对象
 */
public class Forum {
	private long fid;

	public long getFid() {
		return fid;
	}

	public void setFid(long fid) {
		this.fid = fid;
	}
	
	public String getRedirectUrl(){
		return "";
	}
}

发帖

public class Post {
	public long getPid(){
		return 2424242;
	}
	public long getTid(){
		return 789789;
	}

}

帖子

public class Topic {
	public long getTid(){
		return 1342;
	}
}

用户

public class User {
	public long getUid(){
		return 2424;
	}
}

当然了,这个时候就少不了测试类了

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));
	}
	
	
	
	

}

好不容易啊,终于可以写实现方法了。其实同事们都是喜欢写实现方法多于写测试方法的,但工作不是喜欢就行得了,
还要考虑很多因素,最根本的,写出来的实现方法必须得通过严格的测试,并且提交代码之前,我们也得测试代码,
从而促使我们使用测试驱动开发的方法进行开发。闲话也少说了,下面看下实现代码吧

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对象,其他的如果是字符串则返回原字符串
     * <br/>修改些方法的规则的同时也要修改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 "";
    }
    
    
}

每一期的代码道场活动,同事们都是快速思考问题的,并且根据对方提出的方案提出自己的疑问,同时对方也必须进行快速思考回答,没错,
是快速思考,练的就是快速思考问题的习惯,当这习惯一旦养成,对以后的工作,必定起着致关重要的作用,再加上这两期的题目都是与工作
相关的,现在研究透彻,那对于工作只会有益而无害的,并且还能学习到其他同事不同的想法,知识面不停地在扩张,真的是一举多得!
本期代码道场报道到此为止,欢迎同事们发表自己的想法,丰富这文档。