Qué tienen en la cabeza?
Filed under: Java
Resulta que conseguí un trabajito en RentACoder para arreglar unos bugs a un sistema, y estoy viendo como esta hecho.
Por ética no voy a dar nombres, pero aparentemente es un sistema comercial, desarrollado como portal vertical para una industria determinada.
Para empezar, ponen: “It is an object-oriented database implemented in a relational system”. No, no quiere decir que implementaron su propio OR mapping (lo que ya sería bastante estúpido), sino que cada tabla mapea exactamente a una clase, cada registro tiene un OID, y hay una tabla Link, que mapea OIDs de una clase con OIDs de otra, individualmente, o sea que hay una fila por cada OID que se relaciona con otro. O sea, para qué preocuparse por primary keys, foreing keys, constraints, etc, etc, si todo el mundo sabe que no sirven para nada?
Esto por supuesto hace que cualquier query que involucre un join sea imposible de hacer, y lleve a hacer asquerosidades como lo siguiente:
Vector v = roleTable.findMembersByRole(stateObject.role);
stateObject.list = new Vector();
for(int i=0; i<v .size(); i++) {
Member member = (Member) v.get(i);
if (!"".equals(stateObject.email)) {
String email$ = member.getEmail().toLowerCase();
if (email$.startsWith(stateObject.email)) stateObject.list.add(member);
} else {
String lastname = member.getLastname().toLowerCase();
if (lastname.startsWith(stateObject.pattern)) stateObject.list.add(member);
}
}
Como verán, al no poder hacer un join con la tabla de usuarios, tienen que recorrer todos los resultados de roles y filtrarlos en el código, haciendo otro query por cada uno (el famoso n+1) . No importa que haya 30 años de experiencia en desarrollo de base de datos, este programador creé saber mas que todos y que esta solución que implementó es eficiente.
Y vean esto:
public class RoleTable extends Table {
public static Vector /* of Members */ findMembersByRole(String _role) {
Vector results = new Vector();
try {
RoleTable roleTable = new RoleTable();
MemberTable memberTable = new MemberTable();
Vector v = roleTable.find(Role.ROLE+"='"+_role+"'", Role.USERNAME);
for(int i=0; i<v .size(); i++) {
Role role = (Role) v.get(i);
Vector x = memberTable.find(Member.EMAIL+"='"+role.getUsername()+"'", null);
if (x.size() > 0) {
results.addAll(x);
}
}
} catch (Exception ex) {
Debug.error(ex);
}
}
Estando en un método de RoleTable, el tipo instancia otro RoleTable para llamar a find(), en vez de hacer this.find(). Sin duda muy eficiente, si.
Esta es la verdadera razón de porque hay tantas fallas y tantos proyectos de software fracasan, porque esta lleno de programadores que son unos inútiles e ignorantes, se ponen a laburar de algo apenas con una vaga noción. Imaginen si hubiera médicos ejerciendo con este nivel de capacitación?? Se atenderian con ellos? Entonces porque les dan trabajo a esta clase de programadores?
| show comment » 1 Comment so far
Leave a comment
Leave a comment
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>




