UTNianos

Versión completa: Enunciado Recuperatorio wollok objetos 2020
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
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

}
URLs de referencia