<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">第五次课,老师考虑到到这节课为止,我们已经写了很多代码,但是不知道如何管理,所以把源代码管理这方面的知识传授给我们。</span>
一、讲到了源代码管理的重要性:
(1)源代码是重要知识资产;
(2)源代码中涉及的敏感信息泄露可能会带来数据安全性问题,要做好数据安全方面的保密工作;
(3)另外,源代码也需具有一定的开放性;
(4)管理好源代码可以避免重复造“车轮子”的问题。
二、源代码的管理措施
(1)严格控制工作设备;(2)使用管理工具:git、svn、cvs、tfs等
(3)提高员工工作素质,特别是职业道德。
三、源代码的管理工具
(1)cvs:通过一个中心版本控制系统来记录文件版本-->早期(2)svn:即版本控制系统,Subversion的简称。是一个开发源代码的版本控制系统。它采用分支管理系统。-->现在比较流行
(3)git:开源的分布式版本控制系统。能敏捷高效地处理小、大型项目。-->现在比较流行
国内源代码管理软件:code csdn;国外:github、gitlab。
(4)tfs:Taobao FileSystem,分布式文件系统四:svn安装及使用:
安装完VisualSVN Server和TortoiseSVN后,新建仓库,选择“Single-project respository(with the top-level 'trunk','branches' and ‘tag’ folders)”,以下是这三个文件的介绍:
(1)trunk:主分支,主开发目录,日常开发的地方
(2)branches:分支线,分支开发目录,一些阶段性的release版本,这些版本可以继续开发和维护,如修复bug
(3)tags:标签干线,tag存档目录,存储阶段性的发布版本,不应修改
五、在使用svn以小组形式优化上次作业代码时的总结及思考:
这次,老师让我们以小组的形式,使用svn对上次的作业(把数字转成人民币大写形式)进行优化。
我和宏心是一组,一开始,我用我的代码建立一个仓库(名称为rmb),并创建了两个用户,rmb这个仓库允许这两个用户读和写仓库。接着我们就进行优化代码的工作,由于事先我们没有沟通好,导致我的修改后代码在提交时和宏心的发生了冲突(他已经提交了一次代码)。通过这个,我真正明白了团队合作中沟通的重要性,一开始我把代码的总的处理方法(我命名为handle)都修改了,而宏心只是修改除了handle外的其他分支方法,所以导致了他提交了一次代码,但是我提交的时候,发生了冲突。事后,我们虽然也做了一些沟通协调,但是我们深深领悟到:在进行团队合作之前沟通好、明确自己负责哪一部分工作这一个步骤是多么重要。前车之鉴,后事之师!!!希望以后这个教训都要牢记于心!
六、在上次作业代码的优化过程中的思考:
/* 在使用svn时,对上次作业代码进行了如下优化:
因为上次代码有太多的冗余部分,比如,GUI的文本框获得的String类型的数据,转换为double类型的数据,这是可以优化的。
优化之前,程序一个很低效率的地方是:对转换后的double类型变量的值(一开始是文本框得到的字符串)还要进行是否为科学计数法形式的数的判断(1000万以上的数,控制台输出为“x.xxEx”这种形式,如1.0E8,1000万以下的数就直接输出)以及根据不同的判断结果执行不同的步骤;
优化后,输入的数要求如下:整数1-12位,必须有小数点,小数部分1-2位。接着,以小数点位基准,分离输入的数(String类型),根据整数部分的长度进行相应的前补0操作,以得到包含了12个数字的字符串,然后进行相应高四位(千亿、百亿、十亿、亿)、中四位(千万、百万、十万、万)、低四位(千、百、十、个)的人民币大写转换操作;小数部分的处理步骤:如果用户输入的是一个数,则在分位补0,接着进行小数部分的人民币大写转换操作
*/
package homework;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/**
*
* @author cmz
* @version v2.3
* @dateTime 2016/05/23
*/
public class RMBChange extends JFrame {
/**
* 输入一个double类型的数,格式为xxx.xx,把它转为人民币大写的形式
*
* @remark 根据所输入的数,对它的小数位、
* 低四位(个十百千)、中四位(萬、十萬、百萬、千萬)、高四位(亿、十亿、百亿、千亿)各自进行处理
*/
String result = "";
JLabel jl_d;
JTextField jtf_d;
JButton jbt_submit, jbt_reset, jbt_cancel;
JTextArea jta_result;
public RMBChange() {
jl_d = new JLabel("请输入一个double类型最高12位的数,格式为xx.xx:");
jtf_d = new JTextField();
jbt_submit = new JButton("确定");
jbt_reset = new JButton("重置");
jbt_cancel = new JButton("取消");
jta_result = new JTextArea("");
// JTextArea为不可编辑
jta_result.setEditable(false);
// 设置JTextArea内的字体、风格、字号
Font f = new Font("Courier", Font.BOLD, 20);
jta_result.setFont(f);
jl_d.setHorizontalAlignment(0);
JPanel p1 = new JPanel();
p1.setLayout(new GridLayout(1, 2, 5, 5));
p1.add(jl_d);
p1.add(jtf_d);
JPanel p2 = new JPanel();
p2.setLayout(new GridLayout(1, 3, 5, 5));
p2.add(jbt_submit);
p2.add(jbt_reset);
p2.add(jbt_cancel);
JPanel p3 = new JPanel();
p3.setLayout(new GridLayout(2, 1, 5, 5));
p3.add(p1);
p3.add(p2);
add(p3, BorderLayout.NORTH);
add(jta_result, BorderLayout.CENTER);
// 提交输入的数字
jbt_submit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String number = jtf_d.getText();
//规定用户输入数字时应遵守的格式:整数部分1-12位,必须有小数点,小数部分1-2位
Pattern pattern = Pattern
.compile("^\\d{1,12}\\.{1}\\d{1,2}$");
Matcher matcher = pattern.matcher(number);
if (number.equals(new String(""))) {
JOptionPane.showMessageDialog(null, "输入的数字为空!");
} else {
if (matcher.matches()) {
// 获取用户输入的数字,字符串形式
result = handle(number);
jta_result.setText(result);
} else {
JOptionPane.showMessageDialog(null, "数字格式错误!");
}
}
}
});
// 重置
jbt_reset.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jtf_d.setText("");
jta_result.setText("");
}
});
// 取消退出
jbt_cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
RMBChange rmbChange = new RMBChange();
rmbChange.setVisible(true);
rmbChange.setTitle("人民币大写转换");
rmbChange.setSize(650, 450);
rmbChange.setLocationRelativeTo(null);
rmbChange.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public String handle(String number) {
String result = "";
//以小数点位分界分解数字
String [] splitIntegerAndDecimal = number.split("\\.");
int lengthOfNumber = splitIntegerAndDecimal[0].length();
//根据整数部分的长度进行相应的前补0操作,从而得到12个数字
// number == 1亿
//number=100亿
if (lengthOfNumber == 11) {
number = "0"+ number;
}
// number=10亿
else if (lengthOfNumber == 10) {
number = "00"+ number;
}
else if (lengthOfNumber == 9) {
number = "000"+ number;
}
//number=1000萬
else if (lengthOfNumber == 8) {
number = "0000"+ number;
}
//number=100萬
else if (lengthOfNumber == 7) {
number = "00000"+ number;
}
//number=10萬
else if (lengthOfNumber == 6) {
number = "000000"+ number;
}
//number=1萬
else if (lengthOfNumber == 5) {
number = "0000000"+ number;
}
//number=1000
else if (lengthOfNumber == 4) {
number = "00000000"+ number;
}
//number=100
else if (lengthOfNumber == 3) {
number = "000000000"+ number;
}
//number=10
else if (lengthOfNumber == 2) {
number = "0000000000"+ number;
}
//number=1
else if (lengthOfNumber == 1) {
number = "00000000000" + number;
}
String[] arrayOfNumber = number.split("");
int [] valueOfWei = new int [12];
//获取整数部分每一位的值
for (int i = 1; i <= 12; i++) {
valueOfWei[i - 1] = Integer.parseInt(arrayOfNumber[i]);
}
result += meiSiWei(valueOfWei[0], valueOfWei[1], valueOfWei[2], valueOfWei[3],0);
result += meiSiWei(valueOfWei[4], valueOfWei[5], valueOfWei[6], valueOfWei[7],1);
//取小数
int decimal;
int lengthOfDecimal = splitIntegerAndDecimal[1].length();
//如果小数部分只有一位,则在分位补0
if(lengthOfDecimal == 1){
decimal = Integer.parseInt(splitIntegerAndDecimal[1]);
decimal *= 10;
}
else {
decimal = Integer.parseInt(splitIntegerAndDecimal[1]);
}
result += meiSiWei(valueOfWei[8], valueOfWei[9], valueOfWei[10], valueOfWei[11], 2)
+ decimal(decimal);
//处理一些特殊情况
//前面有“零”,去掉
String [] arrayOfResult = result.split("");
if (arrayOfResult[1].equals(new String("零"))) {
result = result.substring(1);
}
//处理“0.00”这种特殊情况,因为输出的是“整”,所以需要修改为“零圆”
if (arrayOfResult.length == 2 && arrayOfResult[1].equals(new String("整"))) {
result = "零圆";
}
return result;
}
//整数部分12位,即3段中,以及每一段的每一位都转换成人民币大写形式
public String meiSiWei(int qian, int bai, int shi, int ge ,int index) {
String result = "";
//单位分高四位、中四位、低四位这3种情况
String unit [] = {"亿","萬","圆"};
int i = -1;
if (index == 0) {
i = 0;
}
else if (index == 1) {
i = 1;
}
else if (index == 2) {
i = 2;
}
// 16种(2*2*2*2),integer为0或非0两种选择,x代表为0,,y代表非0
// xxxx
if (qian == 0 && bai == 0 && shi == 0 && ge == 0) {
result += "";
}
// xxxy
else if (qian == 0 && bai == 0 && shi == 0 && ge != 0) {
result += "零" + digitToChinese(ge) + unit[i];
}
// xxyx
else if (qian == 0 && bai == 0 && shi != 0 && ge == 0) {
result += "零" + digitToChinese(shi) + "拾" + unit[i];
}
// xyxx
else if (qian == 0 && bai != 0 && shi == 0 && ge == 0) {
result += "零" + digitToChinese(bai) + unit[i];
}
// xyyx
else if (qian == 0 && bai != 0 && shi != 0 && ge == 0) {
result += "零" + digitToChinese(bai) + "佰"
+ digitToChinese(shi) + "拾" + unit[i];
}
// xyxy
else if (qian == 0 && bai != 0 && shi == 0 && ge != 0) {
result += "零" + digitToChinese(bai) + "佰零"
+ digitToChinese(ge) + unit[i];
}
// xyyy
else if (qian == 0 && bai != 0 && shi != 0 && ge != 0) {
result += "零" + digitToChinese(bai) + "佰"
+ digitToChinese(shi) + "拾" + digitToChinese(ge) + unit[i];
}
// xxyy
else if (qian == 0 && bai == 0 && shi != 0 && ge != 0) {
result += "零" + digitToChinese(shi) + "拾"
+ digitToChinese(ge) + unit[i];
}
// yyyy
else if (qian != 0 && bai != 0 && shi != 0 && ge != 0) {
result += digitToChinese(qian) + "仟" + digitToChinese(bai)
+ "佰" + digitToChinese(shi) + "拾" + digitToChinese(ge)
+ unit[i];
}
// yxxx
else if (qian != 0 && bai == 0 && shi == 0 && ge == 0) {
result += digitToChinese(qian) + "仟" + unit[i];
}
// yxxy
else if (qian != 0 && bai == 0 && shi == 0 && ge != 0) {
result += digitToChinese(qian) + "仟零" + digitToChinese(ge)
+ unit[i];
}
// yxyx
else if (qian != 0 && bai == 0 && shi != 0 && ge == 0) {
result += digitToChinese(qian) + "仟零" + digitToChinese(shi)
+ "拾" + unit[i];
}
// yyxx
else if (qian != 0 && bai != 0 && shi == 0 && ge == 0) {
result += digitToChinese(qian) + "仟" + digitToChinese(bai)
+ "佰" + unit[i];
}
// yxyy
else if (qian != 0 && bai == 0 && shi != 0 && ge != 0) {
result += digitToChinese(qian) + "仟零" + digitToChinese(shi)
+ "拾" + digitToChinese(ge) + unit[i];
}
// yyxy
else if (qian != 0 && bai != 0 && shi == 0 && ge != 0) {
result += digitToChinese(qian) + "仟" + digitToChinese(bai)
+ "佰零" + digitToChinese(ge) + unit[i];
}
// yyyx
else if (qian != 0 && bai != 0 && shi != 0 && ge == 0) {
result += digitToChinese(qian) + "仟" + digitToChinese(bai)
+ "佰" + digitToChinese(shi) + "拾" + unit[i];
}
return result;
}
//小数部分转换成人民币大写形式
public String decimal(int decimal) {
String result = "";
int jiao = decimal / 10;
int fen = decimal % 10;
if (jiao == 0 && fen == 0) {
result += "整";
} else {
if (jiao != 0 && fen == 0) {
result += digitToChinese(jiao) + "角";
} else if (jiao == 0 && fen != 0) {
result += digitToChinese(fen) + "分";
} else if (jiao != 0 && fen != 0) {
result += digitToChinese(jiao) + "角" + digitToChinese(fen)
+ "分";
}
}
return result;
}
//每个阿拉伯数字转换成人民币大写形式
public String digitToChinese(int integer) {
String result = "";
if (integer == 1) {
result = "壹";
} else if (integer == 2) {
result = "贰";
} else if (integer == 3) {
result = "叁";
} else if (integer == 4) {
result = "肆";
} else if (integer == 5) {
result = "伍";
} else if (integer == 6) {
result = "陆";
} else if (integer == 7) {
result = "柒";
} else if (integer == 8) {
result = "捌";
} else if (integer == 9) {
result = "玖";
}
return result;
}
}
1、部分结构、实现相似的的方法可以合并成一个方法。上个版本(v2.2)的处理高四位(千亿、百亿、十亿、亿)的方法highFour、处理中四位(千万、百万、十万、万)的方法middleFour、处理低四位(千、百、十、个)的方法lowFour,这3个方法结构和实现都相似,所以在优化版本(v2.3)中,我把这3个方法整合为一个方法meisiwei。
2、当代码比较长、显得比较冗余时,试着去再优化一下。