Old article but worth reading. It helps to understand the difference between : libraries and frameworks : Designing Reusable Classes

Les getters/setters, dans la plupart des cas, ne sont pas nécessaires et ils pollutent notre code, rendent le code plus long, les classes plus ouvertes (sans la vrai nécessité) donc plus vulnérables face au changement et la maintenance plus difficile.
Examinons le code suivant:

	private int height; 
	
	public void setHeight(int height) {
		this.height = height;
	}
	public int getHeight() {
		return height;
	}


D’abord, on déclare la propriété “height” en privé, biensûr, pour cacher l’information – comme on a tout appris dans les principes de la programmation orienté-objet. Mais juste après, on a les fameux getters/setters: getHeight et setHeight qui donnent l’accès totale à notre propriété ???
C’est encore plus dangereux si height est un pointeur (de type List, Set, …) parce que dans ce cas le getter seul suffit pour exposer la propriété au public (si on n’utilise pas le “defensive copy”, et c’est souvent le cas avec la génération automatique de getters/setters)
Pire encore, cette pratique est aussi un signe de mauvais design car elle transgresse les principes de la programmation orienté-objet (encapsulation) et rend le programme plus procédural que objet.
Avec 2 ans dans l’environnement professionnel, j’ai vu plein de code comme au-dessus. Qui a écrit “bêtement” les getters/setters comme ça ? Personne! Avec les IDEs modernes, les gens apprennent vite l’habitude de générer les getters/setters et comme c’est trop facile à faire, on trouve partout les getters/setters qui ne sont jamais vraiment utilisés. Ils sont juste là, comme une bombe à retardement, ne font rien mais attendent le jour où on doit faire des changements au code pour exploser.
Pour savoir pourquoi les getters/setters sont mauvais:
Why getter and setter methods are evil
Un excellent article sur les getters et le design de Martin Fowler:
GetterEradicator

A nice article, I like his point of view of programming: Why I Program In Ruby (And Maybe Why You Shouldn’t)

La question a l’air simple mais la réponse (ou plutôt les réponses) demande quand même des détails précises.

Supposons que j’ai 2 nombres: n et m, avec m = 0 et dans mon programme je fais: result = n / m;
Qu’est-ce que je vais obtenir comme résultat ? une exception ? un nombre ? ou quelque chose qui n’est pas un nombre ?
La réponse est : les 3 et ça dépend du n et m
Concret:

  • si m ou n ou les deux sont float ou double, on a 3 cas
    1. si n > 0, le résultat est +Infinity (le constant POSITIVE_INFINITY de la classe Float ou Double)
    2. si n = 0, le résultat est NaN (Not a Number – le constant NaN de la classe Float ou Double)
    3. si n < 0, le résultat est -Infinity (le constant NEGATIVE_INFINITY de la classe Float ou Double)
  • si m et n sont int ou long, on a une exception (java.lang.ArithmeticException)

Donc il faut faire attention quand on divise par zéro dans le programme. Dans la plupart des cas, un try…catch ne suffit pas.

Plus de détails: le livre “The Java Language Specification, Third Edition – page 26”

Java: A Retrospective

A wonderful article! I love Java and Open Source.

Java tools for small to medium websites

I have used commons-fileupload, it is really very easy to use. For the database communication, I have used Hibernate (2.x) but not Torque. For other things, I just want to give a try with my (small) personnal projects. But not immediately, I hope I could start in one month. I’ll post the result later.

Today, while playing with Java code and Eclipse, I falled to the following code:

package test;

/**
 * @author Hong Nam NGUYEN -- Created: 18 oct. 07 - 15:23:41
 */
public class Recursion
{
	private int x;
	private Recursion obj;
	
	public void init(int x)
	{
		this.x = x - 1;
		System.out.println("x = " + this.x);
		
		while (this.x > 7)
		{
			obj = new Recursion();
			obj.init(this.x);
		}
	}
	
	public static void main(String[] args)
	{
		Recursion obj = new Recursion();
		obj.init(10);
		System.out.println("Finish");
	}
}


I thought that the program will print out
x = 9
x = 8
x = 7
Finish
and stop!
But not, the real result is
x = 9
x = 8
x = 7
x = 7
x = 7
x = 7
….
and infinite loop ??

By reinspecting the code, I found that I have made an error. The variable x is an instance variable, so it belongs to each instance of the class Recursion, but not to the class at a whole. When a new instance is created (Recursion obj = new Recursion();) and the init method called, the following instruction is executed: this.x = x – 1;, but not the same x each time. In fact, the x of the very first instance has the value 9 (= 10 – 1), and then, it never change any more ! That’s why I get the infinite loop.
To correct this problem, there are (at least) two solutions:
– make x a static variable (static private int x;)
– or add code that changes x in the while loop

		while (this.x > 7)
		{
			obj = new Recursion();
			obj.init(this.x);
			this.x--;
		}


!!! The results of the two solutions are not the same, but the loop finite.

Follow

Get every new post delivered to your Inbox.