Zjednodušenie kódu Jave

Programovacie jazyky, rady, poradňa...
mengus
Novice
Novice
Príspevky: 3
Registrovaný: 26 jan 2012, 21:23

Zjednodušenie kódu Jave

Príspevok od používateľa mengus »

Zdravým Vie mi niekto poradiť ako sa dá tento kód zjednodušiť?

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String student = (String) jList1.getSelectedValue();
if (student != null) {
// príprava riadku
String[] riadok = new String[3];
riadok[0] = student.substring(0, student.indexOf(' '));
riadok[1] = student.substring(student.indexOf(' ') + 1);
riadok[2] = (String) jComboBox1.getSelectedItem();
// pridanie riadku do tabuľky
dataTable.addRow(riadok);
// odstránenie študenta z komponentu jList1 (resp. príslušného dátového modelu)
dataList.removeElement(student);


double suma = 0;
double najlepsia=4;
double najhorsia=0;
int pocet=0;
boolean neprospel = false;
for (int i = 0; i < dataTable.getRowCount(); i++)
{
pocet++;
double akt_hodnota=0;

String znamka = (String) dataTable.getValueAt(i, 2);

if (znamka.equals("A")) akt_hodnota=1;
if (znamka.equals("B")) akt_hodnota=1.5;
if (znamka.equals("C")) akt_hodnota=2;
if (znamka.equals("D")) akt_hodnota=2.5;
if (znamka.equals("E")) akt_hodnota=3;
if (znamka.equals("FX")) {pocet--; neprospel=true;}

suma = suma + akt_hodnota;
if (akt_hodnota>najhorsia) najhorsia=akt_hodnota;
if (akt_hodnota<najlepsia && akt_hodnota>0) najlepsia=akt_hodnota;
}

double priemer = suma/pocet;
if (pocet>0) jLabel2.setText("priemer: " + Double.toString(priemer));

if (pocet>0) jLabel3.setText("najlepšie hodnotenie: " + Double.toString(najlepsia));
if (pocet>0) jLabel4.setText("najhoršie hodnotenie: " + Double.toString(najhorsia));
if (pocet==0 && neprospel) jLabel3.setText("najlepšie hodnotenie: FX");
if (neprospel) jLabel4.setText("najhoršie hodnotenie: FX");

}
}
Zappir
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 498
Registrovaný: 17 aug 2008, 9:38
Bydlisko: Praha / Prievidza

Re: Zjednodušenie kódu Jave

Príspevok od používateľa Zappir »

Keby to das do CODE a naformatujes ako to ma vypadat mozno si to nekdo aj precita
Baseilos
Light Expert
Light Expert
Príspevky: 57
Registrovaný: 01 máj 2011, 2:15

Re: Zjednodušenie kódu Jave

Príspevok od používateľa Baseilos »

Nemozem spat, tak som sa ti na to pozrel.
Na zaciatok rada do buducnosti, snaz sa nemiesat aplikacnu logiku s prezentacnou vrstvou. Zaroven je dobre sa vyvarovat prilis dlhych metod, ktore robia vela veci naraz.
Neskusal som to kompilovat.

Refaktorovany kod:
1. Zadefinovana nova trieda na vypocet Studijnych metrik (primer, atd)

Kód: Vybrať všetko

/**
 * Trieda reprezentujuca jednotlive ukazatela studenta, priemer, najlepsia, najhorsia znamka, pocet absolvovanych predmetov
 */
public class StudiumMetriky {

  private final String student;
  private final double priemer;
  private final double najlepsiaZnamka;
  private final double najhorsiaZnamka;
  private final int pocetAbsolvovanych;
  private final boolean prospel;

  public String getStudent() {
    return student;
  }

  public double getPriemer() {
    return priemer;
  }

  public double getNajlepsiaZnamka() {
    return najlepsiaZnamka;
  }

  public double getNajhorsiaZnamka() {
    return najhorsiaZnamka;
  }

  public int getPocetAbsolvovanych() {
    return pocetAbsolvovanych;
  }

  public boolean getProspel() {
    return prospel;
  }

  /**
   * Konstruktor
   * @param student
   * @param pole znamok
   */
  public StudiumMetriky(String student, List<String> znamky) {
    int _pocetAbsolv = 0;
    double _najlepsia = 4;
    double _najhorsia = 0;
    double _priemer = 0;

    foreach (String znamka : znamky) {
      int hodnotenie = vratHodnotenieZnamky(znamka);
      if (hodnotenie < _najlepsia) _najlepsia = hodnotenie;
      if (hodnotenie > _najhorsia) _najhorsia = hodnotenie;
      if (hodnotenie < 4) {
        _priemer += hodnotenie
        _pocetAbsolv++;
     }
    }
    _priemer /= _pocetAbsolv;

    // Nastavenie premennych
    this.student = stundent;
    priemer = _priemer;
    najlepsiaZnamka = _najlepsia;
    najhorsiaZnamka = _najhorsia;
    pocetAbsolvovanych = _pocetAbsolv;
    prospel = !(najhorsiaZnamka == 4); // FX
  }  

