firemail

标题: Java 开发手册 [打印本页]

作者: java    时间: 2018-5-11 17:10
标题: Java 开发手册
https://github.com/alibaba/p3c/tree/master/idea-plugin  阿里巴巴Java代码规约扫描插件

https://github.com/alibaba/p3c
[attach]485[/attach]


http://www.firemail.wang:8088/fo ... amp;page=1#pid11552

作者: java    时间: 2018-5-11 17:14
使用卫语句取代嵌套表达式
多层条件语句建议使用卫语句、策略模式、状态模式等方式重构

函数中的条件逻辑使人难以看清正常的执行途径。使用卫语句表现所有特殊情况。

动机:条件表达式通常有2种表现形式。第一:所有分支都属于正常行为。第二:条件表达式提供的答案中只有一种是正常行为,其他都是不常见的情况。

       这2类条件表达式有不同的用途。如果2条分支都是正常行为,就应该使用形如if…..else…..的条件表达式;如果某个条件极其罕见,就应该单独检查该条件,并在该条件为真时立刻从函数中返回。这样的单独检查常常被称为“卫语句”。

       Replace Nested Conditional with Guard Clauses (以卫语句取代嵌套条件表达式)的精髓是:给某个分支以特别的重视。它告诉阅读者:这种情况很罕见,如果它真的发生了,请做一些必要的整理工作,然后退出。





作者: java    时间: 2018-5-11 17:20
本帖最后由 java 于 2018-5-11 17:22 编辑

【强制】表单、 AJAX 提交必须执行 CSRF 安全过滤。
说明: CSRF(Cross-site request forgery)跨站请求伪造是一类常见编程漏洞。对于存在
CSRF 漏洞的应用/网站,攻击者可以事先构造好 URL,只要受害者用户一访问,后台便在用户
不知情情况下对数据库中用户参数进行相应修改。


【强制】在使用平台资源,譬如短信、邮件、电话、下单、支付,必须实现正确的防重放限制,
如数量限制、疲劳度控制、验证码校验,避免被滥刷导致资损。
说明: 如注册时发送验证码到手机,如果没有限制次数和频率,那么可以利用此功能骚扰到其
它用户,并造成短信平台资源浪费。


作者: java    时间: 2018-5-11 17:35
【参考】合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检
索速度。
正例: 如下表,其中无符号值可以避免误存负数, 且扩大了表示范围。

对象       年龄区间         类型               字节          表示范围
人        150岁之内     unsigned tinyint      1        无符号值:0到255
龟        数百岁        unsigned smallint     2        无符号值:0到65535
恐龙化石   数千万年      unsigned int          4        无符号值:0到约42.9亿
太阳      约50亿年      unsigned bigint       8        无符号值:0到约10的19次方


作者: java    时间: 2018-5-11 17:39
本帖最后由 java 于 2018-5-11 17:57 编辑

【强制】业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。
说明: 不要以为唯一索引影响了 insert 速度,这个速度损耗可以忽略,但提高查找速度是明
显的; 另外,即使在应用层做了非常完善的校验控制,只要没有唯一索引,根据墨菲定律,必
然有脏数据产生。


【推荐】利用覆盖索引来进行查询操作, 避免回表。
说明: 如果一本书需要知道第 11 章是什么标题,会翻开第 11 章对应的那一页吗?目录浏览
一下就好,这个目录就是起到覆盖索引的作用。
正例: 能够建立索引的种类分为主键索引、唯一索引、普通索引三种,而覆盖索引只是一种查
询的一种效果,用 explain 的结果, extra 列会出现: using index。
  1. (root@yayun-mysql-server) [test]>explain select d1.age, t2.id from (select age,name from t1 where id in (1,2))d1, t2 where d1.age=t2.age group by d1.age, t2.id order by t2.id;
  2. +----+-------------+------------+-------+---------------+---------+---------+--------+------+---------------------------------+
  3. | id | select_type | table      | type  | possible_keys | key     | key_len | ref    | rows | Extra                           |
  4. +----+-------------+------------+-------+---------------+---------+---------+--------+------+---------------------------------+
  5. |  1 | PRIMARY     | <derived2> | ALL   | NULL          | NULL    | NULL    | NULL   |    2 | Using temporary; Using filesort |
  6. |  1 | PRIMARY     | t2         | ref   | age           | age     | 5       | d1.age |    1 | Using where; Using index        |
  7. |  2 | DERIVED     | t1         | range | PRIMARY       | PRIMARY | 4       | NULL   |    2 | Using where                     |
  8. +----+-------------+------------+-------+---------------+---------+---------+--------+------+---------------------------------+
  9. rows in set (0.00 sec)

  10. (root@yayun-mysql-server) [test]>
复制代码
【推荐】 SQL 性能优化的目标:至少要达到 range 级别,要求是 ref 级别,如果可以是 consts
最好。
说明:
1) consts 单表中最多只有一个匹配行(主键或者唯一索引),在优化阶段即可读取到数据。
2) ref 指的是使用普通的索引( normal index) 。
3) range 对索引进行范围检索。
反例: explain 表的结果, type=index,索引物理文件全扫描,速度非常慢,这个 index
别比较 range 还低,与全表扫描是小巫见大巫。


【推荐】利用延迟关联或者子查询优化超多分页场景。
说明: MySQL 并不是跳过 offset 行,而是取 offset+N 行,然后返回放弃前 offset 行,返回
N 行,那当 offset 特别大的时候,效率就非常的低下,要么控制返回的总页数,要么对超过
特定阈值的页数进行 SQL 改写。
正例: 先快速定位需要获取的 id 段,然后再关联:
SELECT a.* FROM 表 1 a, (select id from 表 1 where 条件 LIMIT 100000,20 ) b where a.id=b.id

作者: java    时间: 2018-5-11 18:08
【参考】分层领域模型规约:
 DO( Data Object) :与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
 DTO( Data Transfer Object) :数据传输对象, Service 或 Manager 向外传输的对象。
 BO( Business Object) :业务对象。 由 Service 层输出的封装业务逻辑的对象。
 AO( Application Object): 应用对象。 在 Web 层与 Service 层之间抽象的复用对象模型,
极为贴近展示层,复用度不高。
 VO( View Object) : 显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
 Query:数据查询对象,各层接收上层的查询请求。 注意超过 2 个参数的查询封装,禁止
使用 Map 类来传输。






欢迎光临 firemail (http://firemail.wang:8088/) Powered by Discuz! X3