lunes, 2 de febrero de 2009

Clean Code: Open-Closed Principle

"Classes should be open for extension but closed for modification."

Un programa no debiere estar preparado para ser modificado, sino, para ser extendido, ej: usando subclases o nuevos métodos que usen a los existentes.

De esa manera, nuevas funcionalidades tienen menos riesgo de afectar a funcionalidades antiguas.


Ref:
Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series)
Publisher: Prentice Hall PTR; 1 edition (August 11, 2008)
ISBN-10: 0132350882
ISBN-13: 978-0132350884

jueves, 29 de enero de 2009

Clean Code: Cohesión en clases

Alta cohesión en una clases se ve reflejada en:
  • Bajo número de atributos. Si se usa la estrategia de funciones pequeñas y con pocos argumentos, los atributos subirán en número. Cuando esto pasa es porque la clase se debiera dividir en más clases.
  • Cada método usa muchos (ojalá todos) los atributos de la clase. Utopía: todos los métodos usan cada uno de los atributos de la clase.

Ref:
Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series)
Publisher: Prentice Hall PTR; 1 edition (August 11, 2008)
ISBN-10: 0132350882
ISBN-13: 978-0132350884

miércoles, 28 de enero de 2009

SQL para obtener datetime pasado que sea multiplo de 5

Con este input:

set @a = '2009-01-28 16:57:50';

el sgte sql:

SELECT DATE_SUB(DATE_SUB(@a, INTERVAL (MINUTE(@a) MOD 5) MINUTE), INTERVAL SECOND(@a) SECOND)

produce como resultado:

2009-01-28 16:55:00

martes, 27 de enero de 2009

Clean Code: Single Responsibility Principle

Single Responsibility Principle: a class or module should have one, and only one reason to change.

Los componentes grandes o con varias responsabilidades tienen varias razones para cambiar: cambios en cualquiera de sus responsabilidades.

Si un componente cambia, hay que probarlo entero. Si el componente es grande, eso es costoso.


Ref:
Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series)
Publisher: Prentice Hall PTR; 1 edition (August 11, 2008)
ISBN-10: 0132350882
ISBN-13: 978-0132350884

Clean Code: Class Organization - Java convention

To read a class like a newspaper article:

class Example {
public static constant;
private static variable;
public static instanceVariable;
public publicVariable; //there is seldom good reason for this

public method1(){
...
}

private method2(){
...
}
}


Ref:
Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series)
Publisher: Prentice Hall PTR; 1 edition (August 11, 2008)
ISBN-10: 0132350882
ISBN-13: 978-0132350884

lunes, 26 de enero de 2009

Manejo de strings en java provenientes de BD en utf8

Si en una BD tengo string encodeados en utf8, al obtenerlos en un programa java, el java no les hace un decode de utf8, sino que los trata con el encoding default de la jvm (lo cual es indeterminado). Por lo tanto, cualquier tilde en utf8 si se imprime desde el java, se verá como un garabato.

La solución es obtener los bytes que vienen de BD encodeados en latin1 y luego hacerles un decode explicitando que en realidad están en utf8:

titulo = getTituloFromDB();
titulo = new String(titulo.getBytes("latin1"),"UTF-8"));

Así, la variable titulo se podrá ver sin garabatos en una consola utf8.

lunes, 19 de enero de 2009

Clean Code: Using Third-Party Code

Hay clases en las librerías hechas por externos que ofrecen muchas funcionalidades.
Si se pasan objetos de ese tipo de clases entre métodos de la aplicación, se corre el riesgo de que en algún lado se usen de manera indebida.

Ej: si en java se usa un Map y ese Map es usado en varios métodos (se retorna o se pasa como argumento), se corre el riesgo de que en alguna parte se le haga un delete o un insert siendo que quizás eso no esté dentro de la lógica diseñada desde un principio.

Mejor: Hacer un wrapper de Map y exponer sólo los métodos que caben dentro del diseño de lo que queremos.

Ej:

public class Sensors {
private Map sensors = new HashMap();
public Sensor getById(String id) {
return (Sensor) sensors.get(id);
}
...
}



Ref:
Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series)
Publisher: Prentice Hall PTR; 1 edition (August 11, 2008)
ISBN-10: 0132350882
ISBN-13: 978-0132350884