Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1796|回复: 5
打印 上一主题 下一主题

Java 开发手册

[复制链接]

697

主题

1142

帖子

4086

积分

认证用户组

Rank: 5Rank: 5

积分
4086
跳转到指定楼层
楼主
发表于 2018-5-11 17:10:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
回复

使用道具 举报

697

主题

1142

帖子

4086

积分

认证用户组

Rank: 5Rank: 5

积分
4086
沙发
 楼主| 发表于 2018-5-11 17:14:17 | 只看该作者
使用卫语句取代嵌套表达式
多层条件语句建议使用卫语句、策略模式、状态模式等方式重构

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

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

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

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




回复 支持 反对

使用道具 举报

697

主题

1142

帖子

4086

积分

认证用户组

Rank: 5Rank: 5

积分
4086
板凳
 楼主| 发表于 2018-5-11 17:20:49 | 只看该作者
本帖最后由 java 于 2018-5-11 17:22 编辑

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


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

回复 支持 反对

使用道具 举报

697

主题

1142

帖子

4086

积分

认证用户组

Rank: 5Rank: 5

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

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

回复 支持 反对

使用道具 举报

697

主题

1142

帖子

4086

积分

认证用户组

Rank: 5Rank: 5

积分
4086
5#
 楼主| 发表于 2018-5-11 17:39:27 | 只看该作者
本帖最后由 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
回复 支持 反对

使用道具 举报

697

主题

1142

帖子

4086

积分

认证用户组

Rank: 5Rank: 5

积分
4086
6#
 楼主| 发表于 2018-5-11 18:08:14 | 只看该作者
【参考】分层领域模型规约:
 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 类来传输。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-23 09:05 , Processed in 0.061059 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表