发表于: 2017-12-01 23:28:56
1 770
今天完成的事情:
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 request, HttpServletResponse response,
ModelMap model, String name, String province, String city, String county,
String industry, String financing, String freezed, String approved,
String returnFlag, Integer page, Integer 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<String, Object> param = DynamicUtil.getCompanyMangerList(name, industry, province, city, county, financing, approved, freezed, 0);log.info("get param data is " + param);
//在Company的module里映射到数据来查询IDs
companyIds = companyService.getIdsByDynamicCondition(Company.class, param, start, size);log.info("companyIds= "+ companyIds);
//查询出所有param的职位ID
count = companyService.getIdsByDynamicCondition(Company.class, param, 0, Integer.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);
@Overridepublic 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
评论