Foros del Web » Programando para Internet » PHP »

PHP OO Resuelve el éxamen

Estas en el tema de Resuelve el éxamen en el foro de PHP en Foros del Web. Hola pues como andaba viendo algo de POO, pues me encontré un exámen y me di cuenta que usar tantos frameworks no me hace nada ...
  #1 (permalink)  
Antiguo 06/05/2016, 19:55
Avatar de memoadian
Colaborador
 
Fecha de Ingreso: junio-2009
Ubicación: <?php echo 'México'?>
Mensajes: 3.696
Antigüedad: 14 años, 10 meses
Puntos: 641
Resuelve el éxamen

Hola pues como andaba viendo algo de POO, pues me encontré un exámen y me di cuenta que usar tantos frameworks no me hace nada bien.



Así que lo resolví y se los dejo para ver quienes quieren probar sus conocimientos.

ENUNCIADO:

Es preciso desarrollar una aplicación para el control de las estadísticas de

una liga de baloncesto de mala muerte

. Se debe hacer, obligatoriamente, con el paradigma orientado a

objetos y PHP. Si no se utilizasen objetos para su resolución, las

calificaciones serían 0.0 en todos los apartados. No ha de crearse

base de datos, ni variables de sesión ni mejoras visuales. Sólo PHP.

Se han de construir las siguientes clases de objetos

Clase Jugador:

•Atributos:

Nombre, protegido de tipo cadena de caracteres

Estatura, protegido de tipo numérico

•Métodos:

Constructor __construct() que recibe los 2 atributos privados

Dame_Nombre (), que devuelve el atributo Nombre

Dame_Estatura (), que devuelve el atributo Estatura

Clase Base, que hereda de Jugador:

•Atributos:

Asistencias, privado de tipo numérico

•Métodos:

Constructor __construct () que recibe el atributo Asistencias y los 2

atributos heredados.

Dame _Asistencias (), que devuelve el atributo Asistencias

Clase Alero, que hereda de Jugador:

•Atributos:

Puntos, privado de tipo numérico

•Métodos:

Constructor __construct() que recibe el atributo Puntos y los 2 atributos

heredados.

Dame_Puntos (), que devuelve el atributo Puntos

Clase Pivot, que hereda de Jugador:

•Atributos:

Rebotes, privado de tipo numérico

•Métodos:

Constructor __construct() que recibe el atributo Rebotes y los 2 atributos

heredados.

Dame _Rebotes (), que devuelve el atributo Rebotes

Clase Equipo:

•Atributos:

Nombre_Equipo, privado de tipo cadena de caracteres

Integrantes, privado, array de 5 objetos de las clases Base, Alero ó

Pivot pero NUNCA DE LA CLASE JUGADOR

Un Equipo podría tener cualquier combinación de 5 objetos de las

clases Base, Alero ó Pivot. Podrían, por ejemplo, ser:

•2 Bases + 2 Aleros + 1 Pivot o

•1 Base + 2 Aleros + 2 Pivots o

•5 Bases

•...

•Métodos:

Constructor __construct() que recibe el atributo Nombre_Equipo

y los 5 objetos de las clases Base, Alero ó Pivot. Este método debe

visualizar el Nombre_Equipo y el tipo de los 5 Integrantes del equipo.

Dame _Nombre_Equipo (), que devuelve el atributo Nombre_Equipo

Estatura _Media (), que devuelve la Estatura media de los 5 integrantes

del equipo.

Maxima _Estatura (), que devuelve la mayor de las Estaturas de los 5

integrantes del equipo.

Puntos_Medios_Aleros (), que devuelve los Puntos medios de los

integrantes de un equipo. MUCHO OJO: Los Puntos es un atributo que

sólo está presente en los objetos de la clase Alero. Para el desarrollo de

este método pueden añadirse a las clases los atributos y/o métodos que se

consideren necesarios.

Apartados a desarrollar

A partir de los datos expuestos con anterioridad, se debe desarrollar una

aplicación PHP con los siguientes apartados, todos ellos en el mismo

archivo PHP:

Apartado. Construcción de la clase Jugador con sus atributos y métodos.

Apartado 2. Construcción de las clases Base, Alero y Pivot con sus atributos

y métodos. Si los atributos no se declaran privados, este apartado se calificará

con 0 puntos.

Apartado 3. Construcción de la clase Equipo con sus atributos y métodos.

Este apartado se descompone es los siguientes sub-apartados:

•Apartado 3.1. Declaración de los atributos Nombre_Equipo e Integrantes y

construcción del método__construct()

•Apartado 3.2: Construcción del método Dame_Nombre_Equipo ().

