Java - Ayuda con programa de java orientado a objetos

 
Vista:
sin imagen de perfil
Val: 9
Ha aumentado su posición en 5 puestos en Java (en relación al último mes)
Gráfica de Java

Ayuda con programa de java orientado a objetos

Publicado por Carlos antonio (1 intervención) el 29/05/2020 01:48:18
Una ayudadita ya que recien me estoy iniciando en programacion orientado a objetos y no logro entender muy bien . Un estacionamiento requiere un software para llevar a el control de las plazas y el cobro asociado al uso de ellas por parte de los clientes. Un estacionamiento contiene un numero definido de plazas dado por el usuario del software. Cada plaza puede almacenar un automóvil y tiene un estado que informa si está ocupada o no dado si existe un estacionamiento en el. Cada vez que se estaciona un auto en una plaza determinada se debe crear un registro asociado a la plaza el cual autodefine la hora de inicio del servicio y se mantiene pendiente hasta que finaliza su servicio guardando la hora en que esto sucede. Cuando se decide finalizar el servicio, adicionalmente se debe calcular el costo total del servicio dictado por la clase “CalculadoraCosto”. Adicionalmente el estacionamiento debe ofrecer la posibilidad de mostrar el estado de todas las plazas y mostrar las plazas disponibles.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
-2
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda con programa de java orientado a objetos

Publicado por Kabuto (1381 intervenciones) el 29/05/2020 19:44:36
A ver, lo primero es analizar el enunciado y detectar "entidades".
Las "entidades" son quienes intervienen en el problema/programa y debemos decidir si necesitamos modelarlas como clases individuales.

1
Un estacionamiento contiene un numero definido de plazas dado por el usuario del software.

Hay tenemos dos posibles entidades.

Estacionamiento. ¿Vamos a querer saber cosas de él?
Sí, por ejemplo vamos a querer saber cuantas plazas tiene. Así que tendremos una clase llamada Estacionamiento

Plazas. ¿Vamos a querer saber cosas de ellas?
Sí, vamos a querer saber si están ocupadas o libres. Si están ocupadas, vamos a querer saber a que hora se ocupó, o sea, cuándo comenzó el servicio y querremos saber cuándo dejó de estar ocupada para calcular el costo del servicio.
Así que tendremos una clase llamada Plaza

El enunciado incluso nos dice que tipo de relación va a haber entre estas dos entidades:
1
Un estacionamiento contiene un numero definido de plazas dado por el usuario del software.
La clase Estacionamiento va a contener una cantidad determinada de objetos Plaza. Y esta cantidad la va a decidir el usuario del programa.
Para modelar esto una posible forma es hacer que Estacionamiento tenga como atributo una array de objetos Plaza. Y el tamaño de este array lo decidirá el usuario cuando el programa se inicie.

Sigamos viendo más cosas del enunciado.
1
Cada plaza puede almacenar un automóvil y tiene un estado que informa si está ocupada o no dado si existe un estacionamiento en el.

Plaza ya sabemos que será una clase.
Pero hay otra entidad, la entidad automóvil. ¿Vamos a querer saber cosas de los automóviles?
¿Queremos saber su matrícula, su color, su marca, modelo, cantidad de plazas, tamaño, peso..?
Pues no, en principio no nos interesa nada de esto.
Así que la entidad automóvil NO será una clase de nuestro programa.

De la frase anterior, si hay algo que nos interesa:
1
Cada plaza puede almacenar un automóvil y tiene un estado que informa si está ocupada o no dado si existe un estacionamiento en el.

Esto nos indica un posible atributo para la clase Plaza, un atributo que indique si está ocupada o no, y puesto que son dos posibles opciones, si o no, verdadero o falso, parece claro que será un atributo boolean.

