发表于: 2017-12-01 23:28:56

1 769


今天完成的事情:

1. 萝卜多一个接口的分析

2.  听老大讲课


明天计划的事情

1. 看资料整理一下(项目开发流程)

2. 复盘申请须知整理


遇到的问题:



收获:

1. 听老大讲课

八、忘记继承

原因:如果继承的链条很长,你就对继承下来的方法不知道来自哪个链条层级上的类,维护起来很麻烦,改动一个其他继承的也被改动。

结论;不加限制的继承和重载是不可取的

解决方法:用组合代替继承


所谓组合,就是方法之间为平行关系,在同一个类里被调用


十、合适的场景用合适对的语言和工具

原因:对于统计登陆的错误次数

解决方法:

方案1: 在JAVA里对同一账户错误登陆的报错进行统计 

方案2: 用脚本语言来进行统计


优缺点:

方法1:如果需要和业务结合起来,例如超过3次发短信通知,用JAVA比较好

方案2: 如果只是进行统计,不需要结果进行操作,用脚本语言轻便,快捷。相比之下方案1笨重,因为他需要保证对性能没有影响,对整体代码结构没有太大改变等。而2只需要几条linux命令即可。快捷


结论:解决问题使用最合理/方便的方法,而不是会什么用什么


十一、消息队列拯救世界

什么是消息队列:

是将突发大量请求转换为后端能承受的队列请求

例如:

在登陆校验后有1,2,3,4,5,6.。。10个操作需要进行。

但是这10个操作不是登陆的主要功能。

而10个功能完成后等待时间过长。

解决方法:

可以用消队列

实现原理: 当主要功能完成后,发送信息公告。10个功能检测到公告,针对相应的用户逐步完成10个功能。


也可用于当一些操作同时发生的时候服务器压力过大,例如同时读取10个文件,I/O读取速度慢,或者同时有10个订单等

可以用消息队列。


结论: 何时用消息队列  包括并不仅限于,当服务器压力过大,用户因功能多延迟大时。

注意一点:并不是架构越全越好,而是根据当前的应用场景和需要选择架构,并要有扩展性


十二、重构

代码从以下几个方面考虑:

1. 质量

2. 时间

3. 功能

重要性从上而下变小,理想状态为在规定时间内保质量的完成所有功能。

原因:

现实很骨感:那么就在规定时间内砍功能的前提下保证质量。

所以需要重构


在什么时候需要重构:

1. 代码超过30-50行(即使代码不具有复用的价值也要分出结构来)

2. 当代码里有cop和mv等情况对的时候

3. 硬编码

4. 当代码有较多的注释的时候

5. 对于一段代码写不成单元测试的时候(不理解)

6. 当改动一处代码对项目有较大影响的时候

7. 可扩展性不强的时候

8. 应用出现性能短板的时候

9. 当带代码分工(层?)不明的时候


以上1-6为必须,7-9为可选




2. 萝卜多一个接口的分析

流程: 看需求分析--》尝试进行数据库设计--》看原型图--》分许需要传入的参数和返回值--》看接口文档,对应前面的分析,查缺补漏。--》对照数据库进行sql语句设计--》看代码里的相关sql语句--》从controll开始向下分析直到数据库。


需求分析:

原型图:

接口文档:

分析接口:  /a/company/search




表1:公司表:ID , 公司名称,地区(省市县),行业,logo,状态(规模),时间相关,标语,介绍,在招职位。电话,地址,邮箱,  。。。。。时间相关


代码:

@RequestMapping(value="/a/company/search",method=RequestMethod.GET)
public String companyListJson(HttpServletRequest requestHttpServletResponse response,
                             ModelMap modelString nameString provinceString cityString county,
                             String industryString financingString freezedString approved,
                             String returnFlagInteger pageInteger size){
//第几页
if (page == null) {
       page = 1;

   }

//每页显示数量

if (size == null) {
       size = 10;

   }

int start = (page - 1) * size;
   if (start < 0) {
       start = 0;
   }
//冻结约定
if (freezed == null) {
       freezed = UN_FREEZE;
   }
   //公司IDs
   List<Long> companyIds;
   List<Long> count;

   List<Company> companyList;

//通过返回的数据看是否是查询公司的列表(两种列表)

   if (null == returnFlag || FLAG_COMMON.equals(returnFlag)) {
   //普通列表情况

    try {

       //组合sql语句

           Map<StringObject> param = DynamicUtil.getCompanyMangerList(nameindustryprovincecitycountyfinancingapprovedfreezed0);

           log.info("get  param data is " + param);

           //在Company的module里映射到数据来查询IDs

           companyIds = companyService.getIdsByDynamicCondition(Company.class, paramstartsize);

           log.info("companyIds= "+ companyIds);

           //查询出所有param的职位ID

           count = companyService.getIdsByDynamicCondition(Company.class, param0Integer.MAX_VALUE);

           //由得到的公司ID得到其具体数据

           companyList = companyService.getObjectsByIds(companyIds);
       catch (Throwable t) {
           log.error(t.getMessage());
           log.error("get company list by dynamicCondition fail");
           model.addAttribute("code"-6001);
           return "/common/fail";

  }

   if (null != companyList) {
      model.addAttribute("page", page);
      model.addAttribute("size", size);
      model.addAttribute("total", count.size());
      model.addAttribute("companyList", companyList);
      model.addAttribute("code", 0);
      return "/carrots/company/json/companyListJson";
   } else{
   model.addAttribute("code", -1002);
       return "/common/fail";
  }



companyService.getObjectsByIds(companyIds);
@Override

public List<Company> getObjectsByIds(List<Long> ids) throws ServiceException, ServiceDaoException {

     //判空

     log.info(" get lists : " + (ids == null ? "null" : ids));

     List<Company> company = null;

     //判断集合是否为空

     if (CollectionUtils.isEmpty(ids)) {
          return new ArrayList<Company>();
     }

     try {

         //在DAO层获取到公司详细信息,根据ID

         company = (List<Company>) dao.getList(Company.class, ids);
     } catch (DaoException e) {
     log.error(" get wrong : " + ids);
     log.error(e);
     e.printStackTrace();
     throw new ServiceDaoException(e);
   }

   log.info(" get data success : " + (company == null ? "null" : company.size()));
   return company;
}


对应module:

//把module和数据库表联系映射

@Entity

//指明表名为company

@Table(name = "company")

public class Company implements Serializable {


//该属性为主键,@ID 和 @GeneratedValue,通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 

@Id

//主键生成策略:AUTO 自动选择一个最适合底层数据库的主键生成策略。如MySQL会自动对应auto increment。这个是默认选项,即如果只写@GeneratedValue,等价于@GeneratedValue(strategy=GenerationType.AUTO)。

@GeneratedValue(strategy = GenerationType.AUTO)

//表明数据库中的字段名

@Column(name = "id")
public Long getId() {
return id;
}



进度: 

          无法关联

禅道:http://task.ptteng.com/zentao/project-task-264.htm



返回列表 返回列表
评论

    分享到