Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Mario R. Rancel

Páginas: 1 ... 13 14 15 16 17 [18] 19 20 21 22 23 ... 32
341
Hola fedegaray, el ejercicio está correcto. ¡A seguir avanzando!

Saludos

342
Hola, ahora el diseño sí se ve mucho mejor armado y los nombres de clase mucho más coherentes. Creo que el ejercicio lo puedes dar por resuelto, el programa funciona perfectamente. De todas formas te voy a comentar todo lo que he visto.

La clase Producto la veo correcta, también ProductoFresco, ProductoRefrigeradoCongelado, ProductoRefrigerado, ProductoCongelado, ProductoCongeladoPorAgua, ProductoCongeladoPorNitrogeno, GestionadorEntradasTeclado, VisualizadorMenues, PreparadorDeProductos.

En la clase ListaDeProducto usas

        for (Producto tmp:miLista){
            System.out.println("Producto Nº: "+posicion);
            System.out.println(tmp.mostrarProducto());
            posicion++;
        }

Normalmente si necesitamos un índice (como posicion) usamos un for normal, el for extendido es más habitual cuando no necesitamos índice o cuando no sabemos el número de elementos en una colección. De todas formas se puede hacer como lo has hecho.

En ProductoCongeladoPorAire has utilizado como atributo un array  private int[] composicionDelAire; considerando que los distintos campos se corresponden con un componente:

nitrogeno = composicionDelAire[0];
oxigeno = composicionDelAire[1];
co2 = composicionDelAire[2];

Si ves otros ejercicios resueltos otros compañeros suelen definir tres int en lugar de un array, pero como tú lo has hecho también está bien y sirve para ver distintas formas de trabajar, es bueno saber aplicar distintos recursos.

En la clase EnviosADomicilio se ve algo extraño. Los atributos son:


    ListaDeProducto listaProductosPedidos;
    ArrayList<ListaDeProducto> miListaDeEnvios;


El nombre de la clase parece dar a entender que la clase representa un envío a domicilio, aunque en la descripción pone

 * clase EnviosADomicilio
 * Esta clase sirve para crear y manipular los pedidos de envío a domicilio realizados por los clientes.

Creo que el diseño mejoraría si por un lado tienes una clase Envio que represente un envío, y por otro lado una clase ListaDeEnvios si consideras que te es necesaria, y por otro lado una clase GestorDeEnvios si consideras que es necesaria. Parece que en esta clase has mezclado varias cosas, y cada clase debe representar algo concreto y tener unas tareas concretas. Es algo interesante tener en cuenta para futuros programas.

Saludos!

343
Hola RaGa has hecho un código amplio en el que se ven buenas ideas como la clase GestionadorEntradasTeclado y VisualizadorMenues que tienen nombres muy descriptivos.

En general todas las clases están bien nombradas excepto dos: Lista y ListaDeProducto

Veo dos problemas con el nombre de la clase Lista:

-Es muy similar a un nombre reservado de Java: List, lo que la hace confusa.

- No describe qué es lo que hace la clase (sus responsabilidades) (¿es una lista de cualquier cosa se preguntaría alguien que la viera sin ver el código?)

Si la clase Lista representa una lista de productos debería llamarse ListaDeProductos.


Hay una cuestión del diseño que no acabo de entender.


En la clase ProductoCongeladoPorAgua tienes un atributo private int salinidadDelAgua; y en la clase ListaDeProducto tienes repetido este atributo, y así también con otros atributos...

A no ser que se pueda justificar con motivos de peso, la repetición de información en distintas partes del código se considera reflejo de un mal diseño.

La clase ListaDeProducto básicamente lo que permite es pedir los datos de productos. Aparentemente no hay necesidad de almacenar los atributos que almacena esta clase, porque estos ya pueden ser almacenados en las distintas clases que representan a los productos.

Pienso que deberías renombrar la clase ListaDeProducto como PreparadorDeProductos ó GestorDatosProductos, y dicha clase se encargaría de pedir los datos de los productos y devolver un objeto del tipo procedente (por ejemplo ProductoCongeladoPorAgua) con los datos recibidos.

