test
####工作内容
1. 自学__markdown__语法。
2. 参加培训课程,听老师__讲解考试题目__。
3. 组织__小组会议__,讨论题目中出现的问题,总结老师所讲内容。
___
###心得体会
下午听朱仕智老师讲解了昨天的考试题目,下面对重点内容进行总结:
* 不管是小作业还是之后的项目,拿到问题后,首先应该对问题进行__分解__,而不是盲目的开始编码。需要对问题进行__抽象__,找到解决问题需要的步骤,按照步骤设置处理函数,使程序层次分明,提高可读性和可维护性。
* 常量名大写,以下划线分割。例如`CONTEXT_PATH`。
* 变量名称需要包含一定的信息,增强可读性,即使脱离上下文环境,也能读懂其含义,避免诸如`BufferedReader br`类写法。
* __处理错误__方式:
> 1. 直接失败
> 2. 重试
> 3. ...
* 在函数中,尽量使用返回值来获取所需值,不要使用__全局变量__,因为当有多个方法同时操作该全局变量时,容易产生错误。也不要过多的使用引用参数,在程序中对引用参数进行修改,这种方法降低了程序的可读性。
* 老师简单介绍了__log4j__的使用,由于昨天自学了这部分知识,今天能够较好的理解老师所讲内容,体现了预习的重要性。需要注意的是,将日志输出时 的字符串拼接改为__占位符__,因为如果日志输出级别较高,如 `INFO`,那么`DEBUG`级别的logger都不会输出,但是字符串拼接过程仍然会执行,带来额外的计算。
* __面向接口编程__:如果接口能够满足要求,尽量对接口进行操作,如
```java
List<String> list = new LinkedList<String>();
```
这样如果改变具体实现方式,只需要改变后面`LinkedList`,提高代码的可维护行。
* 关闭流__代码重用__,提取出来作为公共方法。而且,关闭流时要单独关闭,单独try...catch。
* 对于日期等内容,在类中最好使用对应的`Date`类型进行存储,不要使用String类,因为String不仅包含了时间含义,还包含了具体的格式。
* 慎用Map,因为Map是键值对,可以表示任何东西,可能降低了代码可读性。
* 公司要求,__单行代码也要加括号__。
* `toString()`方法不要写死,除非输出格式一定不变。可以考虑将输出方法留给外部定义。
* 写文件时考虑系统差异,即代码的__可移植性__,多使用系统变量。
* `System.out.println();`底层是__synchronized__,也就是说同步方法,会造成堵塞,尽量避免使用。
* 时刻注意__代码重用__,单个函数完成简单的功能,同时注意代码__可读性__,没有性能瓶颈时不要盲目优化。
* 预见可变性,设置变量和配置文件,方便__代码重构__。
* 大多数情况下一行一行的读文件,所以将其抽取出来作为__公共方法__,例如`IOUtil`类。
```java
public static List<String> readLines(File file, Charset charset)
throws IOException {
// don't use asCharSource(file, charset).readLines() because that returns
// an immutable list, which would change the behavior of this method
return readLines(file, charset, new LineProcessor<List<String>>() {
final List<String> result = Lists.newArrayList();
@Override
public boolean processLine(String line) {
result.add(line);
return true;
}
@Override
public List<String> getResult() {
return result;
}
});
}
```
* 每个函数最开始,应该设置必要的__参数检查__,如`checkNotNull()`等方法。
* 建议不要用类去实现Comparable接口,而是使用外部的__比较器__,除非确定比较方法不便,提高可维护性。
* 了解__函数式编程__、__延迟加载__等知识点。
对markdown的基本用法进行了总结,并使用markdown写日报和知识总结,以后也要如此,日积月累。
___
###问题
1. 对面向对象编程理解不够深入,方法提取,问题抽象能力不够深入。
2. 从学校到企业的思想转变仍需努力,很多情况下不能只是考虑时间复杂度和空间复杂度,还要考虑代码的可读性,可维护性和可复用性等。
3. 对很多新的技术不是很了解,包括Guava、函数式编程、延迟加载等,对已有知识的理解也不够,包括异常处理,日志管理等,在接下来的学习中需要加强。
___
###明日计划
1. 原定的JUnit学习并未完成,明日继续努力。
2. 上午提交入职材料。
3. 了解Guava源码,修改自己的代码。
4. 完成练习作业。