Erste Schritte Aufbau eines kleinen Matrizen-Programms(MVC; OOP)

Ukasz93

Mitglied
Guten Tag allerseits,

ich habe noch nicht so viel Erfahrung im Programmieren und kleine Probleme, was das OOP angeht. Habe im WiSe 17/18 angefangen zu studieren und habe folgende Aufgabe:
Ich soll ein Programm mit einem 2 dimensionalen Array schreiben, dass eine Matrix repräsentiert. Die Zahlen der Matrizen sollen per Zufall eingetragen werden und das Programm soll in der Lage sein, zwei Matrizen und Addieren und Multiplizieren.

(In einer späteren Aufgabe soll dieses Programm erweitert werden für nxn Matrizen, wobei die Größe n der Matrizen vom Anwender über die Tastatur eingeben werden soll und man soll dies mit for-Schleifen lösen)

Meine Frage ist, wie ein solches Programm aussehen sollte (bezüglich MVC und OOP).
Wie sollen die Packages und Klassen gegliedert sein? Wie viele Klassen erstelle ich dafür? Ist es sinnvoll in einer Klasse die Matrix an sich und alle Methoden(matrixErzeugen, matrixAddition, matrixMultiplikation) zu schreiben? Oder wäre es besser(objektorientierter?) in einer zweiten Klasse die Methoden für die Addition und Multiplikation zu schreiben?

Mein Ansatz:

Im Control Package:
Main
Im Model Package:
- Matrix (Deklaration einer Matrix sowie Methode zum generieren der Zuzfallszahlen)
- Matrixaddition - mit nur der Methode zur Addition
- MatrixMultiplikation - mit nur der Methode zur Multiplikation
- sowie einer Klasse zum Erzeugen von Matrizen sowie ausführen der Methoden
Im View Package:
- Eine Klasse, die eine Matrix ausgibt

Ich würde mich über Hilfe bzw. Tipps sehr freuen😀

Gruß

Lukas
 
Ist es sinnvoll in einer Klasse die Matrix an sich und alle Methoden(matrixErzeugen, matrixAddition, matrixMultiplikation) zu schreiben? Oder wäre es besser(objektorientierter?) in einer zweiten Klasse die Methoden für die Addition und Multiplikation zu schreiben?
Eine Mischung aus beiden - generell die Methoden in die Matrix-Klasse, die zum erzeugen würde ich allerdings in eine eigene Klasse auslagern.
 
@mrBrown
so sehe ich das auch. Allerdings brauche ich eventuell doch jetzt ein wenig Hilfe beim Code, deswegen poste ich es mal 😀

Dies ist im Package model

Java:
package model;

/**
*
* @author Lukas
*/
public class Matrix {
   
    private String name;
    private int[][] Matrix = new int[2][2];
    private static int[][] AdditionErgebnis = new int[2][2];
   
    public int[][] matrixAufrufen(){
        matrixErzeugen();
       
        return Matrix;
       
    }
   
    private int[][] matrixErzeugen(){
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
                Matrix[i][j] = (int)(Math.random()*9+1);
            }
        }
    return Matrix;
    }
   
    private int[][] matrixAddition(Matrix a, Matrix b){
        //int[][] AdditionErgebnis = new int[2][2];
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
                AdditionErgebnis[i][j] = a.getMatrix()[i][j] + b.getMatrix()[i][j];
            }
        }
    return AdditionErgebnis;
    }
   
    private int[][] matrixMultiplikation(Matrix a, Matrix b){
        int[][] MultiplikationErgebnis = new int[2][2];
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
                for(int k=0;k<2;k++){
                    MultiplikationErgebnis[i][j] += a.getMatrix()[i][k]*b.getMatrix()[k][j];
                }
            }
        }
    return MultiplikationErgebnis;
    }
   
   
    public int[][] getMatrix(){
        return Matrix;
    }
   
    public String getName(){
        return name;
    }
   
    public String setName(String a){
        this.name = a;
        return name;
    }
   
    public static int[][] getAdditionErgebnis(){
        return AdditionErgebnis;
    }

}

Dann habe ich noch im Package view eine Klasse:
Java:
package view;

import java.util.Arrays;
import model.Matrix;

/**
*
* @author Lukas
*/
public class MatrixAusgabe {
   
    public void matrixAusgabe(Matrix a){
        System.out.println(Matrix.getName() + " lautet: " + Arrays.deepToString(a.getMatrix()));
    }
   
    public void AdditionAusgabe(){
        System.out.println("Die Addition ergibt: " + Arrays.deepToString(Matrix.getAdditionErgebnis()));
    }
   
}

Bei der Methode matrixAusgeben(Matrixa){
}

bekomme ich den Fehler "Non-static method getName() cannot be referenced from a static context

Wie kann ich das Problem elegant lösen?
 