La clase ListaDeEnvio tampoco tiene un nombre claro ni se le ve una funcionalidad clara. Si es simplemente para añadir un atributo, parece más lógico hacerlo en la superclase y en caso de no existir valor para dicho atributo mantenerlo vacio o como "Sin cliente".

Es una idea, porque realmente no conozco cuál ha sido tu forma de pensar a la hora de crear este esquema. Sería bueno que dieras una explicación de qué representa cada clase según tu lógica.

Saludos

344
Hola, ahora sí he visto que muestra los productos frescos. Los nombres de clases ya podemos decir también que son ahora correctos.

Citar
creo una nueva instancia y le quito el static a esta clase, pero podrías explicarme porque es mejor crear nueva instancia que usar sus métodos en static como una clase abstracta?

Lo primero es aclarar que el concepto de clase abstracta en Java se refiere a una cosa muy concreta que se explica en la entrega CU00695B del curso y no tiene que ver con static, por tanto no debemos emplear el término abstracto excepto para referirnos a lo que en Java se entiende por abstracto (esto es un pequeño lío, pero es la terminología de java).

El motivo por el que es mejor crear una nueva instancia es para tratar de trabajar como programadores bajo el paradigma o filosofía de la orientación a objetos. Según esta filosofía los programas se conforman mediante la interacción entre objetos. Si defines una clase donde todos sus elementos son estáticos no necesitas crear un objeto para acceder a ella, te estás saliendo de la filosofía de la orientación a objetos. Todo esto tiene una razón de ser, aunque al principio quizás no es fácil entender todos los conceptos y toda la filosofía que encierra este tipo de programación. Un motivo que se suele citar es el de introducir seguridad en el código: dar acceso libre desde cualquier lugar (declarando todo static) del código es más inseguro que forzar a que se cree un objeto, lo cual introduce un mayor grado de control. Es cierto que crear objetos no nos hace buenos programadores, pero entra dentro de lo que se consideran prácticas adecuadas en programación orientada a objetos.

Todo tiene sus excepciones, hay casos en los que trabajaremos con objetos únicos o con clases static, pero no debemos verlo como una práctica habitual, sino algo a usar cuando justificadamente se considere.

Visto el código corregido, lo único que veo faltaría es eliminar la clase PCAireAguaHidro y unificarla dentro de la clase PCongelado.

Saludos!

345
Hola Lorenzo, has creado un código bastante completo y extenso. Recomendaciones varias:

- Una recomendación que habrás leído en otros hilos: darle nombres a las clases que sean coherentes con la orientación a objetos. No suena bien "he creado un objeto Recoger". Los nombres deben ser sustantivos como RecogedorDeDatos, OperadorDeDatos, etc. Nombres como Operar y Recoger no son buenos nombres para clases.

-  La clase Recoger la defines con atributos y métodos estáticos (static) y después la invocas directamente desde la clase con el main por ejemplo numeroMenu = Recoger.menu();

Esto aunque es posible no es coherente con la filosofía de orientación a objetos. Sería preferible que declares una clase "normal" y luego crees una instancia de dicha clase dentro de la clase con el main y trabajes con el objeto creado.

- En el diseño de clases, no veo muy lógico crear una subclase de PCongelado que agrupe a todos los tipos de productos congelados. La idea más bien sería tener tres subclases. Si vas a agruparlas en una sola clase, ¿para qué crear una relación de herencia en vez de agruparlas directamente en PCongelado?


Has manejado bien los conceptos de herencia, el uso de super, etc. por ejemplo esto es una buena reutilización de código

    public void mostrarDatos() {
        super.mostrarDatos();
        System.out.println(" su codigo de supervisor es: " + codigoSupervisor + "\n");
    }

También estás utilizando bien distintas clases y métodos del api de Java.

La clase PRefriConge está bien planteada pues agrupa aspectos comunes.

- El ejercico CU00688B pedía crear una clase envío de productos, indicas que en vez de esta clase estaría la clase Recoger -- > problema: con el diseño orientado a objetos tratamos de en la medida de lo posible representar la realidad de los problemas. No es lo mismo un EnvíoDeProductos que un Recoger, esto no se consideraría bien planteado en la programación orientada a objetos.

