Illustration einer tropischen Insel mit Palmen und einem hohen Berg

Java Blog für Programmierer

Schlechter Quellcode von NeuralBuild (NeuralLimits)

· Christian Ullenboom

Über den Artikel http://entwickler.com/itr/news/psecom,neu,1,id,39010,nodeid,82.html bin ich auf einen Generator aufmerksam geworden, der automatisch DOAs und Transfer-Objekte erzeugt. Leider ist doch der generierte Quellcode wenig überzeugend. En Besipiel:

    public Integer insertCompany(Company criteriaCompany)        throws NeuralBuildJavaSampleDAOInsertException {        Integer keyVal = new Integer(0);        con = connMgr.getConnection("neuralbuildjavasample");        int setindex = 1;        String vSQL = constructInsertPreparedStatement(criteriaCompany);        try {            PreparedStatement ps = con.prepareStatement(vSQL,                    PreparedStatement.RETURN_GENERATED_KEYS);            if (criteriaCompany.CompanyID_isSet) {                ps.setInt(setindex, criteriaCompany.getCompanyID().intValue());                setindex++;            }            if (criteriaCompany.CompanyName_isSet) {                ps.setDate(setindex,                    (java.sql.Date) criteriaCompany.getCompanyName());                setindex++;            }            ps.executeUpdate();            ResultSet rs = ps.getGeneratedKeys();            if (rs.next()) {                keyVal = Integer.valueOf(rs.getObject(1).toString());            }            rs.close();            rs = null;            ps.close();        } catch (Exception e) {            connMgr.freeConnection("neuralbuildjavasample", con);            throw new NeuralBuildJavaSampleDAOInsertException("Insert Failed " +                e.getMessage(), e);        }        connMgr.freeConnection("neuralbuildjavasample", con);        return keyVal;    }  
  • new Integer(0) wird immer gebaut, auch wenn es später überschrieben wird.
  • finally fehlt: So ist das close() nicht garantiert. (Nicht sooo schlimm, da bei Freigabe der Connection auch ResultSet und XXXStatement freigegeben werden.)
  • Quellcode-Duplizierung bei connMgr.freeConnection("neuralbuildjavasample", con);. Das gehört auf jeden Fall in finally{}
  • Was soll den rs = null; bewirken? Den GC hilt das bei lokalen Variablen nun wirklich nicht.
  • catch (Exception e) muss wirklich sein? Ode doch catch (SQLException e)?
  • Wenn die Rückgabe ein Integer-Objekt ist, warum dann „Integer.valueOf(rs.getObject(1).toString());“ schreiben? Das funktioniert zwar, aber wenn getObject() schon in Integer ist, muss man nicht erst in ein String und dann wieder zurück konvertieren.
  • Sollte man wirklich einfach nur 0 zurückliefern, wenn man keinen Schlüssel bekam?

Die anderen Methoden habe auch so ihre Macken, so mit der Namensgebung.

  • CachedRowSet Rs = null; Groß-/Kleinschreibung!
  • Gemische Groß-/Kleinschreibung ist Standard, nicht so bei setindex.
  • Unterstriche sind von Sun in der Namenskonvention nur bei Konstanten vorgesehen, aber nicht etwa bei CompanyID_isSet
  • Ist die Namensgebung so gut, wenn man liest ps.setDate(setindex, (java.sql.Date) criteriaCompany.getCompanyName() ); Also setDate() auf ein Company-Name?
  • Die API-Doku sollte nicht schreiben: „Delete an object from the database.“ sondern laut Suns-JavaDoc-Vorgaben: „Deletes an object from the database.“

Kategorien: Allgemein

← Alle Beiträge