Schlechter Quellcode von NeuralBuild (NeuralLimits)
Ü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 (
Exceptione) muss wirklich sein? Ode doch catch (SQLExceptione)? - Wenn die Rückgabe ein
Integer-Objekt ist, warum dann „Integer.valueOf(rs.getObject(1).toString());“ schreiben? Das funktioniert zwar, aber wenngetObject()schon inIntegerist, muss man nicht erst in einStringund 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.“