2016-07-15 4 views
-1

Ich muss eine Formel mit bestimmten Eingabeparametern berechnen. Ich möchte einen Code erstellen, der die Best-Practice-Designprinzipien erfüllt. Während ich studiere, möchte ich von Anfang an Gutes tun. Grundsätzlich muss ich x wissen, wissend, dass es Ausgabe von Funktion f ist: x = f (a_1, a_2, a_3). Ich mache es in Eclipse. Ich habe beschlossen, 3 Klassen zu erstellen: Main, Calculation, Data. Wo von Haupt werde ich alles anrufen. Von Daten Ich werde verschiedene a_1, a_2, a_3 Arrays generieren und wieder an Main übergeben. Von der Berechnung werde ich berechnen. und dann zurück zum Main senden. Hier ist der Code:Wie Methode der Klasse 1 auf Objekt der Klasse 2 aufrufen, während in der Klasse 3 & ist es ein gutes Design?

public class Main{ 

public static void main( String args[]){ 

     double[] fArray = {160, 150}; 
     double[] aArray = {1, 1}; 
     double[] vArray = {0.2, 0.3}; 
     double[][] cArray = {{1, .5},{.5,1}}; 
     double time = 1; 
     for (int i=0,i<3,i++){ 
      Data myfirstobject = new Data(fArray, aArray, vArray, cArray, time); 
      System.out.println("message from main method"); 
     } 
    } 
} 

Dann Klasse Daten:

public class Data{ 

    public Data(double[] fArray, double[] aArray, double[] vArray, double[][] cArray, double time) { 
     System.out.println("This is my first parameterized constructor launched"); 

     System.out.println("This is my first output from costructor : " + fArray[0] + aArray[0] + vArray[0] + cArray[0][1] + time); 
     } 
} 

Schließlich Berechnungen:

public class Calc{ 

    public static double v_calc(double[] fArray,double[] aArray,double[] vArray,double[][] cArray,double time){ 
     double numerator = 0; 
     double denumerator = 0; 
     for (int k=0; k<fArray.length;k++){ 
      for (int j=0; j<fArray.length; j++) { 
       numerator = numerator + fArray[k]*fArray[j]*Math.exp(cArray[k][j]*vArray[k]*vArray[j]*time); 
       denumerator = denumerator + fArray[j]*fArray[k]; 
       } 
     } 
     return Math.pow(1/time * Math.log(numerator/denumerator), .5); 
    }   
} 

Meine Fragen: 1) Ist es richtig ausgelegt? Vor allem, wenn ich irgendwie (weiß noch nicht wie) die Methode von Calc auf Data-Objekt in der Hauptmethode aufrufen soll.

2) Warum stehe ich vor Schwierigkeiten, wenn ich im Konstruktor nicht schreiben:

Main myfirstobject = new Data(fArray, aArray, vArray, cArray, time); 

aber:

Main myfirstobject = new Data({160, 150},{1, 1},{0.2, 0.3},{{1, .5},{.5,1}},1); 

In diesem Fall habe ich Fehler.

PS. Wenn Sie einen wirklich schlechten Designfehler finden, sagen Sie es bitte.

+0

Sie können 'new double [] {160, 150}' anstelle von 'fArray' im Konstruktor schreiben. Die einzige Stelle, an der Sie 'new double []' nicht schreiben müssen, ist, wenn Sie das Array zum Zeitpunkt der Deklaration initialisieren, so wie Sie es mit 'double [] fArray = {160, 150};' getan haben. – Gendarme

+0

In Bezug auf 'Main myfirstobject = new Data (...': Erstens, seit Sie lernen, lassen Sie uns mit der richtigen Terminologie beginnen: dieser Code ist nicht in einem Konstruktor, sondern in einer statischen Methode. Zweitens, dieser Code sollte einen Fehler bei der Kompilierung geben, denke ich, da "Data" keine Unterklasse von "Main" zu sein scheint, möchten Sie wahrscheinlich 'Data myfirstobject = new Data schreiben (...' –

+0

jetzt ist es Sorry, ich habe kleinere Namen für StackOverflow erstellt und vergessen, dies zu ändern. – Jenya

Antwort

0

zuerst sollten Sie Datenobjekte in Hauptklasse schaffen statt Hauptobjekte

//dont do this Main myfirstobject = new Data(fArray, aArray, vArray, cArray, time); 
//insted do this 
Data myfirstobject = new Data(fArray, aArray, vArray, cArray, time); 

Sie müssen Objekte ‚Daten‘, nicht Objekte der Klasse ‚Main‘

Datenklasse sollten private Variablen enthalten speichern Die Daten und der Konstruktor sollten verwendet werden, um die Variablen zu initialisieren

public class Data { 
private double[]fArray,aArray,vArray; 
private double time; 
private double[][]cArray; 
public Data(double[] fArray, double[] aArray, double[] vArray, double[][] cArray, double time) { 
    System.out.println("This is my first parameterized constructor launched"); 
    // use this function System.arraycopy(source-array, source-index, dest-array, dest-index, lengthto-copy); 
    //or simply copy 
    this.fArray=new double[fArray.length]; 
    for(int i=0;i<fArray.length;i++) 
     this.fArray[i]=fArray[i]; 
    //and soon for other arrays 
    System.out.println("This is my first output from costructor : " + fArray[0] + aArray[0] + vArray[0] + cArray[0][1] + time); 
} 


//getter method to get fArray when needed for calculation in Calc class 
public double[] getFArray(){ 
    return fArray; 
} 

}

wie getFArray() Sie andere Methoden schreiben können andere Variablen

in Calc Klasse zu erhalten, sollten Sie den Prototyp der Funktion v_calc

public static double v_calc(Data myfirstobject){ 
     double[] fArray = myfirstobject.getFArray(); 
     double[] aArray=myfirstobject.getAArray(); 
     //calculate using fArray,aArray soon } 

zu

ändern und dann benutze Getter-Methoden (getFArray, getaArray usw., die du implementierst), um Werte der Daten zu erhalten, die du für Berechnungen verwenden willst und berechne

die Methode aufzurufen, dies zu tun:

double ans=Calc.v_calc(myfirstobject); 

Ihr Prototyp v_calc ist nicht falsch, aber in Objektorientiertes Design, ist es gute Praxis Objekt um zu passieren, wenn ganze Objekt benötigt wird.wie in diesem Fall benötigen Sie ganze meinFirstObjekt

es ist nicht einfach, auf den ersten zu verstehen.

für den zweiten Teil der Frage können Sie refrences an die Funktionen übergeben und nicht rohe Arrays innerhalb der Funktionen gemacht oder Sie müssen Platz für die Arrays, die nicht gut Design ist und sollte vermieden werden. Wenn Sie nicht wissen, wie es ist, nehmen Sie an, dass es so ist wie es ist. Sie werden es später verstehen

Verwandte Themen