已经实习一个月了,一点点感悟记录在这里。
1. 接到需求需要准备的工作
我们在公司里写需求,一般都是在已有代码的基础上做改动,除非是完全新的业务需求。改动已有代码就需要考虑这样几个问题:
- 这个需求对应的功能在系统中是如何工作的?流程是怎么样的?
- 这个需求涉及到哪一部分代码的改动?
- 进行开发的时候,需要注意什么?
第1点,实际上是在和产品明确需求、和团队成员明确分工的过程,同时也要评估需求的合理性,觉得可以完善的地方要提出来。在明确了需求之后,就是第2点,要找师兄询问现有系统的代码组成,然后分析这个需求涉及到哪些部分的代码,明确自己要开发的话要改动哪些文件。最后,就是进行实际的开发。因为我对开发的感悟多一点,所以重点说一下这一部分。
2. 开发过程需要注意的问题
2.1 避免修改已有程序的逻辑
写代码的过程中,要避免修改已有程序的逻辑,原则就是不能修改已有的功能。这里面分几种情况:
2.1.1 直接修改已有逻辑
写好的代码尽量不要动它!
有时,新开发的功能和现有的功能特别相似,但又有一点点的不一样。你可能会觉得,“直接改动已有的这个函数,让它适配新的功能就好了”。但就我个人经验来说,改动已有的代码虽然让代码看起来更短,没有太多重复部分,但带来的影响可能是你无法预料的。如果你没有写测试的习惯,来保证你直接修改已有代码不会破坏已有的代码逻辑的话,不如重新写一个函数,反正也只是复制过来改一改的事情。
2.1.2 间接修改已有逻辑
这里重点讲一讲对象浅拷贝修改。对象浅拷贝修改,是指在修改拷贝出来的对象的时候,间接修改了被拷贝的对象,导致破坏了已有的代码逻辑。先给出一个例子:
// Main.java
public class Main {
public static void main(String[] args) {
Student stu1 = new Student("zhangsan", new Score("Math", 90));
System.out.format("浅拷贝修改前,stu1.extInfo=%s\n", stu1.getExtInfo());
Student stu2 = stu1;
HashMap<String, Object> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("desc", "这是一个聪明的孩子");
stu2.setExtInfo(objectObjectHashMap);
System.out.format("浅拷贝修改前,stu1.extInfo=%s\n", stu1.getExtInfo());
}
}
/**
* 浅拷贝修改前,stu1.extInfo=null
* 浅拷贝修改前,stu1.extInfo={desc=这是一个聪明的孩子}
*/
// Student.java
public class Student {
String name;
Score score;
Map<String, Object> extInfo;
public Student() {}
public Student(String name, Score score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Score getScore() {
return score;
}
public void setScore(Score score) {
this.score = score;
}
public Map<String, Object> getExtInfo() {
return this.extInfo;
}
public void setExtInfo(Map<String, Object> extInfo) {
this.extInfo = extInfo;
}
}
// Score.java
public class Score {
String course;
int s;
public Score() {}
public Score(String course, int s) {
this.course = course;
this.s = s;
}
public String getCourse() {
return course;
}
public void setCourse(String course) {
this.course = course;
}
public int getS() {
return s;
}
public void setS(int s) {
this.s = s;
}
}
可以看到,当我想构造一个新的对象,如果这个对象是从已有对象中浅拷贝过来的,就会出现问题!这俄个代码比较简单,可能能够看出来。当涉及到很复杂的代码的时候,添加新的代码时一定要注意这个问题。
2.2 不要相信任何人的输入
任何函数在利用输入数据进行处理的时候,都一定要判断数据是否可用,尽管这个输入数据可能是自己输入的!这其中包括:
- 数据是否为空对象null
- String、Array等是否长度为0
- 数据是否符合预期的输入格式,比如Map中是否有预期的字段
- …
要确保程序能够正常处理这些边界情况,代码才不会在运行的过程中出现不可预期的结果。
2.3 接口设计原则
接口设计的原则是,用最小的字段集合,提供到上下游需要的信息。这其中包括:
- 不要有重复字段。当传递的信息中出现重复字段时,容易给上下游造成误解。
- 不要有多余字段。要明确业务分工,确定哪些字段是不需要要让上下游知道的,这样能够在保证数据不外泄的情况下,让上下游只关注于和自己业务相关的字段,保证接口清晰明了。