锁定老帖子 主题:为新的小型项目设计了一个架构,请批评指正
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间: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里 |
|
返回顶楼 | |
发表时间:2006-10-15
抱歉,我刚才刷新页面,这个帖子就直接出现了,麻烦斑竹删除
|
|
返回顶楼 | |
发表时间:2006-10-15
kryptonum太客气了,在讨论过程我自己也在大家的帮助下澄清了一些模糊的概念,愿我们在JavaEye共同进步.
|
|
返回顶楼 | |
发表时间:2006-10-16
deafwolf 写道 我认为把注册这个行为归到User里比较好 如果做登陆检查,判断是否已经注册了,也可以放到User里 这个界限我一直也没有弄清楚,能不能说说你的理由 另外,代码中用到了很多Exception,我想知道有什么机制可以使这些异常和用户 界面很好的结合起来呢,这个问题困扰我很久了,所以也就有意无意的避免使用Exception |
|
返回顶楼 | |
发表时间: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、下次一定注意:) |
|
返回顶楼 | |
发表时间:2006-10-16
行为艺术家 写道 kryptonum太客气了,在讨论过程我自己也在大家的帮助下澄清了一些模糊的概念,愿我们在JavaEye共同进步.
哪里哪里 ![]() 看了楼上的那么多回帖,不知道你对qingsong所说的 qingsong 写道 问题一在这个servlet中,接收用户输入并以领域对象的形式来传递,接收和传递数据的方式
有什么看法
我总觉得很笨拙 qingsong 写道 可以通过反射机制实现一个帮助类来完成从request请求参数到“领域对象”属性的封装,从而化简这一过程。参 考struts form/spring commandclass的封装过程 看起来确实可以解决我的问题,不过我有点无从下手 ![]() 顺着这条思路下去,我们就可以在这个类中调用Validator类实现服务端的验证,不知道我想的对不对 |
|
返回顶楼 | |
发表时间:2006-10-16
设计光靠讨论是讨论不出来的,意见一杂,都不好分辨是非。还是自己多多思考,选择适合自己的方案。
上传一个Robbin在04年底写的一个sample吧,可以看看里面的分层结构,应该能回答你们很多问题。论坛已经没有那个附件的下载了,再上传一次应该不违反论坛规定吧。 |
|
返回顶楼 | |
发表时间:2006-10-16
kryptonum 写道 deafwolf 写道 我认为把注册这个行为归到User里比较好 如果做登陆检查,判断是否已经注册了,也可以放到User里 这个界限我一直也没有弄清楚,能不能说说你的理由 另外,代码中用到了很多Exception,我想知道有什么机制可以使这些异常和用户 界面很好的结合起来呢,这个问题困扰我很久了,所以也就有意无意的避免使用Exception 这个问题很难说清楚,我自己的理解是这样的: 一开始的时候就做一个完全的设计是很困难的(我功力未到啊),不管一开始设想的多好,后面有了变动也很麻烦。所以,我一般从省事的角度来写代码。当代码量积累到一定程度的时候,会出现相似代码这种bad smell,这个时候再加以重构,得出的代码精简一些。 代码从某种程度讲,是应该有规律的,如果注册是register(user),那么登陆就应该是login(user),这让我感觉是函数式开发,所以我倾向于把行为和对象扯上关系,user.register(),user.login(),通过就转向,通不过就抛异常,用起来省心一些。 如果用返回值做条件判定,那么就无法避免耦合了。用异常就不同,调用会产生异常,这样就强制调用者处理异常,这里的异常是业务相关的。 楼主说的异常应该是类似SQLException这种吧?这种确实很麻烦,好多牛人都争论过,原因是这种异常很难恢复,所以有不少人倾向于不检查这种异常。我处理这种异常一般是catch后throw一个RuntimeException。 至于接口,如果这个接口并没有多个实现,那么我倾向于直接使用类,如果后面发现需要多个实现,再重构也来得及。 |
|
返回顶楼 | |
发表时间:2006-10-17
这样做锻炼基础还是比较有好处的 ,这种类似的系统还是要用MVC框架比较好.像简单的注册就两个字段,有没有考虑过50以上字段的处理呢? 关于SPRING .如果不熟悉HIBERNATE 可以考虑用 SPRING的JDBC 模版功能,就不要考虑那么多了.但学生时代还是从JDBC底层写吧.了解了解原理 异常处理.还是不错的
|
|
返回顶楼 | |
发表时间:2006-10-17
惭愧
![]() ![]() ![]() PS: 下次争取巴自己的构架贴上来,也好在批评中进步 ![]() |
|
返回顶楼 | |