论坛首页 Java企业应用论坛

为新的小型项目设计了一个架构,请批评指正

浏览 24782 次
该帖已经被评为良好帖
作者 正文
   发表时间:2006-10-15  
//UserRegisterController的dePost方法
String userName = request.getParameter("txtUserName");// 用户名
String userPwd = request.getParameter("txtUserPwd");// 密码
String target = null;

User user = new User(userName, userPwd);// 构造领域对象

try{
	user.register();
	target="/success.jsp";
	request.setAttirbute("user",user);
}catch(UserExistException e){
	target = "/failed.jsp";
}

request.getRequestDispatcher(target).forward(request, response);

//User
public class User
{
	String userName;
	String userPwd;
	//getter和setter省略了
	public void register() throws UserExistException{
		UserDao userDao=new UserDaoImpl();
		if(userDao.getUserByName(userName)==null){
			userDao.insertUser(this);
		}else{
			throw new UserExistException();
		}
	}
}

//UserDao
public class UserDaoImpl implements UserDao
{
	//未做SQLException处理
	public User getUserByName(String userName){
		User user=null;
		Connection conn = DbHelper.getConnection();
		PreparedStatement pst=conn.prepareStatement("select from TB_USER where USER_NAME=?");
		pst.setString(1,userName);
		ResultSet rst=pst.executeQuery();
		if(rst.next()){
			user=new User(rst.getString(1),null);
		}
		rst.close();
		pst.close();
		DbHelper.releaseConnection(conn);
		return user;
	}
	public void insertUser(User user){
		Connection conn = DbHelper.getConnection();
		PreparedStatement pst=conn.prepareStatement("insert into TB_USER(USER_NAME,USER_PWD) values(?,?)");
		pst.setString(1,user.getUserName());
		pst.setString(2,user,getUserPwd());
		int rst=pst.executeUpdate();
		pst.close();
		DbHelper.releaseConnection(conn);
	}
};


我认为把注册这个行为归到User里比较好
如果做登陆检查,判断是否已经注册了,也可以放到User里
0 请登录后投票
   发表时间:2006-10-15  
抱歉,我刚才刷新页面,这个帖子就直接出现了,麻烦斑竹删除
0 请登录后投票
   发表时间:2006-10-15  
kryptonum太客气了,在讨论过程我自己也在大家的帮助下澄清了一些模糊的概念,愿我们在JavaEye共同进步.
0 请登录后投票
   发表时间:2006-10-16  
deafwolf 写道

我认为把注册这个行为归到User里比较好
如果做登陆检查,判断是否已经注册了,也可以放到User里


这个界限我一直也没有弄清楚,能不能说说你的理由
另外,代码中用到了很多Exception,我想知道有什么机制可以使这些异常和用户
界面很好的结合起来呢,这个问题困扰我很久了,所以也就有意无意的避免使用Exception
0 请登录后投票
   发表时间:2006-10-16  
Illum 写道

1.你的addUser使用boolean作为返回值这种方式不是什么好设计,更为优雅的方法是抛出业务Exception
这里很明显是很糟糕的代码。
2.使用PO/VO来传递数据不是笨拙的的方法,有更为优雅的数据转换方式,你们可以看下apache common-utils的组件,相信会受益良多。
3.是否划分接口,要看你是否会对抽取出来的接口有多个不同的实现,如果只有一个实现,还划分出接口,往往会导致更大的复杂性,我想没人会喜欢撰写和维护n多的factory吧?看下论坛上的其他文章,有很多关于这方面内容的精辟论述。
4.拼接SQL会导致sql注入攻击可能性,如果有一定数据库基础google一下就明白了,论坛上我记得robbin也发过相应的帖子。当然,不是说就永远不能拼接sql,当时要慎重考虑是否可能被sql注入攻击。
5.这类帖子希望以后能到新手区讨论。