Sigamos:
1
Cada vez que se estaciona un auto en una plaza determinada se debe crear un registro asociado a la plaza el cual autodefine la hora de inicio del servicio y se mantiene pendiente hasta que finaliza su servicio guardando la hora en que esto sucede.
De aquí deducimos dos atributos más para Plaza Hora de inicio de ocupación, y hora de fin de la ocupación.
Estos atributos se "autodefinen", o sea son automáticos. Podemos deducir que habrá un método para indicarle al objeto Plaza que se ha estacionado un coche. Y este método tendrá que hacer cosas como registrar la hora de ese momento, cambiar el valor del atributo booleano y eliminar cualquier posible valor guardado en el atributo que registra la hora de quedarse libre, ya que ahora mismo está ocupada.
Para guardar el tiempo de ocupación y desocupación, se puede usar la clase LocalTime que ofrece la API de Java.


Otro método hará lo inverso, indicarle a Plaza que se ha quedado libre, cambiar de nuevo el boolean y registrar la hora de este momento.

Que más...

1
Cuando se decide finalizar el servicio, adicionalmente se debe calcular el costo total del servicio dictado por la clase “CalculadoraCosto

Aquí es evidente. Vamos a tener una clase llamada CalculadoraCosto que será quien calcule el costo del servicio. No se nos da más pistas de como debe funcionar esta clase, así que queda a merced de nuestra imaginación.
A priori, parece lógico que esta clase deberá tener un atributo que indique cuánto cuesta una hora de estacionamiento, o el minuto, o el segundo...
En un programa real, lo lógico sería cobrar por horas o por minutos.
Sin embargo, al ser este un ejercicio de prueba, quizás nos interese cobrar por segundos. Más que nada porque vamos a querer comprobar los importes que se calculan al ocupar y desocupar plazas.
Y si cobramos por horas, no vamos a estar horas y horas con el programa funcionando para ver distintos cálculos je je...

La clase CalculadoraCosto, para poder hacer el cálculo, tendrá que recibir el tiempo que ha estado ocupada una determinada plaza. Así que tendrá un método que reciba este tiempo ocupado, compute el costo del servicio según la tarifa establecida y retorna este resultado.


Por último:
1
Adicionalmente el estacionamiento debe ofrecer la posibilidad de mostrar el estado de todas las plazas y mostrar las plazas disponibles.

Aquí nos indica una funcionalidad que debe ofrecer la clase Estacionamiento, es decir, tendrá un método que recorra todo el array de objetos Plaza y nos informe de su estado actual.


Bien, recapitulando. Parece ser que al menos vamos a tener estas tres clases:
Plaza, Estacionamiento y CalculadoraCosto

Ya podemos ponernos a escribirlas.

La clase Plaza hemos dicho que tendría tres atributos:
boolean para indicar si está ocupada o no.
inicio de la ocupación, podemos usar la clase LocalTime
fin de la ocupación, también sirve LocalTime

Los métodos que podemos necesitar.

Informar de si la plaza está ocupada o no.
Basta con retornar el valor del atributo boolean.

Iniciar la ocupación de la plaza.
Que registre la hora actual en el "inicio de ocupación", cambie el valor del boolean a true y elimine cualquier posible valor anterior del atributo "fin de ocupación"

Finalizar la ocupación de la plaza
Registrar la hora actual en "fin de ocupación" y cambiar el valor del boolean a false. El atributo "inicio de ocupación" no debe modificarse en este momento, porque necesitaremos su valor registrado para luego calcular el tiempo que ha estado ocupada la plaza.

Informar del tiempo que ha estado ocupada
Basta comparar los objetos LocalTime de fin e inicio de ocupación y retornar los segundos de diferencia entre ellos, ya que hemos decidido cobrar por segundo en este ejercicio.
Una forma sencilla de calcular la diferencia de segundos es pedirle a cada LocalTime que nos devuelva "el segundo del día en que registró su tiempo".
Es decir, 1 día tiene 86.400‬ segundos en total. Cada momento del día equivale a uno de estos segundos. Pues obteniendo el segundo correspondiente a cada LocalTime y calculando la diferencia entre ellos, sabremos cuántos segundos ha estado la plaza ocupada.

