Es que intentas tener en cuenta muchas cosas desde el principio. Puedes saber la teoría, pero si no sabes aplicarla en un simple ejercicio, es dificil que salga.
Vamos a un dominio sencillo como el que planteabas antes. Tienes categorias, con subcategorias. Y productos para cada subcategoria.
Podriamos empezar a poner esos objetos. Pero ¿Realmente son necesarios? A mi me gusta definir a un objeto como "un ente que exhibe comportamiento", o siendo mas bruto "una cosa que hace cosas".
Entonces, si tengo objetos que no hacen nada, no son objetos! XD (Es algo discutible, pero es una buena forma de empezar)
Entonces para saber que deben hacer nuestros objetos, vamos a ver que queremos de nuestro programa.
Entonces suponte que nuestro programa es para hacer estadísticas, y queremos en un principio calcular estas dos cosas:
1) el precio de un producto.
2) todos los productos de una determinada característica.
Suponte que el precio del producto depende de su subcategoria...
Entonces la pregunta para empezar es ¿Que objetos participan y que mensajes les debo enviar para que me digan lo que quiero?
1) el precio de un producto es obvio que debo preguntárselo al producto, y escrito en sintaxis estilo c++, java seria...
2) si queremos los productos de una característica, debería de pedírselos a la característica, de esta manera:
Código:
unaCaracteristica.productos();
Podrias complicarte poniendo get, set, pero eso no es realmente importante, son solo convenciones. Lo importante es:
objeto -> mensaje
Ahora, ¿como hace el producto para responderme su precio?
Código:
#Producto
>> public double precio(){
return categoria.precioProducto();
}
Ahi alguien podria decir que el precio lo tiene la categoría y hubiese sido mejor pedirselo a la categoria, de esta manera:
Código:
unProducto.dameTuCategoria().precioProducto();
O lo que es peor:
objetoMundo.dameCategoriaDe(unProducto).precio();
Ahi tienes 3 ejemplos de código. En uno le pides el precio al producto (pues lo que quieres es el precio del producto. El se lo preguntará a su categoría, pero a ti no te interesa como lo haga. De esa manera, es más fácil el dia de mañana cambiar la forma en que los productos calculan su precio, pero desde afuera no te enteras, pues le sigues preguntando producto.precio() :).
Para el segundo punto seria algo parecido
Código:
#Categoria
public Collection<Producto> getProductos(){
Collection<Producto> productos; // Declaro una variable auxiliar
foreach(SubCategoria subcategoria in subcategorias)
productos.addAll( subcategoria.productos() );
//Le pido a cada subcategoria sus productos y los agrego en la coleccion
return productos;
}
#Subcategoria
public collection<Producto> productos(){
return productos;
// a quien me pida mis productos le retorno mi coleccion de productos
}
Conste que los comentarios son a modo ilustrativo, jaja. Y con el numeral identifico a las clases...
Bueno, espero que la explicacion esta simple sirva para empezar algo...
Suerte!