Плохая практика программирования иметь метод, зависящий от другого метода? - PullRequest
2 голосов
/ 17 марта 2012

Итак, у меня есть метод, который создает экземпляр поля String[][] myArray со значениями.

String[][] myArray;

public String[][] getArray() {
    // CREATES, RETURNS & INSTANTIATES myArray WITH ARRAY
}

Однако у меня есть метод getAvg (), который получает среднее значение столбца в массиве. При этом используется поле экземпляра, которое теперь создается с данными. Проблема в том, что это, очевидно, не будет работать, если массив не был создан первым. В моей программе я создаю массив перед вызовом среднего, и он работает. Но мне интересно, если это самый элегантный из методов и может ли это быть даже плохой практикой.

public double getAvg() {
    // CALCULATES AND RETURNS AVERAGE
}

Ранее я воссоздал массив в методе getAvg (). Однако это привело меня к мысли, что это будет излишним и неэффективным.

Итак, что вы думаете?

Ответы [ 4 ]

2 голосов
/ 17 марта 2012

Да, это плохая практика. В общем случае (есть исключения, но их немного), все данные, которые нужны классу, должны быть готовы к моменту возвращения конструктора. Как насчет переименования getArray в initializeMyArray, сделать его приватным и поместить вызов в initializeMyArray в конструкторе? Затем, всякий раз, когда некоторые вызовы внешнего кода getAvg(), myArray будут инициализированы.

0 голосов
/ 17 марта 2012

Вы можете использовать конструктор вашего класса для принудительного создания массива во время создания экземпляра:

public class MyClass {
    String[][] myArray;

    public MyClass() {
        getArray();
    }

    public String[][] getArray() {
        // CREATES, RETURNS & INSTANTIATES myArray WITH ARRAY
    }
    public double getAvg() {
        // CALCULATES AND RETURNS AVERAGE
    }
}

И вы можете использовать его так:

MyClass myClass = new MyClass(); // class is instantiated and getArray() is run automatically
myClass->getAvg(); // your code is now safe to run on that array
0 голосов
/ 17 марта 2012

Определенно лучше не использовать функцию getAvg () для вызова getArray (), если этого можно избежать, в противном случае вы будете создавать новую String [] [] каждый раз, когда вызываете getAvg (). При вызове методов внутри других методов следует придерживаться хорошего практического правила: делайте это, если это облегчает понимание кода и не замедляет работу программы.

Вопрос, хотя ... есть ли причина, по которой вы не можете использовать вместо него двойной [] []? Разбор строк в double очень медленный, и я предполагаю, что это то, что вы делаете каждый раз, когда ваша функция getAvg () ищет в String [] [] данные столбца. Использование double [] [] будет намного быстрее.

0 голосов
/ 17 марта 2012

Другая идея - передать структуру данных в getAve():

public static double getAve(String [][] values) {
    double ave = 0.0;
    // What are you averaging?  That's a matrix of Strings you're passing....
    return ave;
}

Это устраняет зависимость. Это будет полезно даже для клиентов, кроме вашего класса.

Почему вы используете эту структуру данных? Откуда берутся средние числа?

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