Ukasz93 hat gesagt.:
Ursprünglich hatte ich gar nicht geplant, meinen Code zu besprechen, sondern nur die Struktur, aber das hat sich ja geändert
Gerade als ein Anfänger, und ich bin ebenso einer, finde ich es wichtig, dass man das, was man selbst für gelungen hält, postet, um es einer Härteprüfung auszusetzen. Da lernt man unglaublich viel, weil eben in diesem Forum es viele gute Leute gibt, die wirklich Ahnung haben. Eventuell hätte ich den Post #2 anders formulieren sollen, weil es wahrscheinlich anders, als es sollte, ankam. Freut mich, dass du jetzt weiter bist 🙂
 
Habe mein Programm fertig und es funktioniert alles. Jedoch hätte ich noch ein paar Fragen. Wie wäre es jetzt am Besten, damit ihr mir helfen könnt? Soll ich eine RAR Datei machen und es hochladen, oder jede einzelne Klasse aus den Packages mit dem Code Editor hier einfügen?
 
Hallo.

So viel Code wird es wohl nicht sein so dass du es ruhig posten kannst. Zumal nur wenige sich Dateien runterladen aus Sicherheitsgründen.

Grüße
 
Control
Main
Java:
package control;

import model.Objekt;

/**
*
* @author Lukas
*/
public class Main {
   
    public static void main(String[] args) {
        Objekt aufruf = new Objekt();
        aufruf.objektAufruf();
    }
   
}

model
Matrix
Java:
package model;

/**
*
* @author Lukas
*/
public class Matrix {
   
    private String name;
    private int[][] Matrix = new int[2][2];
    private static int[][] AdditionErgebnis = new int[2][2];
    private static int[][] MultiplikationErgebnis = new int[2][2];
   
    public int[][] matrixAufrufen(){
        matrixErzeugen();
       
        return Matrix;
       
    }
   
    private int[][] matrixErzeugen(){
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
                Matrix[i][j] = (int)(Math.random()*9+1);
            }
        }
    return Matrix;
    }
   
    private int[][] matrixAddition(Matrix a, Matrix b){
       
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
                AdditionErgebnis[i][j] = a.getMatrix()[i][j] + b.getMatrix()[i][j];
            }
        }
   
   
    return AdditionErgebnis;
    }
   
    private int[][] matrixMultiplikation(Matrix a, Matrix b){
       
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
                for(int k=0;k<2;k++){
                    MultiplikationErgebnis[i][j] += a.getMatrix()[i][k]*b.getMatrix()[k][j];
                }
            }
        }
    return MultiplikationErgebnis;
    }
   
   
    public int[][] getMatrix(){
        return Matrix;
    }
   
    public String getName(){
        return name;
    }
   
    public String setName(String a){
        this.name = a;
        return name;
    }
   
    public int[][] rufeAdditionAuf(Matrix a, Matrix b){
        matrixAddition(a, b);
    return AdditionErgebnis;
    }
   
    public static int[][] getAdditionErgebnis(){
        return AdditionErgebnis;
    }
   
    public int[][] rufeMultiplikationAuf(Matrix a, Matrix b){
        matrixMultiplikation(a, b);
    return MultiplikationErgebnis;
    }
   
    public static int[][] getMultiplikationErgebnis(){
        return MultiplikationErgebnis;
    }

}

Objekt

Java:
package model;

import view.MatrixAusgabe;

/**
*
* @author Lukas
*/
public class Objekt {
   
    public void objektAufruf(){
       
        Matrix Matrix_A = new Matrix();
        Matrix_A.setName("Matrix A");
        Matrix_A.matrixAufrufen();
        MatrixAusgabe.matrixAusgabe(Matrix_A);
        Matrix Matrix_B = new Matrix();
        Matrix_B.setName("Matrix B");
        Matrix_B.matrixAufrufen();
        MatrixAusgabe.matrixAusgabe(Matrix_B);
        Matrix_A.rufeAdditionAuf(Matrix_A, Matrix_B);
        MatrixAusgabe.AdditionAusgabe();
        Matrix_A.rufeMultiplikationAuf(Matrix_A, Matrix_B);
        MatrixAusgabe.MultiplikationAusgabe();
    }
   
}

view
MatrixAusgabe
Java:
package view;

import java.util.Arrays;
import model.*;

/**
*
* @author Lukas
*/
public class MatrixAusgabe {
   
    public static void matrixAusgabe(Matrix a){
        System.out.println(a.getName() + " lautet: " + Arrays.deepToString(a.getMatrix()));
    }
   
    public static void AdditionAusgabe(){
        System.out.println("Die Addition ergibt: " + Arrays.deepToString(Matrix.getAdditionErgebnis()));
    }
   