  /**
  * Prevadza znamku A-F na prislusne ciselne ohodnotenie, pokial znamka nie je z intervalu A-F vracia hodnotenie pre FX
  * @param Znamka - Znamka v rozmedzi A-F, inak FX
  * @return Ciselne ohodnotenie znamky - A = 1; B = 1,5; C = 2; D = 2,5; E = 3; FX = 4
  */
  private double vratHodnotenieZnamky(String znamka) {
      double hodnotenie = 4;

      if (znamka.equals("A")) hodnotenie=1;
      if (znamka.equals("B")) hodnotenie=1.5;
      if (znamka.equals("C")) hodnotenie=2;
      if (znamka.equals("D")) hodnotenie=2.5;
      if (znamka.equals("E")) hodnotenie=3;

      return hodnotenie;
  }

  /**
   * Testuje ci najlepsia znamka je FX
   * @return True ak ano, inak False
   */
  public boolean jeNajlepsieFX() {
    return pocetAbsolvovanych == 0 && prospel == false;
  }

}
2. Povodnu metodu som zjednodusil a vytvoril niekolko pomcnych metod

Kód: Vybrať všetko

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
  String student = (String) jList1.getSelectedValue();

  // Ak student == NULL nema zmysel pokracovat
  if (student == null) 
    return;

  // Upravi model
  upravModel(student);

 // Vypis informacii
 vypisMetriky(vypocitajMetriky(student));
}

/**
 * Metoda pracuje z modelom - prida riadok do tabulky a odoberie pridany zaznam z JList
 * @param student
 */
private void upravModel(String student) 
{
  // pridanie riadku do tabuľky
  dataTable.addRow(pripravRiadok(student));
  // odstránenie študenta z komponentu jList1 (resp. príslušného dátového modelu)
  dataList.removeElement(student);
}

/**
 * Pripravi riadok
 * @param student 
 * @returns Riadok - pole stringov
 */
private String[] pripravRiadok(String student) {
  String[] riadok = new String[3];

  riadok[0] = student.substring(0, student.indexOf(' '));
  riadok[1] = student.substring(student.indexOf(' ') + 1);
  riadok[2] = (String) jComboBox1.getSelectedItem();
  return riadok;
}

private StudiumMetriky vypocitajMetriky(String student) {
  List<String> znamky = new ArrayList<String>();

  // Zoznam znamok
  for (int i = 0; i < dataTable.getRowCount(); i++)
  {
    znamky.add((String) dataTable.getValueAt(i, 2));
  }
  // Vypocet metrik
  return new StudiumMetriky(student, znamky);
}

private void vypisMetriky(StudiumMetriky metriky) {
  if (metriky.getPocetAbsolvovanych()>0) {
    jLabel2.setText("priemer: " + Double.toString(metriky.getPriemer()));
    jLabel3.setText("najlepšie hodnotenie: " + Double.toString(metriky.getNajlepsiaZnamka()));
    jLabel4.setText("najhoršie hodnotenie: " + Double.toString(metriky.getNajhorsiaZnamka()));
  }
  if (metriky.jeNajlepsieFX()) jLabel3.setText("najlepšie hodnotenie: FX");
  if (metriky.getProspel() == false) jLabel4.setText("najhoršie hodnotenie: FX");
}
mengus
Novice
Novice
Príspevky: 3
Registrovaný: 26 jan 2012, 21:23

Re: Zjednodušenie kódu Jave

Príspevok od používateľa mengus »

Ďakujem za upozornenie a už to tak budem robiť. Ďakujem aj za odpoveď. Na moje skúsenosti to bolo trochu zložitejšie tak som to dlhšie skúmal. :D
Baseilos
Light Expert
Light Expert
Príspevky: 57
Registrovaný: 01 máj 2011, 2:15

Re: Zjednodušenie kódu Jave

Príspevok od používateľa Baseilos »

Pozeram ze v Jave nie je foreach, ale len for. Zmen foreach na for
mengus
Novice
Novice
Príspevky: 3
Registrovaný: 26 jan 2012, 21:23

Re: Zjednodušenie kódu Jave

Príspevok od používateľa mengus »

Práve som to urobil A zmenil som aj komentár. Ešte raz veľká vďaka.
Napísať odpoveď