Schönes Programm



  • Hallo es geht um ein Programm besser gesagt um die Programmstrukturierung. Ich möchte schön Darstellungs und Anwendungsschicht trennen. Diese Trennung betreffend habe ich eine Haupdatei, die von einem JFrame abegleitet ist für die Benutzereingaben. Die Programmlogik habe ich in eine eigene Klasse ausgelagert. Und nun kommt die Frage. Es geht um eine "Zwischenfunktion" zwischen den beiden Schichten, die die Eingaben überprüft. Die Funktion ist etwas über 150 Zeilen lang. Es zu zerstückeln in kleinere Funktionen mach meiner ansicht nach auch nicht zu viel Sinn da alle Operationen mit Werten von Steuerelementen ausgeführt werden. Wenn ich es in dieser Klasse lasse hätte ich dann anstatt einer langen viele Kleine was der übersichtlichkeit nicht allzuviel bringt. Da es sich um Benutereingaben handelt würde ich diese gerne in der Klasse der Darstellungsschicht lassen. Zu dem müsste ich wenn ich diese aulager für alle Steuerelemente get und set methoden definieren. Andererseits ist es doch auch ein Teil Logik die Plausibilität der Eingaben zu prüfen. Was würdet ihr machen. Denkt ihr die Eingabeüberprüfung gehört noch mit zur Darstellungsschicht wenn eine Auslagerung einen unverhältnissmäßig hohen Aufwand bedeuten würde? Und wenn ihr denkt ich sollte sie auslagern bitte ich um praktikable Vorschläge die den Aufwand akzeptabel halten.

    Danke und cu



  • Guck dir mal das MVC Model an (Model-View-Controller)
    Das beschreibt genau deine Frage. Model - Verarbeitungsschicht, View- Gui und Controller - Eventhandling.
    Oftmals ist es nicht so einfahc, ein sauberes MVC zu erzielen.



  • Ich habe mir diese Modell angeschaut und soweit ich es verstanden habe ist die Empfehlung eine zusammenlegung von View un Controller um den Implementierungsauffand und den Kommunikaionsauffand zu verringern. Ich tendiere somit zu dem Ansatz diese Methode darin zu belassen. Mir sind nur noch einige alternative Meinungen wichtig.



  • Hi

    ich gestehe ich halte mich auch nicht immer an das MVC konzept. Meistens wandern auch View und Control in eine klasse, wegen deiner genanten gründe ( geter und setter für alle möglichen elemente zu implementiren ist zu aufwendig, auser man hat möglichkeiten das zu automatisieren 😃 ). Teilweise lässt es sich nicht ganz verhindern das man seperate klassen braucht. aber dafür bitet java ja auch noch andere möglichkeiten klasen zu implementieren. Wie die Key words jetzt genau heisen, weis ich jetzt nicht mehr ( hilks das bier war heut eindeutig zu leker, und es ist eindeutig zu späht). Klassen, die innerhalb einer klasse implementiert wrden, Klasssen, die während der zuweisung implementiert werden (anonyme klassen, da sie keinen namen besitzen) und noch mal was.

    this.setKeyListener ( new KeyListener{
    // meine implementierung der methoden einer anonymen klasse.
    });
    

    gruss Termite

    ( die wohl nicht mehr ganz nüchtern ist. Koreckturen erfolgen morgen früh wenn ich wieder nüchtern bin )



  • Hoffe hast gut gefeiert. Trotzdem noch ein ganz brauchbarer tipp. Wow. Anonyme klassen sind mir ein Begriff. Verwende sie meist bei diversen Listenern falls ich das Interface nicht in die Hauptklasse implementiere und das Substituionsprinzip nutze. Nur ganz verstehe ich nicht wie mir das in diesem Zusammenhang helfen soll.



  • Zeig mal diese 150-Zeilen Methode.



  • Morgen

    wenn ich mir grad mal mein letztes projekt so im geiste anschau, da fällt mir auf, das ich die ganzen eventhändler im Model implementiert habe (aber wenn ich mir das genau überlege hab ich gar kein model. Die ganzen daten krig ich ja vom JBoss 😉 ) Die implementierung der einzelnen geter und setter für die einzelnen eingabefelder im View hab ich mit hilfe einer Datentranzportklasse auf ein einziges reduzirt. Anstelle von getName1, getName2, getStrasse,... hab ich einfach eine klasse Adresse, und die Methode getAddress im View.

    In dem speziellen fall hab ich das sogar noch ein bischen weiter getrieben, da zusätzlich zu diesen werten noch zusatzinformationen angezeigt werden musten. Wie z.B. ob diese feld ein mussfeld ist( andere hintergrundfarbe), oder ob der wert fehlerhaft ist(rot umrandet).

    gruss Termite



  • Gregor@Home schrieb:

    Zeig mal diese 150-Zeilen Methode.

    Überarbeite die Methode gerade. Darum sind im unteren teil noch einige Fehlermeldungen , die ich wo ein mess. davorstehen muss. Das ist meine Klasse für Fehlermeldungen.

    Meine momentane Überlegung geht dahin für jedes Eingabefeld das ich checke eine Methode zu schreiben die sich in einer Klasse z.B. Check befinden. Ich hätte dann in der Hauptklasse dann eine checkmethode, in der ich die Werte der Steuerelemente als Parameter an die jeweiligen Methoden des Check Objektes übergebe.

    Ich denke das ist ein guter Zwischenweg.

    private int check(){
         String delTemp;
         String delimiter = delTemp = jDelimiter.getText();
         String metas ="!\\\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~";
         char[] delchars = delimiter.toCharArray();
         char[] metachars = metas.toCharArray();
         StringBuffer sb = new StringBuffer();
         for(int i=0;i<delchars.length;i++)
           for(int j=0;j<metachars.length;j++)
           {
             if(delchars[i]==metachars[j]) sb.append(metachars[1]).append(delchars[i]);
           }
         delimiter=sb.toString();
         if(delimiter.equals(""))delimiter=delTemp;
         String[] k = jDataSet.getText().split(delimiter);
         String[] index0 = jToutdesire.getText().split(";");
         int index[] = new int[k.length + 1];
         int help;
         if (k.length >MAXTOKEN){
          mess.inputError(ERTIT[0],"Die Anzahl der Token ist auf 11 beschränkt");
          jDataSet.requestFocus();
          return 0;
        }
        if (index0.length != k.length){
         mess.inputError(ERTIT[0],ERMES[0]);
         jToutdesire.requestFocus();
         return 0;
         }
         else
         {
           for (i = 0; i < k.length; i++)
             try {
               index[i] = Integer.parseInt(index0[i])-1;
               if ((index[i] > k.length - 1)||index[i] < 0) {
                 mess.inputError(ERTIT[0],ERMES[1]);
                 jToutdesire.requestFocus();
                 return 0;
               }
             }
             catch(NumberFormatException e){
               System.err.print("Eingegene(s) Zeichen sind keine Zahlen");
               mess.inputError(ERTIT[0],ERMES[2]);
               jToutdesire.requestFocus();
               return 0;
             }
         }
         if(!(jTinstring.getText().equals(""))){
           try{
             help=Integer.parseInt(jTinstringout.getText());
             if (help > k.length+1||help< 1){
                  mess.inputError(ERTIT[0],ERMES[5]);
                  jTinstringout.requestFocus();
                  return 0;
                }
              }
              catch(NumberFormatException e){
                System.err.print("Eingegene(s) Zeichen sind keine Zahlen");
                mess.inputError(ERTIT[0],ERMES[2]);
                jTinstringout.requestFocus();
                return 0;
              }
            }
            if(!(jTappstring.getText().equals(""))){
              try {
                help = Integer.parseInt(jTappstringout.getText());
              }
              catch (NumberFormatException e) {
                System.err.print("Eingegene(s) Zeichen sind keine Zahlen");
                mess.inputError(ERTIT[0],ERMES[2]);
                jTappstringout.requestFocus();
                return 0;
              }
              if(help >k.length||help<1){
               mess.inputError(ERTIT[0],ERMES[4]);
               jTappstringout.requestFocus();
               return 0;
              }
            }
            if(!(jTstrdel.getText().equals(""))){
              try {
                help = Integer.parseInt(jTstrdel.getText());
              }
              catch(NumberFormatException e){
                System.err.print("Eingegene(s) Zeichen sind keine Zahlen");
                mess.inputError(ERTIT[0],ERMES[2]);
                jTstrdel.requestFocus();
                return 0;
              }
               if(!(jTinstring.getText().equals(""))){
                if (help>k.length+1||help<1){
                mess.inputError(ERTIT[0],ERMES[5]);
                  jTstrdel.requestFocus();
                  return 0;
                }
               }
               else{
                if (help>k.length||help<1){
                  mess.inputError(ERTIT[0],ERMES[4]);
                  jTstrdel.requestFocus();
                  return 0;
                }
              }
            }
            if(!jTstrunion.getText().equals("")){
              int[] iUnion = new int[2];
              int iUnionPrior;
              try{ iUnionPrior = Integer.parseInt(jTstrunionprio.getText());}
              catch(NumberFormatException e){
                System.err.print("Eingegene(s) Zeichen sind keine Zahlen");
                mess.inputError(ERTIT[0],ERMES[2]);
                jTstrunionprio.requestFocus();
                return 0;
              }
              String[] szUnion = jTstrunion.getText().split(";");
              if(szUnion.length>2){
                mess.inputError(ERTIT[0],ERMES[6]);
                jTstrunion.requestFocus();
                return 0;
              }
                for(int i=0;i<iUnion.length;i++){
                  try {
                    iUnion[i] = Integer.parseInt(szUnion[i]);
                  }
                  catch (NumberFormatException e) {
                    System.err.print("Eingegene(s) Zeichen sind keine Zahlen");
                    mess.inputError(ERTIT[0], ERMES[3]);
                    jTstrunion.requestFocus();
                    return 0;
                  }
                  //Hier stehengeblieben
    
                  if (!(jTinstring.getText().equals("")) && jTstrdel.getText().equals("")) {
    
                    if (iunion[i] > k.length + 1 || iunion[i] < 1) {
                      inputError(ERTIT[0], ERMES[5]);
                      jTstrunion.requestFocus();
                      return 0;
                    }
                  }
                  else if (!(jTinstring.getText().equals("")) &&!jTstrdel.getText().equals("")) {
                    if (iunion[i] > k.length || iunion[i] < 1) {
                      inputError(ERTIT[0], ERMES[4] + " Token+,Token-=0");
                      jTstrunion.requestFocus();
                      return 0;
                    }
                  }
                  else if (!(jTstrdel.getText().equals(""))) {
                    if (iunion[i] > k.length-1 || iunion[i] < 1) {
                      inputError(ERTIT[0], ERMES[3] + "(Löschtoken)");
                      jTstrunion.requestFocus();
                      return 0;
                    }
                  }
                }
    
            if(iunionprior!=iunion[0]&&iunionprior!=iunion[1]){
              inputError(ERTIT[0],ERMES[11]+"(Löschtoken)");
              jTstrunionprio.requestFocus();
              return 0;
            }
          }
            //long startTime= System.currentTimeMillis();
            tem = exchanger.readText(file, 1);
            parse(tem,delimiter,k,index);
            //long usedTime = System.currentTimeMillis()-startTime;
            //JOptionPane.showMessageDialog(this,""+usedTime/1000,"Info",JOptionPane.ERROR_MESSAGE);
            return 0;
      }
    


  • Hi und wieder nüchtern. Schon klar daß es unzählige möglichkeiten gibt etwas umzusetzen. Nur eine Verlagerung nun in das Model möchte ich nicht. Damit wäre ich ja wieder am Anfang des Weges nur um etwas Design erweitert. Ich möchte eine gute Synthese zwischen der Lehrbuch und Pragmatik

    Grüße Lazarus


Log in to reply