•Apartado 3.3: Construcción del método Estatura_Media ().

•Apartado 3.4: Construcción del método Maxima_Estatura ().

•Apartado 3.5: Construcción del método Puntos_Medios_Aleros ().

Apartado4: Utilizando las clases desarrolladas en los Apartados 1,2 y 3,

crear un total de 1 objeto de la clase Base, 4 objetos de la clase Alero

y 2 objetos de la clase Pivot y, a partir de esos 7 objetos, crear un objeto de la

clase Equipo (Que sólo tiene 5 integrantes).

Apartado 5: A partir del objeto de la clase Equipo desarrollado en el

Apartado 4, invocar los métodos Estatura_Media (), Maxima_Estatura ()

y Puntos_Medios_Aleros (), mostrando los resultados que estos devuelven. Algo así como:


Código:
Se ha creado un equipo: Gallos Secuaces 2

Base: Marc Welber
Alero: Benjamin Estemen
Alero: Colo Mawan
Alero: Ryan Bremhlin
Pivot: Michael Mayer

La estatura media es: 201.4

La estatura Máxima es: 220

Puntos medios aleros: 27.666666666667
les dejo mi código, seguro que ustedes lo hacen mejor que yo

https://gist.github.com/anonymous/75...24b4c21e404a1b
  #2 (permalink)  
Antiguo 09/05/2016, 03:32
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: Resuelve el éxamen

Basándome en tu implementación, no en la que yo haría:
- Sobre la clase "Jugador":
Todo jugador tiene un "rol" (de qué juega).Estos "roles" tienen que estar definidos en algún sitio.Para mí, un buen sitio es la propia clase "Jugador":
Código PHP:
Ver original
  1. class Jugador{
  2.         const ROLE_BASE=1;
  3.         const ROLE_ALERO=2;
  4.         const ROLE_PIVOT=3;
  5.     protected $nombre;
  6.     protected $estatura;
  7.         protected $role;
  8.         function __construct( $nombre, $estatura, $role )
  9.         {
  10.               $this->role=$role;
  11.               .....
  12.         }
  13.         function is($role)
  14.         {
  15.               return $this->role == $role;
  16.          }
El método "isAlero" que hay en las distintas clases, desaparece.Cada jugador debe saber de qué juega.Por lo tanto, los métodos relacionados con la posición, están en la clase jugador, no en las derivadas.
Código PHP:
Ver original
  1. $isAlero=$jugador->is(Jugador::ROLE_ALERO);
Cualquier jugador puede tener "Puntos","Asistencias" o "Rebotes", independientemente de su rol .Por lo tanto, el método de estar en la clase "Jugador", no en sus derivadas:
Código PHP:
Ver original
  1. var $puntos:
  2.        var $rebotes;
  3.        var $asistencias;
  4.        function setStats($puntos, $rebotes, $asistencias)
  5.        {
  6.               $this->puntos=$puntos;
  7.               $this->rebotes=$rebotes;
  8.               $this->asistencias=$asistencias;
  9.         }
( Que sea un método aparte significa que se crea un problema: este método debe ser llamado antes de realizar operaciones sobre el jugador.Esto es debido al muy muy pobre ejercicio que se ha planteado...)
Por lo tanto, dado cómo se ha planteado el ejercicio, qué es lo único que es propio de cada clase derivada de jugador? Su rol:
Código PHP:
Ver original
  1. class Alero extends Jugador
  2.     {
  3.              function  __construct($nombre, $estatura)
  4.              {
  5.                     parent::__construct($nombre,$estatura,Jugador::ROLE_ALERO);
  6.              }
  7.      }
Y así, todos los tipos de jugador.

La clase Equipo no tiene complejidad en lo que se refiere a OOP.
OOP consiste en asignar responsabilidades.Saber qué clase tiene sentido que tenga una responsabilidad.Lo importante no es el código, sino ver cosas como que, si todo Jugador tiene una función en el equipo, qué función es esa, lo debe saber la clase Jugador.Si todo jugador puede hacer puntos, rebotes o asistencias, esto significa que son métodos de la clase Jugador.

Por otro lado, si esto es un examen, de OOP, realmente es desastroso como ejercicio.El planteamiento es muy malo en lo que respecta a OOP. Un jugador no tiene asistencias, ni puntos, ni rebotes.Un Equipo no tiene "puntos medios de los aleros".Un Equipo no tiene 5 integrantes.

Un Equipo tiene una Plantilla de Jugadores, los cuales juegan Partidos, los cuales tienen su propia PlantillaPartido (jugadores existentes en la plantilla, cuando se jugó ese partido),donde se producen unas EstadisticasEquipoPartido, que contienen unas EstadisticasJugadorPartido.
Los puntos los hace un Jugador, en un cierto partido (o competición, o...).No es algo propio del jugador.Por lo tanto, tampoco la media de puntos es una propiedad de "Equipo".

Seguramente el modelo es más complejo, pero creo que lo anterior es una aproximación que describe lo que quiero decir.

Supongo que el ejercicio se ha sobre-simplificado para el examen.Pero, el resultado es que se pide una solución que viola los principios de la OOP, para evaluar OOP. Esto no va de cómo es la sintaxis de "class", o "private" o "protected".Esto va de saber que un Equipo, no tiene "PuntosMedios".
  #3 (permalink)  
Antiguo 09/05/2016, 06:07
Avatar de memoadian
Colaborador
 
Fecha de Ingreso: junio-2009
Ubicación: <?php echo 'México'?>
Mensajes: 3.696
Antigüedad: 14 años, 10 meses
Puntos: 641
Respuesta: Resuelve el éxamen

Cita:
Iniciado por dashtrash Ver Mensaje
Por otro lado, si esto es un examen, de OOP, realmente es desastroso como ejercicio.
Así es de hecho es un pésimo exámen, pero pues es un exámen real. Por eso lo hice tal cual lo pide, de hecho parece un exámen de preparatoria de Java o c++. jejeje

  #4 (permalink)  
Antiguo 09/05/2016, 06:35
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: Resuelve el éxamen

Cita:
Iniciado por memoadian Ver Mensaje
de hecho parece un exámen de preparatoria de Java o c++. jejeje

No.Es igual de malo en cualquier lenguaje.Como decía en mi respuesta, OOP no va de qué sintaxis se usa para declarar una clase.
  #5 (permalink)  
Antiguo 09/05/2016, 06:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Resuelve el éxamen

Cita:
Iniciado por memoadian Ver Mensaje
Así es de hecho es un pésimo exámen, pero pues es un exámen real. Por eso lo hice tal cual lo pide, de hecho parece un exámen de preparatoria de Java o c++. jejeje

En la universidad tuve dos o tres profesores que ponían en los parciales ejercicios de esta calidad. AL principio yo lo explicaba por ignorancia o incapacidad didáctica. Algunos eran realmente irracionales, contrarios al sentido común, en especial los de Analisis de Sistemas.
Con el tiempo me di cuenta que en realidad la idea era justamente que nos acostumbrásemos a requerimientos de la vida real, en que los usuarios suelen plantear pedidos que entran en conflicto con nuestro propio sentido comun. Hoy mismo en la empresa para la que trabajo algunos pedidos que me llegan me hacen pensar que el usuario que los escribe tiene mal recetado lo que está consumiendo, o no debería empezar a tomar bebidas tan temprano

En algunos casos de ejercicios de programación, el objetivo no era la solución en sí del ejercicios, sino evaluar cómo razona el alumno; ver si es capaz de encontrar el camino mas eficiente, o simplemente repite formulas aprendidas sin analizar el ejercicio. O incluso descubrir vicios de programación.

A veces las razones por las que proponen ciertas ejercitaciones son francamente crípticas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 09/05/2016, 12:28
Avatar de memoadian
Colaborador
 
Fecha de Ingreso: junio-2009
Ubicación: <?php echo 'México'?>
Mensajes: 3.696
Antigüedad: 14 años, 10 meses
Puntos: 641
Respuesta: Resuelve el éxamen

Cita:
Iniciado por dashtrash Ver Mensaje
No.Es igual de malo en cualquier lenguaje.Como decía en mi respuesta, OOP no va de qué sintaxis se usa para declarar una clase.
Yo no lo digo por el lenguaje, lo digo por que en mi preparatoria, enseñaban supuestamente programación OO, y los ejercicios eran algo así como este, pero en C++, obviamente, eran profesores que ni idea tenían.

En conclusión, no me refiero al lenguaje si no al nivel preparatoria.
  #7 (permalink)  
Antiguo 11/05/2016, 19:23
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Resuelve el éxamen

Los problemas evalúan cosas en cierto contexto, si esto fuera un examen de diseño orientado a objetos vale todo lo que comentaron anteriormente, pero en realidad lo que busca el problema desde mi punto de vista es determinar si puedes hacer uso de la herencia, lo cual se cumple en el código que dejaron en github.
Por otro lado como se comento el código se puede mejorar, se pudo haber hecho uso de clases abstractas y patrones de diseño, refactorizacion, pruebas, etc..
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Etiquetas: variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:54.