    public static void MultiplikationAusgabe(){
        System.out.println("Die Multiplikation ergibt: " + Arrays.deepToString(Matrix.getMultiplikationErgebnis()));
    }
   
}

  1. In der Klasse Objekt (Benennung könnte besser sein^^) habe ich in Zeile 26: Matrix_A.rufeAdditionAuf(Matrix_A, Matrix_B); Irgendiwe stört mich, dass die Methode rufeAdditionAuf über das Objekt Matrix_A aufgerufen werden muss. Kann man das anders lösen?
  2. In Matrix habe ich die beiden Variablen AdditionErgebnis und MultiplikationErgbenis sowie die Methoden getAdditionErgebnis und getMultiplikationErgebnis mit static versehen, da sonst die Methoden in MatrixAusgabe(view) nicht funktionieren bzw. ich die Fehlermeldung bekomme "non static method cannot be referenced from a static context". Kann man das auch anders lösen? Oder ist es nicht so schlimm, dass diese Variablen und Methoden static sind?

Gruß

Lukas 😛
 
Hallo.

Erstmal fällt mir auf das du nicht die Java Code Konventionen einhälst. Du solltest auf static verzichten. Auf Denglisch verzichten entweder deutsch oder englisch. Zum Beispiel anstatt get -> hole. Wenn es deutsch sein muss.

Die Methode über Objekte aufrufen ist die bessere Lösung als über die Klasse. Von daher ist Matrix_A.matrixAufrufen(); in Ordnung.

Du solltest Objekte immer weiter reichen anstatt auf statische Methoden zu zugreifen.

Bei der Klasse MatrixAusgabe übergibst du schon ein Matrix Objekt der Methode matrix Ausgabe. Das kannst du auch für die anderen Methoden so machen.

Was ist bei dir die View und der Controller?

Grüße
 
Es ist richtig gelöst, dass die Addition über Objekt A aufgerufen wird, jedoch würde ich die Methode, add bzw. addiere nennen (wenn du unbedingt auf Deutsch coden willst) und dann nur noch Matrix B übergeben. Auf Matrix A hast du ja schon mit this zugriff

Dann wäre es viel besser gelöst, wenn der Rückgabewert einer Matrix-berechnung wieder eine Matrix wäre, kein int[][]...

Ich glaube dann löst du deine Static Probleme und wirst verstehen, was an deinem "MVC" Konzept noch falsch ist.
 
Es ist richtig gelöst, dass die Addition über Objekt A aufgerufen wird, jedoch würde ich die Methode, add bzw. addiere nennen (wenn du unbedingt auf Deutsch coden willst) und dann nur noch Matrix B übergeben. Auf Matrix A hast du ja schon mit this zugriff

Alles klar, das habe ich geändert. Danke!

Dann wäre es viel besser gelöst, wenn der Rückgabewert einer Matrix-berechnung wieder eine Matrix wäre, kein int[][]...

Ich glaube dann löst du deine Static Probleme und wirst verstehen, was an deinem "MVC" Konzept noch falsch ist.

Da hast du recht. Habe den Rückgabewert in eine Matrix umgeändert. Allerdings wird mir jetzt bei der Methode matrixAddition() die Fehlermeldung angezeigt: incompatible types: int cannot be converted to Matrix für die Zeile
Java:
AdditionErgebnis = a.holeMatrix()[i][j] + this.Matrix[i][j];

Ich vermute mal, dass es an der Methode holeMatrix liegt, da diese vom Typ int[][] ist. Und an dieser Stelle versagt mein Wissen, denn diese Methode kann ich ja nicht vom Typ Matrix machen, oder?

Hallo.

Erstmal fällt mir auf das du nicht die Java Code Konventionen einhälst. Du solltest auf static verzichten. Auf Denglisch verzichten entweder deutsch oder englisch. Zum Beispiel anstatt get -> hole. Wenn es deutsch sein muss.

Die Methode über Objekte aufrufen ist die bessere Lösung als über die Klasse. Von daher ist Matrix_A.matrixAufrufen(); in Ordnung.

Du solltest Objekte immer weiter reichen anstatt auf statische Methoden zu zugreifen.

Bei der Klasse MatrixAusgabe übergibst du schon ein Matrix Objekt der Methode matrix Ausgabe. Das kannst du auch für die anderen Methoden so machen.

Was ist bei dir die View und der Controller?

Grüße

Ich versuche ja auf static zu verzichten^^. Deswegen die Frage, ob ich das anders lösen kann. Heißt das, ich sollte von der Klasse MatrixAusgabe ein Objekt erzeugen, um auf die ganzen statics zu verzichten?
 
Liegt wahrscheinlich daran, dass Additionsergebnis eine Matrix ist.

Ich würde sowas in der Art machen.. Pseudocodemässig
Additionsergebnis und Subtaktionsergebnis löschen.

Aenderungen in der addition
Code:
int[][] calc = new int[2][2];
for... {
   this.holeMatrix()[i][j] + a.holeMatrix()[i][j]
}
return new Matrix(calc);

Konstruktor hinzufügen
Code:
Matrix(int[][] werte) {
   this.Matrix = werte;
}
 

Zurück
Oben