- Cuando ejecuto un programa si creo un producto congelado me lo muestra por pantalla al pedir mostrar, pero sin embargo si creo un producto fresco no muestra nada por pantalla (esto parece un fallo)


Saludos

346
Hola arcanFAC, con las correcciones introducidas creo que has redondeado el ejercicio, gracias por subirlo pues puede servir de modelo para otras personas que estén realizando el curso. Saludos!

347
Hola Dan! Todo correcto. Generar clases bien documentadas es un aspecto importante de la programación profesional Java, con esto ya tienes por lo menos una idea general o punto de partida sobre aspectos de documentación de código Java. A continuar. Saludos.

348
Hola arcanFAC, en primer lugar felicitarte porque este es un ejercicio un poco extenso y se ve que lo has trabajado, y bien trabajado. Tanto el diseño (estructura) como el código en general podemos decir que están bien planteados. En algunos aspectos no has seguido exactamente lo que pedía el enunciado. Voy a comentarlo por partes.

Dentro de la clase Producto has incluido como atributos private String fechaEnvasado; y private String paisOrigen; Aunque el enunciado no lo dice explícitamente, si se lee con detenimiento son atributos de todos los productos, por tanto has hecho bien llevando esos atributos a un nivel superior, evitando la repetición en las diferentes subclases.

También has hecho bien creando la clase ProductoRefCong como abstracción que engloba todo lo común de ProductoRefrigerado y Productocongelado. Esto se corresponde con el apartado del enunciado donde dice

Citar
Crear superclases intermedias (aunque no se correspondan con la descripción dada de la empresa) para agrupar atributos y métodos cuando sea posible. Esto corresponde a “realizar abstracciones” en el ámbito de la programación, que pueden o no corresponderse con el mundo real.

En la clase CongeladoPorAire has definido estos atributos:

