-
Notifications
You must be signed in to change notification settings - Fork 37
/
114-java-2.html
243 lines (235 loc) · 11.4 KB
/
114-java-2.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
<!doctype html>
<html >
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>葡萄藤PPT</title>
<link rel="stylesheet" href="./css/reveal/reveal.css">
<!-- PPT主题,可以在/css/reveal/theme/中选择其他主题,目前暂时只能使用该模板 -->
<link rel="stylesheet" href="./css/reveal/theme/ptt.css">
<!-- syntax highlighting 代码高亮主题 -->
<link rel="stylesheet" href="./lib/reveal/css/zenburn.css">
<!-- 打印和PDF输出样式 -->
<script>
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? './css/reveal/print/pdf.css' : './css/reveal/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
</head>
<body>
<img src="./img/demo/logo.png" alt="" usemap="#pttmap" class="base-logo">
<map name="pttmap">
<area shape="rect" coords="0,0,276,58" href="http://www.jnshu.com" alt="" target="_blank"/>
</map>
<div class="reveal">
<div class="slides">
<section>
<h2>接口中对Service返回结果的处理</h2>
<p>张鑫</p>
</section>
<section>
<p>目录</p>
<p>1.背景介绍</p>
<p>2.知识剖析</p>
<p>3.常见问题</p>
<p>4.解决方案</p>
<p>5.编码实战</p>
<p>6.扩展思考</p>
<p>7.参考文献</p>
<p>8.更多讨论</p>
</section>
<section>
<h3>1.背景介绍</h3>
</section>
<section>
<p>做复盘,写接口的时候,经常会有对service的操作,那service操作之后返回的结果该如何处理呢?</p>
<p>主要有以下三个问题:</p>
<p>对Service返回的结果是否要判空,为什么?</p>
<p>Service返回的结果是否需要打日志,为什么?</p>
<p>如果需要打日志,应该打什么样的日志,为什么?</p>
</section>
<section>
<h3>2.知识剖析</h3>
</section>
<section>
<p>主要从软件设计原则中的健壮性入手来谈谈自己的理解</p>
<p>健壮性是软件设计时非常重要的一个指标,是指软件对于规范要求以外的输入情况的处理能力。所谓健壮的系统是指对于规范要求以外的输入能够判断出这个输入不符合规范要求,并能有合理的处理方式
</p>
<p>通俗点说就是不能只考虑正常情况,还要考虑异常情况.而且根据"墨菲定律",只要你能想到某种异常情况可能会发生,那么这种异常情况就一定会发生.所以这时候对异常情况的处理就至关重要,必不可少.</p>
</section>
<section>
<p>问题一:对Service返回的结果是否要判空,为什么?</p>
<p>答案是:绝大多数情况下都需要对Service返回的结果进行判空.</p>
</section>
<section>
<p>通常调用service之后返回的结果有两种用途:</p>
<p>一种是作为下一个操作的入参.在这种情况下就必须要判空</p>
<p>另外一种是作为最后的结果返回.在这种情况下还需要继续细分;如果这个结果可以为空,那么就不用判断,直接返回,如果这个结果不能为空,那么还要继续判断,并要处理异常情况(productController,获取产品列表接口)</p>
</section>
<section>
<h3>3.常见问题</h3>
</section>
<section>
<p>问题二:Service返回的结果是否需要打日志,为什么?</p>
<p>问题三:如果需要打日志,应该打什么样的日志,为什么?</p>
</section>
<section>
<h3>4.解决方案</h3>
</section>
<section>
<p>问题二:Service返回的结果是否需要打日志,为什么?</p>
<p>答案:需要.目前在项目中,所有的从Service返回的结果都要打日志.这个问题很好理解,日志是我们了解程序运行,问题追踪的工具.如果从Service返回的结果不打日志,以后出现问题,我们就不能快速的定位到问题所在.举个例子(messageController, 查询用户消息详情接口)</p>
</section>
<section>
<p>问题三:如果需要打日志,应该打什么样的日志,为什么?</p>
<p>答案:视情况而定</p>
</section>
<section>
<p>一种情况是数据是一个基本类型或者对象类型,比如通过条件获取ID,或者根据Id获取对象等.</p>
<p>这时还要分两种情况</p>
</section>
<section>
<section>
<p>一种是我只需要该对象的属性,比如是否为空,具体返回的数据的值是什么,我们不关心的,就不需要在日志中打印返回的结果的值(代码举例,userController,用户实名接口)</p>
</section>
<section>
<p>还有一种是我除了要判断该对象的属性,还需要用到该数据的值,比如作为结果返回,或者是作为下一步操作的入参,那么就需要在日志中打印结果,以后如果出现问题,能够方便我们进行调试.</p>
<p>对于第二种情况一般是直接打印这个对象即可,但还要注意不能将用户的敏感信息打印出来,比如说密码,身份证号之类的敏感信息(代码举例,userController,用户实名接口)</p>
</section>
</section>
<section>
<p>另外一种情况是数据是一个集合类型,比如数组,List等.</p>
<p>这种如果没有特殊需求,只需要打印List的长度即可,不需要将所有的list中数据的具体值记录日志,因为这样会特别影响性能,而且打印长度基本也满足了我们对日志功能的需求.(代码举例,producController,查询产品列表接口)</p>
</section>
<section>
<h3>5.代码实战</h3>
</section>
<section>
<h3>6.扩展思考</h3>
</section>
<section>
<p>日志应当包括哪些要素?</p>
</section>
<section>
<p>基本的日志起码要包括以下几个要素</p>
<p>日期,时间(有的要求高的还要提供毫秒信息和时区);会话标识;日志级别;日志内容</p>
<p>日志内容包括上下文,不要只有一个Error,或者success最好是能够简单描述一下原因(代码实例,productController)</p>
</section>
<section>
<h3>7.参考文献</h3>
</section>
<section>
<p>参考一:<a href="https://http://ju.outofmemory.cn/entry/98674
" target="_blank">如何正确的打印日志</a></p>
<p>参考二:<a href="http://blog.jobbole.com/52018/
" target="_blank">写给开发者:记录日志的10个建议</a></p>
<p>参考三:<a href="http://www.infoq.com/cn/articles/why-and-how-log/
" target="_blank">日志记录的作用和方法</a></p>
</section>
<section>
<h3>8.更多讨论</h3>
</section>
<section>
<p>项目中打日志还有没有其他需要注意的问题或者关键点呢?</p>
</section>
<section>
<h4>鸣谢</h4>
<p>感谢大家观看</p>
<p><small>BY:张鑫</small></p>
</section>
</div>
</div>
<script src="./lib/reveal/js/head.min.js"></script>
<script src="./lib/reveal/reveal.js"></script>
<script>
// 以下为常见配置属性的默认值
// {
// controls: true, // 是否在右下角展示控制条
// progress: true, // 是否显示演示的进度条
// slideNumber: false, // 是否显示当前幻灯片的页数编号,也可以使用代码slideNumber: 'c / t' ,表示当前页/总页数。
// history: false, // 是否将每个幻灯片改变加入到浏览器的历史记录中去
// keyboard: true, // 是否启用键盘快捷键来导航
// overview: true, // 是否启用幻灯片的概览模式,可使用"Esc"或"o"键来切换概览模式
// center: true, // 是否将幻灯片垂直居中
// touch: true, // 是否在触屏设备上启用触摸滑动切换
// loop: false, // 是否循环演示
// rtl: false, // 是否将演示的方向变成RTL,即从右往左
// fragments: true, // 全局开启和关闭碎片。
// autoSlide: 0, // 两个幻灯片之间自动切换的时间间隔(毫秒),当设置成 0 的时候则禁止自动切换,该值可以被幻灯片上的 ` data-autoslide` 属性覆盖
// transition: 'default', // 切换过渡效果,有none/fade/slide/convex/concave/zoom
// transitionSpeed: 'default', // 过渡速度,default/fast/slow
// mouseWheel: true, //是否启用通过鼠标滚轮来切换幻灯片
// }
// 初始化幻灯片
Reveal.initialize({
history: true,
dependencies: [
{ src: './plugin/markdown/marked.js' },
{ src: './plugin/markdown/markdown.js' },
{ src: './plugin/notes/notes.js', async: true },
{ src: './plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }
]
});
</script>
<script>
//过滤掉小于 10 的数组元素:
//代码:
document.getElementById("a").onclick = isBigEnough();
function isBigEnough(element, index, array) {
return (element >= 10);
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
// 12, 130, 44
//结果:[12, 5, 8, 130, 44].filter(isBigEnough) : 12, 130, 44
console.log(filtered);
///11111111111
//检查是否有数组元素大于等于10:
document.getElementById("b").onclick = isBigEnoug();
function isBigEnoug(element, index, array) {
return (element >= 10);
}
var passed = [2, 5, 8, 1, 4].some(isBigEnoug);
// passed is false
passed2 = [12, 5, 8, 1, 4].some(isBigEnoug);
// passed is true
//结果:
//[2, 5, 8, 1, 4].some(isBigEnough) : false
//[12, 5, 8, 1, 4].some(isBigEnough) : true
console.log(passed);
console.log(passed2);
////2222222222222222222222
//将所有的数组元素转换为大写:
document.getElementById("c").onclick = makeUpperCase();
var strings = ["hello", "Array", "WORLD"];
function makeUpperCase(v)
{
return v.toUpperCase();
}
var uppers = strings.map(makeUpperCase);
// uppers is now ["HELLO", "ARRAY", "WORLD"]
// strings is unchanged
//结果:["hello", "Array", "WORLD"].map(makeUpperCase) : HELLO, ARRAY, WORLD
console.log(uppers);
/////333333333333333333
document.getElementById("d").onclick = printElt();
//打印数组内容:
function printElt(element, index, array) {
document.writeln("[" + index + "] is " + element + "<br />");
}
[2, 5, 9].forEach(printElt);
// Prints:
// [0] is 2
// [1] is 5
// [2] is 9
//结果:
//[0] is 2
//[1] is 5
//[2] is 9
/////////44444444444444
</script>
</body>
</html>
Contact GitHub API Training Shop Blog About
© 2017 GitHub, Inc. Terms Privacy Security Status Help