Además de estos métodos, nos puede interesar sobreescribir el método toString() que TODAS las clases de Java heredan automáticamente.
Este método se usa para retornar un String que describa el estado y/o los atributos de este objeto en concreto. Es decir, que mensaje queremos mostrar en pantalla que describa a cada Plaza.

El enunciado pedía tener una opción para mostrar el estado de todas las Plazas. De esto, se va a encargar la clase Estacionamiento, pero podemos facilitárselo si a las Plazas les configuramos un String que automáticamente describa su estado.
Para ello, podemos sobreescribir (override) toString() y hacer que, si el booleano dice que la plaza está libre, retornar un String indicándolo.
Y si está ocupada, el String indicará esto y además podemos hacer que indique la hora en que se inició la ocupación.

Esta podría ser la clase Plaza
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import java.time.LocalTime;
 
public class Plaza {
 
	private boolean ocupada;
	private LocalTime inicioOcupacion;
	private LocalTime finOcupacion;
 
	public Plaza() {
		ocupada = false;  //Al comenzar el programa, las plazas están libres
	}
 
	/**
	 * Informa de si la Plaza esta ocupada o no.
	 * @return True si está ocupada, False si está libre
	 */
	public boolean estaOcupada() {
		return ocupada;
	}
 
	/**
	 * Inicia una nueva ocupación de la plaza,
	 * registrando el momento del tiempo en que
	 * esto sucede.
	 */
	public void ocuparPlaza() {
		inicioOcupacion = LocalTime.now();
		ocupada = true;
		finOcupacion = null;
	}
 
	/**
	 * Finaliza la ocupación de la plaza,
	 * registrando el momento del tiempo en que
	 * esto sucede.
	 */
	public void liberarPlaza() {
		finOcupacion = LocalTime.now();
		ocupada = false;
	}
 
	/**
	 * Retorna la cantidad de segundos en los que la plaza ha estado ocupada.
	 * @return Valor int con los segundos de ocupación.
	 */
	public int getTiempoOcupada() {
		return finOcupacion.toSecondOfDay() - inicioOcupacion.toSecondOfDay();
	}
 
	/**
	 * Retorna un String informando del estado actual de la plaza.
	 * Si está ocupada, además informa de la hora en que se inició
	 * la ocupación.
	 */
	@Override
	public String toString() {
		if (ocupada)
			return "La plaza está ocupada. Tiempo inicio: " +
				inicioOcupacion.getHour() + ":" + inicioOcupacion.getMinute() +
				 ":" + inicioOcupacion.getSecond();
		else
			return "La plaza está libre";
 
	}
 
}

Leetela y asegurate de que entiendes cada línea. Lo que no entiendas, pregúntalo.

Ahora, intenta tú modelar las siguientes clases.

Recuerda que Estacionamiento tendrá un array de Plaza como atributo.
Y que el tamaño de ese array lo decide el usuario al iniciar el programa, así que el constructor de Estacionamiento puede recibir por parámetro el valor que haya indicado el usuario en el programa principal, y con este valor, inicializar el array con el tamaño deseado.

Ha de tener métodos para indicarle a cada plaza cuando se ocupa o se libera. Así que al menos estos métodos necesitará recibir el número de plaza a ocupar/liberar (que equivaldría a la posición del array que ocupa cada plaza)

Otro método ha de informar del estado de todas las plazas. Es decir, recorrer todo el array y mostrar en pantalla un texto que describa el estado de cada plaza. Por esto, a Plaza le hemos dado un método toString(). Así, la clase Estacionamiento no tendrá que consultar los atributos de cada plaza para informar por pantalla, le va a bastar con imprimir lo que reciba del método toString()

Inténtalo, comienza un código, da igual si acaba siendo un desastre.
Cuando no sepas continuar, muestra aquí lo que hayas conseguido y te ayudamos a completarlo. Pero tienes que intentarlo tú primero.
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar