Ver Mensaje Individual
  #5 (permalink)  
Antiguo 26/12/2010, 18:37
limbvirgin
 
Fecha de Ingreso: noviembre-2010
Ubicación: León, Nic.
Mensajes: 13
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Opinión sobre dividir clases

En mi opinión, sí deberías separar ciertos métodos a fin de dar más y mejor identidad a tu clase.

Por ejemplo, puedes tener una clase específica, llamada MyUser, que contenta los métodos relativos a un usuario a la vez: supón que me llamo Oscar, por ende la clase MyUser estará ligada (en su momento, cuando cargues los datos de Oscar - desde la base de datos - a la clase MyUser).

Class MyUser.
getAge
GetDatosUser
getUserActivacionKey

Si te fijas, esto puede traducirse a que "oscar" le puedes hacer un getAge, o un GetDatosUser, o un getUserActivacionKey, pues son datos propios de una entidad (en este caso el usuario "oscar").

changePassword también podría ir en esa clase, aunque es una acción bastante más propia del Sistema que de Oscar. Todo depende de la lógica que implementes. Yo lo agregaría a la clase MyUser. Login y logout no.
Eso lo dejaría en otra interfaz que bien pudiera llamarse "class System", encargada de los login, LogOut, cookies, y variables de sesión ($_SESSION[ ] ), también de escritura y lectura de ficheros en el servidor, escritura de logs. etc.

getTotalRegistrados, si te fijas, yo no puedo decir "Oscar"->getTotalRegistrados(); (recuerda que cuando digo "oscar" es sinónimo de la clase MyUser). Entonces MyUser, como se trata de un objeto, no puede saber cuántas personas están registradas. La consulta debe devolver la suma de una -COLECION- de datos. Por tanto debería pertenecer a una clase encargada de generalidades y colecciones de datos, por ejemplo:

Class UsersTable.
*getTotalRegistrados
*correoDisponible -> la función deberá buscar en una -colección- de objetos si el correo está disponible, por eso está aquí.
*nickDisponible -> misma descripción que la anterior.
*addNewUser -> puede estar aquí, o puede estar en MyUser.

Generalmente cuando se trabaja con POO, y base de datos relacionales, se suele implementar la lógica de mapear las entidades - que han sido definidas en la base de datos - en objetos manejables por PHP (en nuestro caso).

Por ejemplo, la clase MyUser, la declararía así.
class MyUser {
private id;
private nombre;
private edad;

#los setters
public function setId($id){
$this->id=$id;
}
#los demás setters para las demás columnas o atributos
#los getters.
public function getId(){
return $this->Id;
}
#a como había dicho, agregar un nuevo usuario puede ser implementado aquí directamente:
public function save(){
$existe=UsersTable::find($this->id);
if($existe==false)
UsersTable::addNewUser($this->id, $this->nombre, $this->edad);
else
UsersTable::updateUser($this->id,$this->nombre,$this->edad);
}
}


Espero esto te ayude un poco. Sigue leyendo patrones de POO. Ahorita estoy en plena fase de aprendizaje de Symfony, y a través de los libros he aprendido mucho. (así que esto no lo inventé yo, jojojo, ya estaba inventado cuando llegué ;)

Saludos y suerte!