`
zhuguowei
  • 浏览: 639 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

家银通项目bad smell 代码示例

阅读更多

 

 /**
     * 获得远程EJB
     * @param <T>
     * @param T
     * @param url
     * @param location  1=账务核心
     *  				2=电视应用
     * @return
     */
    protected  <T>T getRemoteService(Class T,String url,int location)
    {
    	T service = null;
    	InitialContext ctx = null;
    	try {
    		if(1==location)
    		{
    			ctx = getAccountCTX();
    		}
    		if(2==location)
    		{
    			ctx = getApplyCTX();
    		}
    		service = (T)ctx.lookup(url);
		} catch (NamingException e) {
			e.printStackTrace();
		}finally
		{
			if(null!=ctx)
			{
				try {
					ctx.close();
				} catch (NamingException e) {
					e.printStackTrace();
				}
			}
		}
		return service;
    	
    }
    private InitialContext getApplyCTX()
    {
    	InitialContext ctx  = null;
    	try {
    		Properties props = new Properties();
    		props.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.jboss.naming.NamingContextFactory");
    		props.setProperty(Context.PROVIDER_URL,PropertyManager.getProperty("EJB_TVAPPLY_URL"));
    		props.setProperty(Context.URL_PKG_PREFIXES,"org.jboss.naming:org.jnp.interfaces");
    		ctx = new InitialContext(props);

		} catch (NamingException e) {
			e.printStackTrace();
		}
		return ctx;
    }
 

评点:自定义int型location不够直观,甚至连定义者也不见得每次都记得哪个对应哪个。可定义一个如下的静态变量。

    public static final int LOCATION_ACCOUNTCTX= 1;

 但其实location这一变量用来对应不同的PROVIDER_URL,如下图:

props.setProperty(Context.PROVIDER_URL,PropertyManager.getProperty("EJB_TVACCOUNT_URL"));

故完全可用相应的providerURL来代替location,且省去了if...else的判断语句。

优化:

 

    public static final String TVAPPLY_PROVIDER_URL = PropertyManager.getProperty("EJB_TVAPPLY_URL");
    protected  <T>T getRemoteService(Class T,String url,String providerURL)
    {
    	T service = null;
    	InitialContext ctx = null;
    	try {
    		ctx = getCTX(providerURL);
    		service = (T)ctx.lookup(url);
		} catch (NamingException e) {
			e.printStackTrace();
		}finally
		{
			if(null!=ctx)
			{
				try {
					ctx.close();
				} catch (NamingException e) {
					e.printStackTrace();
				}
			}
		}
		return service;
    	
    }
    private InitialContext getCTX(String providerURL)
    {
    	InitialContext ctx  = null;
    	try {
    		Properties props = new Properties();
    		props.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.jboss.naming.NamingContextFactory");
    		props.setProperty(Context.PROVIDER_URL,providerURL);
    		props.setProperty(Context.URL_PKG_PREFIXES,"org.jboss.naming:org.jnp.interfaces");
    		ctx = new InitialContext(props);

		} catch (NamingException e) {
			e.printStackTrace();
		}
		return ctx;
    }
 

 

/**
     * 说明     :  获取最近登陆账户信息
     * @param  :   1. List ls,
     *               
     * @return :   Accountinfo
     */
    @TransactionAttribute(TransactionAttributeType.MANDATORY)
    public Accountinfo getRecentAccount(List<String> ls)
    {
        ...
          Accountinfo accountinfo = (Accountinfo)query.getSingleResult();
          return accountinfo;
    }
 

评点: 不够简洁且高并发情况下,还可能会发生“张冠李戴”的情况。
  可优化为:

return (Accountinfo)query.getSingleResult();
 
public  List<AccountDTO>  queryAccounts(String accountNo,
            String chanelCode, String registTimeStart,String registTimeEnd, String status,  List<String> lsAccountInfoId,
            String merchantName,String radiocode,int startRow,int endRow){

......
}

 

  评点: 参数过多,可用AccountDTO来代替。可能需要在该DTO增加几个属性来对应页面表单参数,如起始时间,结束时间及多选checkbox状态等。如下图:
账单查询

 

 

/**
	 * 说明     :  账户账号密码登陆验证
	 * @param  :   1. Long accountInfoId, 
	 * 			   2. int status 
	 * @return :   long  
	 */
	@TransactionAttribute(TransactionAttributeType.MANDATORY)
	public long loginValidate(String accountNo, String loginPwd,String chanel)
	{
		long returnValue=1; //失败
		
	//查询该帐户编号是否存在	
        String sql = "select count(*) from useraccnum u,accountinfo t where t.ACCOUNTSTATE!=4 and u.accountinfoid = t.accountinfoid  and u.useraccount=? and u.channelinfoid=?"; 
    	Query query = em.createNativeQuery(sql);
    	query.setParameter(1, accountNo);
    	query.setParameter(2, chanel);
    	
    	BigDecimal b = (BigDecimal)query.getSingleResult();
    	
    	//----如果验证成功则取得账户编号
    	if(null!=b&&1==b.intValue())
    	{
    		//取得账户ID
                sql = "select u.accountinfoid from useraccnum u where u.useraccount=?  and u.channelinfoid=?";
    		query = em.createNativeQuery(sql);
        	query.setParameter(1, accountNo);
        	query.setParameter(2, chanel);
    		b = (BigDecimal)query.getSingleResult();
    		returnValue = b.longValue(); //账户流水
    		
    		//验证密码
    		sql = "select loginpwd from useraccnum u,accountinfo t where t.ACCOUNTSTATE!=4 and u.accountinfoid = t.accountinfoid  and u.useraccount=? and u.channelinfoid=?";
        	Query querymm = em.createNativeQuery(sql);
        	querymm.setParameter(1, accountNo);
        	querymm.setParameter(2, chanel);
        	String dPwd = (String)querymm.getSingleResult();
        	//验证不通过
        	//if(!PasswordUtil.validate(dPwd, loginPwd))
        	if(!dPwd.equals(loginPwd))
        	{
        		return -returnValue;
        	}
        	
    		//-----更新登陆时间
    		sql = "update useraccnum t set t.recentlandtime=sysdate where  t.useraccount=?  and t.channelinfoid=?" ;
    		query = em.createNativeQuery(sql);
        	query.setParameter(1, accountNo);
        	query.setParameter(2, chanel);
    		query.executeUpdate();
    	}
    	
    	return returnValue;
	
	}
 


评点:该方法用于账户登录时的校验。功能过于复杂、凌乱。先是查询记录数,若为1,则再查询主键ID,接着查询其密码(以上三步仅查询一次便可解决),校验密码是否匹配,更新登录时间。且返回值也让人眼花缭乱,账户不存在返回1,账户存在密码错误则为主键ID的负值,若校验通过则为主键ID。
优化:功能单一化,仅校验登录信息。登录日志(登陆成功、登录失败)另外处理。返回值为boolean,即告知校验通过还是未通过。

/**
     * 1. 根据账户ID进行账户锁定
     *
     * @param 1.
     *            账户ID Long accountInfoId 2. 锁定方式 int lockType 0:自动锁定;1:手工锁定;
     * @return OutObj4Account
     * @exception
     */
    public OutObj4Account lockAccount(Long accountInfoId, int lockType) {
        OutObj4Account outObj4Account = new OutObj4Account();
        try {
            ut.begin();
            if (null != accountInfoId) {
                if (0 == lockType) {
                    accountDAO.updateStatusById(accountInfoId, 0);
                }
                if (1 == lockType) {
                    accountDAO.updateStatusById(accountInfoId, 1);

                }
                outObj4Account.setIsSuccess("0");
                outObj4Account.setMsg("操作成功");
            ......
    }
 

 

评点: 多此一举。
优化:

accountDAO.updateStatusById(accountInfoId, lockType)
 
/**
     * 1. 根据账户ID进行账户解锁
     *
     * @param 1.
     *            账户ID Long accountInfoId 2. 解锁方式 int unLockType 0:自动解锁;1:手工解锁;
     * @return OutObj4Account
     * @exception
     */
    public OutObj4Account unlockAccount(Long accountInfoId, int unLockType) {

        OutObj4Account outObj4Account = new OutObj4Account();

        // -------------------------------------------------------
        try {
            ut.begin();
            if (null != accountInfoId) {
                accountDAO.updateStatusById(accountInfoId, 3);
                outObj4Account.setIsSuccess("0");
                outObj4Account.setMsg("账户解锁操作成功");
            } else {
                ......
            }
            ......
    }

 

评点: unLockType参数多余。且校验accountInfoId亦属画蛇添足。很明显在该操作前你已明确知道该主键ID。再说也不能单单校验是否为null,还得判断是否为空,是否合法,是否存在等。

分享到:
评论

相关推荐

    银通智略-项目融资:印度尼西亚帕塔米纳液化天然气管道项目.doc

    "银通智略-项目融资:印度尼西亚帕塔米纳液化天然气管道项目" 工程融资是指为特定的工程项目提供资金支持,以确保工程的顺利进行和完成。在本案例中,我们将介绍印度尼西亚帕塔米纳液化天然气管道项目的工程融资...

    连连银通支付结算服务协议(账户+)1

    总的来说,这份协议详细规定了连连银通电子支付服务的使用规则和流程,强调了账户安全、资金管理和合规性要求,旨在为用户提供安全、便捷的网络支付体验。用户在使用服务时,应充分理解并严格遵守这些条款,以确保...

    收银通网站

    【收银通网站】是一个专为软件企业提供产品展示、宣传及商业合作的在线平台。该网站包含多个核心功能模块,旨在帮助软件企业更好地推广其产品和服务。 首先,**网站首页**作为用户进入网站的第一印象,通常设计得...

    新一代中铁银通卡在铁路客运实名制核验的应用研究.docx

    新一代中铁银通卡在铁路客运实名制核验的应用研究.docx

    连连银通支付WEB-DEMO开发包

    |-- 连连银通商户域名IP应用标识配置申请表V2.1.1 2、接入说明 快捷支付WEB版,支付请求跳转连连收银台,用户通过输入预留手机短信验证码进行支付。 请参考Demo, Demo中支持两种支付接入方式(标准版,卡...

    银隆新能源汽车的发展思路——与银通投资控股集团有限公司副总裁刘兴一席谈.pdf

    银隆新能源汽车的发展思路——与银通投资控股集团有限公司副总裁刘兴一席谈.pdf

    P2P投资人自述血泪史连遭13家平台跑路.pptx

    2012年开始,这位投资者在拍拍贷、红岭创投等平台上尝到了投资的甜头,然而在追求高息的过程中,他连续遭遇13家平台跑路,损失惨重。 首先,投资者应充分认识到高息背后的巨大风险。在2013年,投资者被友友贷、银通...

    中星餐饮管理系统

    "中星餐饮管理系统"是一款专为餐饮行业设计的综合版管理软件,旨在提升餐厅运营效率,优化服务流程,实现信息化管理。此系统集成了多种功能,涵盖了餐饮业日常运营的各个方面,包括点餐、收银、库存管理、会员管理、...

    临时备忘录

    而“工具”可能指的是一些辅助开发、测试或管理的软件工具,如版本控制工具(Git)、代码编辑器(Visual Studio Code)或者项目管理工具(JIRA)等。 结合以上信息,我们可以推测这可能是一个关于IT面试准备的资料...

    贷款意向书.doc

    1. **贷款意向书的角色**:在这个案例中,甲方是贷款人,即包头市高新银通村镇银行有限责任公司,乙方是申请人,即包头市土地储备中心。贷款意向书是双方就贷款事宜进行协商并达成初步共识的书面证明。 2. **贷款...

    硬件服务工程师实习报告

    - **企业文化与制度**:深入了解广电银通的企业文化、组织结构及规章制度,包括各部门职责、培训项目和员工考核指标等。 - **企业关系**:明确了广电运通、广电银通与广电集团之间的隶属关系。 - **公司架构**:...

    外墙保温专项工程施工设计方案.doc

    《外墙保温专项工程施工设计方案》是针对建筑工程项目中的外墙保温部分所制定的一份详细施工方案,旨在确保建筑节能效果,提高建筑的能源效率和居住舒适度。以下是对该方案的详细解读: 一、编制依据 施工设计方案...

    聚智未来:2019年年度报告.PDF

    报告中的关键词如知弘集团、山海银通、聚智长盛等可能代表聚智未来的合作伙伴或关联企业,它们在聚智未来的发展中扮演了重要角色。此外,报告还提到了一些投资实体,如北京佰瑞兴业投资管理中心、江苏现代永昌企业...

    网上书店建站策划书2022年[扫描版].pdf

    在海南,银通书店曾尝试网络书店,但因管理问题被创新书店超越。创新书店虽成功占领了大部分市场份额,却未充分利用电子商务潜力。非典期间,电子商务的快速发展显示了其潜力,但过后并未持续增长,这表明电子商务...

    创维半导体设计中心在深圳开工.pdf

    银通新能源计划投入50亿元,建设占地26万平方米的产业化基地,目标是成为全球重要的新能源产业基地,产值有望达到500亿元。 综上所述,广东在半导体设计和新能源产业的双重推动下,正逐步成为中国乃至全球电子信息...

    电动汽车电池在合肥实现量产 成本将降低.pdf

    珠海银通新能源产业化基地的建设展示了中国在新能源汽车领域的强大潜力。这个基地投资50亿元,已建成自动化程度最高的环型动力和储能锂离子电池生产线,年产能达到1亿Ah,同时具备生产新能源汽车、电控系统和动力...

    (2021-2022年收藏)信用社(银行)支付清算系统个人账户通存通兑业务操作规程及会计核算规定.doc

    3. "手续费收入—代理业务手续费收入"账户下的"农信银通存通兑业务手续费收入"分户,专门记录通存通兑业务的手续费收入。 凭证主要包括储蓄(卡)业务凭证和记账凭证: 1. 储蓄(卡)业务凭证作为个人账户及清算...

    (2021-2022年收藏)信用社银行支付清算系统个人账户通存通兑业务操作规程及会计核算规定.doc

    - 在“2621 其他应付款”科目下设立“暂收农信银通存业务款项”,用于核算未确定交易的通存金额和手续费。 - 在“5111 手续费收入--代理业务手续费收入”下设立“农信银通存通兑业务手续费收入”,用于核算手续费...

Global site tag (gtag.js) - Google Analytics