Пытаются рефакторинг кода, чтобы удалить дублирование


Мне очень нужна помощь, снимая некоторые дублирующегося кода. Я связала методов вызывает у меня вопросы. http://pastebin.com/cZJihM4J

Как видите, каждый метод делает подобные вещи, но получать разные значения. я.один метод, чтобы вставить строку в определенную линию. Другой, чтобы получить индекс строки, а другим, чтобы получить содержание в определенной строке

Есть такие вещи, как:

String text = textArea.getText();
int start = 0;
int count = 0;
String buildNewTextArea = "";

Я мог бы сделать эти ценности глобальные, но не уверен, что это лучший способ подойти к этому. Мой мозг не может найти от всего этого :(

Спасибо заранее

 public String insertCodeBlock(String newBlock) {
    String text = textArea.getText();
    int start = 0;
    int count = 0;
    String buildNewTextArea = "";
    while (start >= 0) {
        int nextLineStart = text.indexOf(NEW_LINE, start + NEW_LINE.length());
        if (nextLineStart == -1) {
            nextLineStart = text.length();
        }
        String[] temp = diffBlocks.get(indexOfLine).split(",");
        int startLine = Integer.valueOf(temp[0]);
        int endLine = (Integer.valueOf(temp[1]) - 1) + startLine;
        if (count == startLine) {
            buildNewTextArea += newBlock;
        } else if (count < startLine || count > (startLine + (endLine - startLine))) {
            buildNewTextArea += text.substring(start, nextLineStart);
        }
        count++;
        start = text.indexOf(NEW_LINE, nextLineStart);
    }
    return buildNewTextArea;
}

private int getLineIndex(int line) {
    String text = textArea.getText();
    int start = 0;
    int count = 0;
    String buildNewTextArea = "";
    int index = 0;
    while (start >= 0) {
        int nextLineStart = text.indexOf(NEW_LINE, start + NEW_LINE.length());
        if (nextLineStart == -1) {
            nextLineStart = text.length();
        }
        if (count == line) {
            return index;
        }
        buildNewTextArea = text.substring(start, nextLineStart);
        index += buildNewTextArea.length();
        count++;
        start = text.indexOf(NEW_LINE, nextLineStart);
    }
    return text.length();
}


public String getLineContent(int startLine, int endLine) {
    String text = textArea.getText();
    int start = 0;
    int count = 0;
    String buildNewTextArea = "";
    while (start >= 0) {
        int nextLineStart = text.indexOf(NEW_LINE, start + NEW_LINE.length());
        if (nextLineStart == -1) {
            nextLineStart = text.length();
        }
        if (count >= startLine && count <= endLine) {
            buildNewTextArea += text.substring(start, nextLineStart);
        }
        count++;
        start = text.indexOf(NEW_LINE, nextLineStart);
    }
    return buildNewTextArea;
}


313
3
задан 13 декабря 2011 в 04:12 Источник Поделиться
Комментарии
3 ответа

Может быть, это может помочь?

private static int getLineLength(String str, int line){
return str.split("\n")[line].length(); //line start 0
}
private static String getLineContent(String str, int startLine, int endLine){
String s = "";for(int i=startLine;i<=endLine;i++){s +=str.split("\n")[i] ;}return s;
}
private static String insertBlock(String sourceStr, String insertStr, int startLine, int endLine){
return getLineContent(sourceStr, 0, startLine).concat(insertStr).concat(getLineContent(sourceStr, endLine, sourceStr.split("\n").length-1));
}

1
ответ дан 13 декабря 2011 в 06:12 Источник Поделиться

Кажется, что каждый метод перебора списка строк и делать что-то. Это "что-то делает", что является уникальным. Рассмотреть один метод, который перебирает строки и принимает интерфейс, чтобы сделать "что-то". Для каждого метода, подходящего экземпляра интерфейс будет принят (возможно, анонимный внутренний класс), которая принимает соответствующие меры.

Что-то вроде этого:

private interface ProcessLine{
void processLine(String line, int index, int charIndex);
void complete();
}

private ProcessLine process(ProcessLine processor){
String text = textArea.getText();
int start = 0;
int count = 0;
String buildNewTextArea = "";
int index = 0;
while (start >= 0) {
int nextLineStart = text.indexOf(NEW_LINE, start + NEW_LINE.length());
if (nextLineStart == -1) {
nextLineStart = text.length();
}

processor.processLine(line, count);
index += buildNewTextArea.length();
count++;
start = text.indexOf(NEW_LINE, nextLineStart);
}
return processor;
}

private int getLineIndex(final int line) {
int result = -1;
return process(new ProcessLine(){
public void processLine(String line, int index, int charIndex){
if (index == line)
result = charIndex;
}
});
return result;
}

2
ответ дан 13 декабря 2011 в 05:12 Источник Поделиться

В духе 'чистый код', вы должны стремиться к тому, чтобы ваши методы как можно короче, и они должны сделать только одну вещь.

Для начала, следующий кандидат для выделения в отдельный метод

   int nextLineStart = text.indexOf(NEW_LINE, start + NEW_LINE.length());
if (nextLineStart == -1) {
nextLineStart = text.length();
}

Я был бы соблазн сделать следующие переменных экземпляра класса

String text = textArea.getText();
int start = 0;
int count = 0;

Это должно уменьшить много дублирующегося кода у вас есть, а остальное выглядит, чтобы быть специфическими для каждого метода.

1
ответ дан 13 декабря 2011 в 05:12 Источник Поделиться