2012-03-16 64 views
2

所以我有一個實例化一個實例字段String[][] myArray與值的方法。糟糕的編程習慣使方法依賴於另一種方法?

String[][] myArray; 

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

然而,然後我有一個名爲getAvg()方法,得到列的平均在數組中。這使用現在用數據實例化的實例字段。麻煩的是,如果數組沒有先創建,這顯然不會運行。在我的程序中,我在調用平均值之前創建了數組,並且它工作正常。但我想知道這是否是最優雅的方法,如果這可能是不好的做法。

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

我以前重新創建了getAvg()方法中的數組。但是,這導致我認爲這會是多餘和低效的。

所以,你有什麼感想?

+3

不要擔心「效率」,擔心*清晰*。通常在編程時,過度關注副作用(取決於共享*可變狀態的方法)。然而,在這種情況下,「傳遞價值」和「獲取價值」會更清晰,正如您已經注意到的那樣:)這會減少耦合,提高線程安全性並允許重新進入。 – 2012-03-16 23:29:12

+1

數組的數據來自哪裏?一個inputStream?我很難理解你在問什麼。你有一個字符串數組,你計算平均值。你應該張貼您的代碼。 – kasavbere 2012-03-16 23:32:37

回答

2

是的,這是不好的做法。通常(有例外,但不是很多),一個類需要的所有數據應該在構造函數返回時做好準備。什麼重命名getArrayinitializeMyArray,使其成爲私人,並在構造函數發出呼叫initializeMyArray?然後,每當一些外部代碼調用getAvg(),myArray將被初始化。

0

另一個想法是將數據結構傳遞到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; 
} 

,消除了依賴。即使是除了班級以外的客戶,它也會很有用。

爲什麼您使用的這些數據結構?雙打平均來自哪裏?

0

如果可以避免getAvg()函數調用getArray(),否則每次調用getAvg()時都會創建一個新的String [] []。在其他方法中調用方法時要遵循的經驗法則是,如果它使代碼更容易理解並且不會使程序變慢,那麼遵循該法則。

問題,但...沒有任何理由,爲什麼你不能使用雙[] []呢?將字符串解析爲雙精度是非常慢的,我假設這就是您每次使用getAvg()函數查找字符串[] []以獲取列數據時所要做的。使用double [] []會快得多。

0

您可以使用您的構造函數類的強制在實例化時數組創作:

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