public class CongeladoPorAire extends ProductoCongelado{
   private String nitrogeno;
   private String oxigeno;
   private String dioxidoCarbono;
   private String vaporAgua;

Dado que los datos de composición son un %, es decir, un valor numérico, hubiera sido más adecuado declarar estos atributos como valores numéricos (por ejemplo double):


public class CongeladoPorAire extends ProductoCongelado{
   private double nitrogeno;
   private double oxigeno;
   private double dioxidoCarbono;
   private double vaporAgua;

Tener en cuenta que los String son para almacenar información textual. Si se trata de valores numéricos debemos usar un tipo numérico.

Lo mismo ocurre en las clases CongeladoPorAgua y CongeladoPorNitrogeno: deberías haber declarado los atributos como de tipo numérico en lugar de String.

Por lo que comentas esto ya lo conocías, pero si lo conocías lo lógico hubiera sido resolverlo usando los tipos numéricos

Has definido una clase de nombre Intermedio. No me parece mal. Lo único que te recomendaría es que pongas un nombre a la clase que describa lo que hace. Intermedio no describe lo que hace la clase. El nombre debería ser GestorProductos ó GestorListasProductos u otro descriptivo. Dentro de esta clase el método public void agregarProducto(String caracteristica) parece una muy buena idea para evitar la repetición de código, creo que es un buen ejemplo para que pueda ser consultado por personas que revisen ejercicios en los foros.

Te has saltado esta parte del enunciado:

Citar
Crear una clase testHerencia3 con el método main donde se creen: dos productos frescos, tres productos refrigerados y cinco productos congelados (2 de ellos congelados por agua, otros 2 por agua y 1 por nitrógeno). Mostrar la información de cada producto por pantalla.

Pero a cambio has incluido un menú y opciones que demuestran que dominas perfectamente lo que se pretendía con el ejercicio.

Aunque con algunos detalles que se podrían corregir, me ha parecido muy buen ejercicio. Mi enhorabuena.

Saludos.

349
Hola, en relación al comentario de toni

Citar
Aprovecho la ocasión para apuntar.
BlueJ acepta la 'ñ' en el código, pero no sé otros IDEs o sistemas. De la misma forma que no usamos acentos en el código, es mejor no usar los acentos ni eñes y usar palabras que no incorporen esos signos de puntuación.

La opción de no usar eñes ni tildes es lo más recomendable porque aunque puede ser aceptada en general por Java y por distintos IDEs, se nos puede presentar un problema cuando tratemos de trasladar y ejecutar el código en algunos sistemas donde no se reconocen esos caracteres.

En resumen, si en nuestro pc se ejecuta el código con tildes y eñes podemos usar estos caracteres, pero para tratar de ser lo más compatibles posibles con cualquier sistema y pc preferible evitar usar estos caracteres.

Saludos

350
Hola Dan, todo correcto.

La declaración LinkedList <Boolean> listaBoleana = new LinkedList<>(); también puede hacerse así: List <Boolean> listaBoleana = new LinkedList<>(); pero esto es una cuestión que se estudia más adelante en el curso y no hay que adelantar acontecimientos. Adelante.

Saludos

351
Hola Dan, depende de lo que necesites cuando estés programando. En este caso (este ejercicio del curso) ambas opciones son válidas ya que lo único que necesitamos es poder operar con el número y ver los resultados, no hay una mejor que otra. Saludos.

352
Hola Dan todo bien aunque prestando atención comprobamos que nos dice que el número de intentos es uno menos de los realmente realizados. La corrección es sencilla:

Código: [Seleccionar]
       else if(num == aleatorio)
            {
                intentos++;
                System.out.println("Has acertado!!! el numero es: " + num + " (intentos " + intentos +")");
            }

Saludos

353
Hola anfearab, para un número de identificación, cédula o pasaporte lo más habitual es usar VARCHAR con la longitud de caracteres que se desee, por ejemplo 30. El motivo es que estos números pueden incluir en algunos países letras, y también que no son valores con los que se vaya a operar matemáticamente (o si hubiera que hacerlo se haría usando funciones de conversión).

Saludos

354
Hola en primer lugar felicitarte por haber resuelto el ejercicio, que es un tanto complejo. Si tienes interés en mejorar las cosas mejorables son:

- Hay repetición de código en tu solución. La repetición de código debe evitarse. Esto es una cuestión de diseño del código, no es fácil hacer buenos diseños. Normalmente las personas que saben hacer buenos diseños es porque han practicado mucho y consultado diseños que hacen otras personas y con el tiempo han ido aprendiendo a realizar buenos diseños. Te recomiendo que consultes esta solución propuesta https://www.aprenderaprogramar.com/foros/index.php?topic=2089 y la compares con la tuya. Seguidamente deberías "reformar" tu código por tí mismo tratando de hacerlo más compacto y evitar la repetición.

- Sería aconsejable que para practicar te acostumbres a ir trabajando con programas donde intervenga más de una clase. Por ejemplo aquí podrías haber usado una clase como EntradaDeTeclado.

Saludos

355
Hola Dan, ejercicio perfecto. Además de con valueof también se puede resolver de otras maneras, por ejemplo como se explica en www.aprenderaprogramar.com/foros/index.php?topic=2243

Saludos

356
Hola Dan la respuesta al ejercicio es correcta. Para mejorar te propongo que compares tu solución con esta: https://www.aprenderaprogramar.com/foros/index.php?topic=2108.0

Si te fijas en tu código hay cierta "repetición". En la medida en que puedas hacer el código más compacto y con menos repetición mejor programador serás, aunque no hay que obsesionarse por optimizar y compactar es bueno por lo menos ser consciente de ello. En la programación profesional se encuentran con frecuencia códigos muy poco optimizados...

Saludos.

357
Hola Lorenzo, hay algunas cosas interesantes. Una es:

¿Esta línea entra en algún momento en juego: Test(int atrib) { atributo1 = 0; } ?

Para responder esto podemos hacer una prueba. Ejecuta con BlueJ void main y New Test. Luego cambia la línea por

Test(int atrib) { atributo1 = 5;}

¿Hay algún cambio?

Si escribimos esto:

