Java 重构两个代码
我的项目需要将两种类型的文本数据解析到数据库中 一种格式如下:Java 重构两个代码,java,refactoring,Java,Refactoring,我的项目需要将两种类型的文本数据解析到数据库中 一种格式如下: <lineNumber>19</lineNumber> <begin> 2013-08-15,2013-08-15,pek001,123456,08654071,CANX,,,,,,011 <end> 19 2013-08-152013-08-15,堪萨斯州PEK00112345608654071 一个是这样的 <lineNumber>27</line
<lineNumber>19</lineNumber>
<begin>
2013-08-15,2013-08-15,pek001,123456,08654071,CANX,,,,,,011
<end>
19
2013-08-152013-08-15,堪萨斯州PEK00112345608654071
一个是这样的
<lineNumber>27</lineNumber>
<begin>
2012-11-02,08683683,pek001,00001234,vvip,1
<end>
27
2012-11-02086833,PEK00100001234,vvip,1
这两个文本的区别在于开始标记和结束标记之间。
所以我们的解析代码出来了:
第一个是:
inputStreamReader = new InputStreamReader(new FileInputStream(FileOne),"gbk"); --different place
br=new BufferedReader(inputStreamReader);
lineNumber = 0;
boolean isDataContent = false;
while (br.ready()) {
String line = br.readLine();
if(line == null){
continue;
}
if(line.contains("<lineNumber>"))
{
try {
lineNumber = Integer.parseInt(StringTools.getDigitalInString(line));
} catch (NumberFormatException e) {
log.error("there is no lineNumber。");
}
continue;
}
if(line.trim().equals("<begin>"))
{
isDataContent = true;
continue;
}
if(line.trim().equals("<end>"))
{
break;
}
if(isDataContent)
{
insertFirstToDatabase(line,vo); --just this is different.
}
}
inputStreamReader=新的inputStreamReader(新文件InputStream(FileOne),“gbk”)--异地
br=新的BufferedReader(inputStreamReader);
行号=0;
布尔值isDataContent=false;
while(br.ready()){
String line=br.readLine();
如果(行==null){
继续;
}
如果(第行包含(“”))
{
试一试{
lineNumber=Integer.parseInt(StringTools.getDigitalInString(line));
}捕获(数字格式){
log.error(“没有行号”);
}
继续;
}
if(line.trim()等于(“”)
{
isDataContent=true;
继续;
}
if(line.trim()等于(“”)
{
打破
}
if(isDataContent)
{
insertFirstToDatabase(line,vo);--只是这是不同的。
}
}
第二个是:
inputStreamReader = new InputStreamReader(new FileInputStream(FileTwo),"gbk");
--different place
br=new BufferedReader(inputStreamReader);
lineNumber = 0;
boolean isDataContent = false;
while (br.ready()) {
String line = br.readLine();
if(line == null){
continue;
}
if(line.contains("<lineNumber>"))
{
try {
lineNumber = Integer.parseInt( StringTools.getDigitalInString(line));
} catch (NumberFormatException e) {
log.error("there is no lineNumber");
}
continue;
}
if(line.trim().equals("<begin>"))
{
isDataContent = true;
continue;
}
if(line.trim().equals("<end>"))
{
break;
}
if(isDataContent)
{
insertSecondToDatabase(line,vo); --only this is different.
}
}
inputStreamReader=新的inputStreamReader(新文件InputStream(文件二),“gbk”);
--异地
br=新的BufferedReader(inputStreamReader);
行号=0;
布尔值isDataContent=false;
while(br.ready()){
String line=br.readLine();
如果(行==null){
继续;
}
如果(第行包含(“”))
{
试一试{
lineNumber=Integer.parseInt(StringTools.getDigitalInString(line));
}捕获(数字格式){
日志错误(“没有行号”);
}
继续;
}
if(line.trim()等于(“”)
{
isDataContent=true;
继续;
}
if(line.trim()等于(“”)
{
打破
}
if(isDataContent)
{
insertSecondToDatabase(line,vo);--只是这是不同的。
}
}
这两段代码位于两个不同的服务代码中。我如何重构这个重复的代码?这样每个地方只需要调用一个相同的函数来检查行号 在一个类中包含重复的代码,该类由其他两个类继承(继承)或包含(组合)的副本。或者,您甚至可以将其作为实用程序类中的静态方法。您的代码在一条语句之前是相同的,并且没有显示您如何确定应该执行这些代码序列中的哪一个,只需将分支移到
if(isDataContent)
:
其中,
flagFirst
是一个布尔变量或布尔表达式,用于确定应执行哪些插入。您可以添加“种类”参数以选择usded插入方法,如下所示:
public void process(int kind) {
....
while (br.ready()) {
String line = br.readLine();
if(line == null){
continue;
}
if(line.contains("<lineNumber>"))
{
try {
lineNumber = Integer.parseInt( StringTools.getDigitalInString(line));
} catch (NumberFormatException e) {
log.error("there is no lineNumber");
}
continue;
}
if(line.trim().equals("<begin>"))
{
isDataContent = true;
continue;
}
if(line.trim().equals("<end>"))
{
break;
}
if(isDataContent)
{
if (kind == 1) {
insertFirstToDatabase(line,vo); --just this is different.
}
if (kind == 2) {
insertSecondToDatabase(line,vo); --only this is different.
}
}
}
}
公共作废流程(int类){
....
while(br.ready()){
String line=br.readLine();
如果(行==null){
继续;
}
如果(第行包含(“”))
{
试一试{
lineNumber=Integer.parseInt(StringTools.getDigitalInString(line));
}捕获(数字格式){
日志错误(“没有行号”);
}
继续;
}
if(line.trim()等于(“”)
{
isDataContent=true;
继续;
}
if(line.trim()等于(“”)
{
打破
}
if(isDataContent)
{
如果(种类==1){
insertFirstToDatabase(line,vo);--只是这是不同的。
}
如果(种类==2){
insertSecondToDatabase(line,vo);--只是这是不同的。
}
}
}
}
2件事:
我这可以在分析行时根据字段的顺序确定
(或)
二,。静态方法的被调用方可以通过发送一个标志来确定。但这不是一个好的设计。您在实用工具方法中放置了太多的实现,即两种行为。
(或)
iii.让静态方法解析XML,并只向被调用方返回行详细信息。让被叫人随意处理。第一个被调用方可能只想打印,第二个被调用方可能想放入数据库
public static LineDetails parseXML(String filename)
{
inputStreamReader = new InputStreamReader(new FileInputStream(new File(filename));
br=new BufferedReader(inputStreamReader);
lineNumber = 0;
boolean isDataContent = false;
LineDetails lineDetails = new LineDetails();
while (br.ready()) {
String line = br.readLine();
if(line == null){
continue;
}
if(line.contains("<lineNumber>"))
{
try {
lineNumber = Integer.parseInt( StringTools.getDigitalInString(line));
} catch (NumberFormatException e) {
log.error("there is no lineNumber");
}
lineDetails.setLineNumber(lineNumber);
continue;
}
if(line.trim().equals("<begin>"))
{
isDataContent = true;
continue;
}
if(line.trim().equals("<end>"))
{
break;
}
if(isDataContent)
{
// parse line
lineDetails.setLine(line);
}
}
return lineDetails;
}
如果有10多种文字怎么办?
public static LineDetails parseXML(String filename)
{
inputStreamReader = new InputStreamReader(new FileInputStream(new File(filename));
br=new BufferedReader(inputStreamReader);
lineNumber = 0;
boolean isDataContent = false;
LineDetails lineDetails = new LineDetails();
while (br.ready()) {
String line = br.readLine();
if(line == null){
continue;
}
if(line.contains("<lineNumber>"))
{
try {
lineNumber = Integer.parseInt( StringTools.getDigitalInString(line));
} catch (NumberFormatException e) {
log.error("there is no lineNumber");
}
lineDetails.setLineNumber(lineNumber);
continue;
}
if(line.trim().equals("<begin>"))
{
isDataContent = true;
continue;
}
if(line.trim().equals("<end>"))
{
break;
}
if(isDataContent)
{
// parse line
lineDetails.setLine(line);
}
}
return lineDetails;
}
public class LineDetails
{
private int lineNumber=0;
private String line="";
// getters setters
}
//First callee
methodA()
{
LineDetails lineDetails = parseXML(filename);
if(lineDetails!=null && lineDetails.getLineNumber==19 && lineDetails.getLine()!=null && !lineDetails.getLine.equals(""))
{
insertFirstToDatabase(line);
}
}
//Second callee
methodB()
{
LineDetails lineDetails = parseXML(filename);
if(lineDetails!=null && lineDetails.getLineNumber==27 && lineDetails.getLine()!=null && !lineDetails.getLine.equals(""))
{
insertSecondToDatabase(line);
}
}