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");
}
}
Zjednodušenie kódu Jave
Re: Zjednodušenie kódu Jave
Keby to das do CODE a naformatujes ako to ma vypadat mozno si to nekdo aj precita
Re: Zjednodušenie kódu Jave
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)
2. Povodnu metodu som zjednodusil a vytvoril niekolko pomcnych metod
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;
}
}
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");
}
Re: Zjednodušenie kódu Jave
Ď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. 
Re: Zjednodušenie kódu Jave
Pozeram ze v Jave nie je foreach, ale len for. Zmen foreach na for
Re: Zjednodušenie kódu Jave
Práve som to urobil A zmenil som aj komentár. Ešte raz veľká vďaka.