Dejo el enunciado del recuperatorio de objetos del 13/02/21 (correspondiente a la cursada 2020)
Si quieren la solucion mandenme un mensaje/contesten en el tema
Hola. De que profe es el recu? Si tenes la resolución pasamela por mensaje porfa
Hola me pasarias la resolucion del parcial? Me ayudarias muchisimo
holis, tenes la resolucion?
Hola gente. Mañana rindo objetos y me puse a hacer este Parcial. Creo que dentro de todo esta bastante bien: Se puede mejorar y optimizar? Seguro, pero estoy medio a contrareloj y con la cabeza re quemada jaja pero los conceptos CLAVES del paradigma están bien utilizados. Claramente, cada uno puede resolver el parcial de distinta forma, esta es solo una:
Codigo
//-----
//PAGINA
//-----
object paradigma {
const usuarios=[]
// 3. Realizar una recategorización general de todos los usuarios.
method recategorizacionGeneral(){
usuarios.forEach({usuario=> usuario.recategorizar()})
}
method altaUsuario(usuario){usuarios.add(usuario)}
method bajaUsuario(usuario){usuarios.remove(usuario)}
}
//-----
//USUARIOS
//-----
class Usuario{
const posts=[]
var categoria = novato
// 1. Hacer que un usuario postee un contenido
method postear(contenido) {posts.add(categoria.tipoPost(contenido))}
// 2.c Conocer el puntaje de un usuario
method puntaje() = posts.sum({post=>post.puntaje()})
// 4. Saber la cantidad de posts interesantes de un usuario
method cantPostInteresantes() = self.postInteresantes().size()
method recategorizar(){
categoria.recategorizarse(self)
}
method promoverA(nuevaCategoria ) {categoria=nuevaCategoria}
method tieneAlMenosUnPostDe(cant) = posts.any({post=>post.puntaje()>=cant})
method postInteresantes() = posts.filter({post=>post.esInteresante()})
}
class Categoria{
method tipoPost(contenido) = new Post(contenidoTextual=contenido)
method recategorizarse(usuario) {
if(self.cumpleConCategorizacion(usuario)) self.promocion(usuario)
}
method cumpleConCategorizacion(usuario)
method promocion(usuario)
}
object novato inherits Categoria{
override method cumpleConCategorizacion(usuario) = usuario.puntos() > 100
override method promocion(usuario) { usuario.promoverA(intermedio)}
}
object intermedio inherits Categoria{
override method cumpleConCategorizacion(usuario) = usuario.puntos() > 1000 and usuario.tieneAlMenosUnPostDe(500)
override method promocion(usuario) { usuario.promoverA(experto)}
}
object experto inherits Categoria{
override method tipoPost(contenido) = new PostPremium(contenidoTextual=contenido)
override method cumpleConCategorizacion(usuario) = false
override method promocion(usuario) {}
}
//-----
//POSTS
//-----
class Post{
var contenidoTextual
const opiniones = []
var estado = abierto
//2.a Agregar un comentario a un post.
method agregarComentario(comentario){
if(estado.permite()){
self.anadirOpinion(comentario)
}
}
//2.b Poder calificar un post con cierto número.
method agregarCalificacion(calificacion){ self.anadirOpinion(calificacion)}
method puntaje() = self.cantComentarios() + self.sumaDeCalificaciones()
method sumaDeCalificaciones() = opiniones.filter({opinion=>opinion.esCalificacion()}).sum({calificacion=>calificacion.cantUnidades()})
method cantComentarios() = opiniones.filter({opinion=>opinion.esComentario()}).size()
method anadirOpinion(opinion) {opiniones.add(opinion)}
method cambiarEstado(nuevoEstado) {estado=nuevoEstado}
method esInteresante() = self.cantComentariosExtensos() >= 20 and self.puntaje() >= 300
method cantComentariosExtensos() = opiniones.filter({opinion=>opinion.esComentario()}).filter({comentario=>comentario.esExtenso()}).size()
method todosComentariosExtensos() = opiniones.filter({opinion=>opinion.esComentario()}).all({comentario=>comentario.esExtenso()})
}
class PostPremium inherits Post{
override method sumaDeCalificaciones() = 2 * super()
override method esInteresante() = self.todosComentariosExtensos() and self.puntaje() >= 300
}
class Opinion{
method esCalificacion() = false
method esComentario() = false
}
class Comentario inherits Opinion{
const desc
method esComentario() = true
method esExtenso() = desc.size() > 240
}
class Clasificacion inherits Opinion{
const property cantUnidades
method esCalificacion() = true
}
object abierto{
method permite() = true
}
object cerrado{
method permite() = false
}