你的回复我前天就看了,考虑了一下
1、读了http://www.iteye.com/topic/2038这个帖子,觉得这是一个仁者见仁智者见智的问题。像我的demo里面的login方法,判断其执行的结果属于正常的业务逻辑处理流程.我个人认为,不应该使用Exception来处理.当然,使用Exception的方式来处理这个问题则显得更为OO
2、结合35楼qinysong的回帖,还在学习中
3、从需求的角度来说接口是有点多余,不过我们希望可以通过这个项目增强注重设计的意识,所以设计中带有接口;另外,接口对我们进行协同开发应该也有所帮助
4、google了一下,把它作为BestPractice记下了
5、下次一定注意:)
0 请登录后投票
   发表时间:2006-10-16  
行为艺术家 写道
kryptonum太客气了,在讨论过程我自己也在大家的帮助下澄清了一些模糊的概念,愿我们在JavaEye共同进步.

哪里哪里共同进步!

看了楼上的那么多回帖,不知道你对qingsong所说的
qingsong 写道
问题一在这个servlet中,接收用户输入并以领域对象的形式来传递,接收和传递数据的方式

我总觉得很笨拙
qingsong 写道

可以通过反射机制实现一个帮助类来完成从request请求参数到“领域对象”属性的封装,从而化简这一过程。参

考struts form/spring commandclass的封装过程
有什么看法
看起来确实可以解决我的问题,不过我有点无从下手
顺着这条思路下去,我们就可以在这个类中调用Validator类实现服务端的验证,不知道我想的对不对
0 请登录后投票
   发表时间:2006-10-16  
设计光靠讨论是讨论不出来的,意见一杂,都不好分辨是非。还是自己多多思考,选择适合自己的方案。

上传一个Robbin在04年底写的一个sample吧,可以看看里面的分层结构,应该能回答你们很多问题。论坛已经没有那个附件的下载了,再上传一次应该不违反论坛规定吧。
0 请登录后投票
   发表时间:2006-10-16  
kryptonum 写道
deafwolf 写道

我认为把注册这个行为归到User里比较好
如果做登陆检查,判断是否已经注册了,也可以放到User里


这个界限我一直也没有弄清楚,能不能说说你的理由
另外,代码中用到了很多Exception,我想知道有什么机制可以使这些异常和用户
界面很好的结合起来呢,这个问题困扰我很久了,所以也就有意无意的避免使用Exception


这个问题很难说清楚,我自己的理解是这样的:
一开始的时候就做一个完全的设计是很困难的(我功力未到啊),不管一开始设想的多好,后面有了变动也很麻烦。所以,我一般从省事的角度来写代码。当代码量积累到一定程度的时候,会出现相似代码这种bad smell,这个时候再加以重构,得出的代码精简一些。
代码从某种程度讲,是应该有规律的,如果注册是register(user),那么登陆就应该是login(user),这让我感觉是函数式开发,所以我倾向于把行为和对象扯上关系,user.register(),user.login(),通过就转向,通不过就抛异常,用起来省心一些。
如果用返回值做条件判定,那么就无法避免耦合了。用异常就不同,调用会产生异常,这样就强制调用者处理异常,这里的异常是业务相关的。
楼主说的异常应该是类似SQLException这种吧?这种确实很麻烦,好多牛人都争论过,原因是这种异常很难恢复,所以有不少人倾向于不检查这种异常。我处理这种异常一般是catch后throw一个RuntimeException。
至于接口,如果这个接口并没有多个实现,那么我倾向于直接使用类,如果后面发现需要多个实现,再重构也来得及。
0 请登录后投票
   发表时间:2006-10-17  
这样做锻炼基础还是比较有好处的 ,这种类似的系统还是要用MVC框架比较好.像简单的注册就两个字段,有没有考虑过50以上字段的处理呢? 关于SPRING .如果不熟悉HIBERNATE 可以考虑用 SPRING的JDBC 模版功能,就不要考虑那么多了.但学生时代还是从JDBC底层写吧.了解了解原理 异常处理.还是不错的
0 请登录后投票
   发表时间:2006-10-17  
惭愧    以前自己做的东西的时候根本没注意过这方面的东西,最近正筹划做一个东西,可能是大学期间最后一次了,也想好好考虑一下这方面的问题。看到上面的讨论,受益良多。不过自己还是不能很好的总结出自己的观点,大家继续讨论,持续关注中:D  

PS: 下次争取巴自己的构架贴上来,也好在批评中进步   
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics