2015-05-27 17 views
2

Я знаю, что означает сцепление и сцепление.
я получил следующий пример, и он имеет некоторые проблемы ремонтопригодности и поэтому она нуждается в некотором рефакторинге:Пример сцепления и сцепления (Рефакторинг кода)

Проблема заключается в том, что я не мог коснуться любое сочетание, сцепления или любой другой вопрос, ремонтопригодности, кроме глобальных переменных. Как я могу реорганизовать следующий код без этого глобального вопроса переменных (поскольку глобальные переменные увеличивают сложность & увеличивает код негибкость ?!)

double value; 
double min, max; 

public void read() 
{ 
    do 
    { 
     value = ConsoleInput.readDouble(); 
    } 
    while(value < min || value > max); 
} 

public double hyp() 
{ 
    double x, y; 
    min = 0.0; 
    max = 100.0; 
    read(); 
    x = value; 
    read(); 
    y = value; 
    return Math.sqrt(x * x + y * y); 
} 

Я думал, что это рефакторинг, как показано ниже:

public void read() 
{ 
    double value; 
    double min = 0.0; 
    double max = 100.0; 

    do 
    { 
     value = ConsoleInput.readDouble(); 
    } 
    while(value < min || value > max); 
} 

public double hyp() 
{ 
    double x, y; 
    read(); 
    x = value; 
    read(); 
    y = value; 
    return Math.sqrt(x * x + y * y); 
} 

ли это выглядит правильно? Или есть другой эффективный способ рефакторинга?

+0

You переменная 'значение' одинакова в методе' hyp'. Рефакторизованный метод 'read' теперь ничего не делает, потому что он не мутирует никакого состояния и не возвращает ничего. Поэтому я думаю, вы бы реорганизовали его с вашим предложением на ошибки. Не могли бы вы предоставить, может быть, больше кода, как называется метод 'hyp'? Откуда берется его входное значение «значение»? – DrunkenPope

+0

@DrunkenPope Да, действительно, я согласен с тем, что код не содержит достаточной информации о вызове методов, но именно так я нашел пример, изучая модульность кода. – Dee

+0

@DrunkenPope На самом деле метод 'hyp()' не нуждается ни в каком входном параметре, я только что отредактировал его. – Dee

ответ

2

реорганизовать метод read() так:

public double read(double min, double max) 

Таким образом, вместо сохранения значения в глобальном, то вернуть его из функции

+1

@ControlAltDel Вы имеете в виду что-то вроде 'public double read (double x, double y)'? но я думаю, что это не сработает, если пользователь хочет ввести разные значения для x и y – Dee

+1

@shekharsuman '... бесполезно увеличивая сложность ...' неправда. То, что я сделал, делает метод безстоящим. Если вы не видите преимуществ в этом, вы должны больше узнать о состоянии и отсутствии безгражданства. – ControlAltDel

+0

@ Да нет, я имею в виду именно то, что я написал. Таким образом, в запросе на чтение значения min и max будут передаваться как параметры, а не определены в переменных объекта. Это делает функцию безстоящей по сравнению с предыдущим состоянием состояния – ControlAltDel

0

на основе информации, предоставленной вами, я хотел бы предложить следующее :

public double read() { 
    // set value to a not accepted value to start the while-loop 
    double value = -1; 
    double min = 0.0; 
    double max = 100.0; 

    while(value < min || value > max) { 
     value = ConsoleInput.readDouble(); 
    } 
    return value; 
} 

public double hyp() { 
    double x = read(); 
    double y = read(); 
    return Math.sqrt(x * x + y * y); 
} 
+0

Но метод 'read()' не возвращает двойное значение (его пустота). Возникает проблема в 'double x = read();' и 'double y = read()'? – Dee

+0

Итак, метод 'read()' должен быть заменен на 'public double read()' и добавить 'return value;' statement – Dee

+0

Да, извините, пропустил, чтобы изменить это. – DrunkenPope

0

Имея «глобальные переменные», как min и max абсолютно нормально, если они являются «глобальными» только я nside собственный класс - это то, как предполагается использовать переменные класса.

Однако значение «читать» должно возвращать значение, а не вставлять его в некоторую переменную класса, а затем использовать. Также было бы неплохо создать экземпляр класса с min и max в конструкторе для максимальной гибкости, но также иметь конструктор по умолчанию.

public class GoodApp { 

    private double min, max; 

    public GoodApp(double min, double max){ 
     this.min = min; 
     this.max = max; 
    } 

    public GoodApp(){ 
     this(1,100); 
    } 

    public double read() { 
     double value; 
     do { 
      value = ConsoleInput.readDouble(); 
     } while (value < min || value > max); 
     return value; 
    } 


    public double hyp() { 
     double x, y; 
     x = read(); 
     y = read(); 
     return Math.sqrt(x * x + y * y); 
    } 
} 
+0

Я не совсем понял, что делает 'public метод GoodApp()' здесь? Я имею в виду, что я не получил этого (1,100); '? – Dee

+0

Dee - это конструкторы, google them – libik

+0

Я понимаю, что это конструктор, но что означает 'this (1,100)'? – Dee

0

Вот моя версия. Немногие пункты, о которых нужно помнить - метод должен правильно раскрывать свои зависимости (что зависит от того, как это происходит при инъекции зависимостей), иначе это может быть лжецом. Кроме того, ваш метод read не использует состояние текущего объекта (то есть он не использует ссылку this). Таким образом, он может быть статическим (но это требует жесткого тестирования модулей - если это вас беспокоит).

Итак, я хотел бы предложить следующее (Это может показаться излишним для этой небольшой программы. - но хорошо в реальных проектах времени Это уменьшает сцепление, потому что вы можете нажать любую реализацию ReadData) -

enum Bound{ 

MAX(100.0), MIN(0.0); 

public double value(){ 
    return this.value; 
} 

private final double value; 

private Bound(double value){ 
    this.value = value; 
} 

} 


public class CalcHyp{ 

ReadData readData; 

CalcHyp(ReadData readData){ 
    this.readData = readData; 
} 

public double hyp() { 
    double x = readData.read(); 
    double y = readData.read(); 
    return Math.sqrt(x * x + y * y); 
} 

public static void main(String[] args) { 
    CalcHyp calcHyp = new CalcHyp(new ReadData());//Declare the dependencies.(Dependency Injection) 
    System.out.println(calcHyp.hyp()); 
} 

} 

class ReadData{ //Can declare an interface in real time, and various implementations based on your requirement. 

    double read() { 

    double value = Bound.MAX.value()+1; 
    while(value < Bound.MIN.value() || value > Bound.MAX.value()) { 
     value = ConsoleInput.readDouble(); 
    } 
    return value; 
} 
}