    Test(int atrib) {
        System.out.println("Instancia de clase creada");
        atributo1 = 5; }

¿Se ejecuta el constructor al invocar el main?

Finalmente suponiendo que esa línea entrara en juego, ¿para qué recibir un parámetro si no lo usamos?


Test.getAtrib1() es equivalente a getAtrib1(). Podemos decir que la segunda forma es una forma abreviada que tenemos de hacer referencia a los métodos de una clase, pero siempre podrían referenciarse anteponiéndoles el nombre de la propia clase.

Como dices con this estaríamos refiriéndonos a una variable de instancia.

No puedes usar this en un método static porque static hace referencia a algo común a todos los objetos que se creen de ese tipo. No puedes referirte a "esta instancia" cuando static está indicando que no es de instancia sino de clase.

Estos conceptos son un poco complejos pero se van asimilando a medida que se va estudiando y haciendo más ejercicios.

Saludos

358
Hola Lorenzo, el ejercicio está bien resuelto, de hecho has hecho más de lo que se pedía, ya que tan sólo se pedía documentar una clase y has documentado tres y todo bien, así que perfecto. Saludos.

359
Hola Wolf, el ejericio está bien resuelto, en líneas generales puede decirse que es una buena respuesta.

Si has seguido el curso desde el principio y has ido viendo las soluciones propuestas en los foros, verás que tanto los métodos get como los set los solemos incluir "por norma" dentro de las clases Java, independientemente de que las variables se inicialicen en el constructor. El constructor define lo que pasa cuando se inicializa el objeto, pero ¿qué ocurre si necesitas cambiar el objeto después de inicializado? En ese caso usarías un método set.

Como podrás leer en otros hilos recomendamos poner nombres a las clases en singular. No ProductosFrescos por ejemplo, sino ProductoFresco, porque la clase representa, permite crear, objetos de tipo ProductoFresco. No suena igual decir "he creado un ProductoCongelado" que "he creado un ProductoCongelados".

En la clase ProductosCongelados has declarado private String TemperaturaRecomendada; pero hubiera sido mejor private int temperaturaRecomendada; porque ese dato es un valor numérico, y para manejar valores numéricos se deben usar tipos numéricos.

También recuerda que los nombres de atributos de clase por convención deben empezar con minúscula.

Espero que estas indicaciones te sirvan de ayuda

Saludos

360
Hola Lorenzo, esta solución responde perfectamente a lo que pedía el ejercicio:

Código: [Seleccionar]
import java.util.Arrays;
import java.util.LinkedList;

public class BooleanosArray55{   
    public static void main (String[] args){
        Boolean [] arrayBooleanos = {true, true, false, false, true, false};
        LinkedList <Boolean> listaUnida = new LinkedList <Boolean>(Arrays.asList(arrayBooleanos));
        System.out.println(listaUnida);
    }
}

La transformación a String es algo que no pedía el ejercicio, ni es algo que se suela hacer habitualmente (no sé bien si lo has querido hacer para probar o si interpretaste que debías hacerlo).

Hay algo interesante: Java nos permite transformar un array de objetos (por ejemplo Boolean o String) en una lista usando asList. Pero no nos permite transformar un array de tipos primitivos en una lista usando asList.


Puede ocurrir que necesitemos transformar un array de tipo primitivo boolean a algún tipo de lista como LinkedList ó ArrayList de Boolean (es decir, pasar de un array de tipos primitivos a una colección de objetos).

Aunque no lo pedía el ejercicio, para quien tenga interés esto podría hacerse así:

Código: [Seleccionar]
import java.util.Arrays;
import java.util.LinkedList;

public class BooleanosArray9{   
    public static void main (String[] args){
        boolean [] arrayBooleanos = {true, true, false, false, true, false};
        LinkedList<Boolean> boolList = new LinkedList<Boolean>();
    for (int index = 0; index < arrayBooleanos.length; index++)   {             
                                       boolList.add(arrayBooleanos[index]);    }   
        System.out.println("boolList: "+boolList);
    }
}

Saludos

Páginas: 1 ... 13 14 15 16 17 [18] 19 20 21 22 23 ... 32

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".