Universidad Rafael Landívar - Campus San
Alberto Hurtado, S.J. de Quetzaltenango
Curso: Pensamiento Computacional
Docente: Ing. Manuel Rojas
Actividad 41: Auditoría de Calidad - Mejorando una Solución
Integrantes:
Nombre: Michael Paolo Santizo Nowell
Carné: 1623225
Nombre: Juan Pedro Colomo Gonzales
Carné: 1653625
Nombre: Jordi Raymundo Racancoj
Carné: 1648324
1. Análisis del código original
Revisamos un sistema funcional que representa un entorno académico con estudiantes,
profesores, cursos y una universidad. Aunque el sistema ejecuta tareas básicas,
presenta algunos errores de diseño y la lógica que afectan su calidad y
profesionalismo.
2. Clasificación de errores detectados
# Error detectado Tipo de error Explicación
1 Atributos públicos Diseño Rompe el principio
en todas las clases de
encapsulamiento
de POO.
2 Falta de validación Lógico Permite duplicados
en inscripción a y sobrecupo.
cursos
3 Relación uno a uno Diseño Limita la
entre profesor y funcionalidad del
curso sistema.
4 Repetición de Calidad Dificulta el
código en métodos mantenimiento del
de impresión sistema.
5 Variables con Legibilidad Complican la
nombres poco lectura del código.
descriptivos (`c`,
`e`, `p`)
6 Clases con Diseño No siguen el
responsabilidades principio de
mezcladas responsabilidad
única.
3. Justificación de mejoras
Estas mejoras aumentan la calidad del sistema porque:
- Protegen los datos (encapsulamiento).
- Aseguran el comportamiento correcto (validaciones lógicas).
- Hacen el sistema escalable (múltiples cursos/profesores).
- Facilitan el mantenimiento y la lectura (legibilidad y modularidad).
4. Conclusión
Las mejoras propuestas ayudan a que el código básico se transforme en una solución
más profesional y alineada con los principios de la programación orientada a objetos.
5. Códigos
CODIGO CON ERRORES
class Estudiante:
def __init__(self, nombre, edad, carnet):
# Atributos públicos violan el principio de encapsulamiento.
self.nombre = nombre
self.edad = edad
self.carnet = carnet
self.cursos = []
def agregar_curso(self, curso):
# No valida si el curso ya está en la lista puede duplicarse.
self.cursos.append(curso)
def mostrar_info(self):
# Código repetido similar a mostrar_detalles en Curso.
print("Nombre:", self.nombre)
print("Edad:", self.edad)
print("Carnet:", self.carnet)
print("Cursos inscritos:")
for c in self.cursos:
print(c.nombre)
class Profesor:
def __init__(self, nombre, especialidad):
# Atributos públicos otra vez.
self.nombre = nombre
self.especialidad = especialidad
def asignar_curso(self, curso):
# Límite artificial: un profesor solo puede tener un curso.
self.curso = curso # solo un curso
class Curso:
def __init__(self, nombre, codigo, cupo):
# Atributos públicos, otra vez sin encapsulamiento.
self.nombre = nombre
self.codigo = codigo
self.cupo = cupo
self.estudiantes = []
self.profesor = None
def agregar_estudiante(self, estudiante):
# No valida cupo máximo.
# No valida si el estudiante ya está inscrito.
self.estudiantes.append(estudiante)
def asignar_profesor(self, profesor):
self.profesor = profesor
def mostrar_detalles(self):
print("Curso:", self.nombre)
print("Código:", self.codigo)
print("Cupo:", self.cupo)
print("Estudiantes:")
for e in self.estudiantes:
# Variable poco descriptiva ("e").
print(e.nombre)
if self.profesor:
print("Profesor:", self.profesor.nombre)
else:
print("Sin profesor asignado")
class Universidad:
def __init__(self, nombre):
# Atributos públicos sin encapsular.
self.nombre = nombre
self.estudiantes = []
self.profesores = []
self.cursos = []
def agregar_estudiante(self, estudiante):
# No valida duplicados.
self.estudiantes.append(estudiante)
def agregar_profesor(self, profesor):
self.profesores.append(profesor)
def agregar_curso(self, curso):
self.cursos.append(curso)
def mostrar_todo(self):
print("Universidad:", self.nombre)
print("Profesores:")
for p in self.profesores:
# Variable poco descriptiva ("p").
print(p.nombre)
print("Estudiantes:")
for e in self.estudiantes:
print(e.nombre)
print("Cursos:")
for c in self.cursos:
print(c.nombre)
CODIGO CORREGIDO
#Codigo Corregido
class Estudiante:
def __init__(self, nombre, edad, carnet):
self.__nombre = nombre
self.__edad = edad
self.__carnet = carnet
self.__cursos = []
def agregar_curso(self, curso):
if curso not in self.__cursos:
self.__cursos.append(curso)
def get_nombre(self):
return self.__nombre
def mostrar_info(self):
print(f"Nombre: {self.__nombre}")
print(f"Edad: {self.__edad}")
print(f"Carnet: {self.__carnet}")
print("Cursos inscritos:")
for curso in self.__cursos:
print(f" - {curso.get_nombre()}")
class Profesor:
def __init__(self, nombre, especialidad):
self.__nombre = nombre
self.__especialidad = especialidad
self.__cursos = []
def asignar_curso(self, curso):
if curso not in self.__cursos:
self.__cursos.append(curso)
def get_nombre(self):
return self.__nombre
def mostrar_cursos(self):
print(f"Profesor: {self.__nombre}")
print("Cursos asignados:")
for curso in self.__cursos:
print(f" - {curso.get_nombre()}")
class Curso:
def __init__(self, nombre, codigo, cupo):
self.__nombre = nombre
self.__codigo = codigo
self.__cupo = cupo
self.__estudiantes = []
self.__profesor = None
def agregar_estudiante(self, estudiante):
if estudiante not in self.__estudiantes:
if len(self.__estudiantes) < self.__cupo:
self.__estudiantes.append(estudiante)
estudiante.agregar_curso(self)
else:
print(f"No hay cupo disponible para el curso {self.__nombre}")
else:
print(f"{estudiante.get_nombre()} ya está inscrito en {self.__nombre}")
def asignar_profesor(self, profesor):
self.__profesor = profesor
profesor.asignar_curso(self)
def get_nombre(self):
return self.__nombre
def mostrar_detalles(self):
print(f"Curso: {self.__nombre}")
print(f"Código: {self.__codigo}")
print(f"Cupo disponible: {self.__cupo - len(self.__estudiantes)}")
print("Estudiantes inscritos:")
for estudiante in self.__estudiantes:
print(f" - {estudiante.get_nombre()}")
if self.__profesor:
print(f"Profesor: {self.__profesor.get_nombre()}")
else:
print("Sin profesor asignado")
class Universidad:
def __init__(self, nombre):
self.__nombre = nombre
self.__estudiantes = []
self.__profesores = []
self.__cursos = []
def agregar_estudiante(self, estudiante):
if estudiante not in self.__estudiantes:
self.__estudiantes.append(estudiante)
def agregar_profesor(self, profesor):
if profesor not in self.__profesores:
self.__profesores.append(profesor)
def agregar_curso(self, curso):
if curso not in self.__cursos:
self.__cursos.append(curso)
def mostrar_todo(self):
print(f"Universidad: {self.__nombre}")
print("\nProfesores:")
for profesor in self.__profesores:
print(f" - {profesor.get_nombre()}")
print("\nEstudiantes:")
for estudiante in self.__estudiantes:
print(f" - {estudiante.get_nombre()}")
print("\nCursos:")
for curso in self.__cursos:
print(f" - {curso.get_nombre()}")