Hola, buenas noches. Tengo una consulta en particular:
Mi programa posee un calendario, que tiene como atributos un "organizador de eventos" y un "asistente de invitados" (ambos fueron creados como objetos). En la creación de un evento, calendario llama al organizador de eventos, el cual requiere del asistente de invitados para consultar acerca de que si existen recursos ocupados o no. ¿Estoy violando el encapsulamiento si realizo lo siguiente?:
agregarEventoSimpleConNombre: unNombre invitados: unosInvitados enAnio: unAnio mes: unMes dia: unDia hora: unaHora yAsistente: elAsistente
| eventoNuevo recursosRequeridos |
eventoNuevo := EventoSimple new.
recursosRequeridos := OrderedCollection new.
recursosRequeridos := (elAsistente detectarRecursosDe: unosInvitados).
(self detectarSiHayAlgunRecursoOcupadoPorOtroEvento: recursosRequeridos enAnio: unAnio mes: unMes dia: unDia hora: unaHora) ifTrue: [ RecursoOcupadoError signal. ].
eventoNuevo crearEventoSimpleConNombre: unNombre invitados: unosInvitados enAnio: unAnio mes: unMes dia: unDia hora: unaHora.
eventosSimples add: eventoNuevo.
Aclaración: cuando el calendario quiere crear un Evento, llama al organizador de eventos y le manda ese mensaje, pasándole como parámetro su asistente de invitados.
En caso de estar violándolo, ¿cuál podría ser una opción para resolver este problema?
Muchas gracias, Ailén.
Hola Ailén:
En primer lugar por favor no compartas tu solución a través del foro. Y por otro lado, lo que preguntás es justamente uno de los problemas que se espera que resuelvas y justifiques en el informe.
Si tenés dudas acerca de la violación del encapsulamiento en situaciones concretas podés preguntar abiertamente sobre el ejemplo de la biblioteca que compartí el jueves o con cualquiera de la guía de ejercicios.
En resumen, deberías lograr que tus clases tengan pocas responsabilidades y que deleguen aquellas que no les corresponden. Si, por ejemplo, en una entidad A tenés alguna estructura de control para preguntar alguna información sobre otra entidad B y, en función de esa respuesta, realizar algo en la entidad A, muy probablemente sea mejor delegarle toda esa responsabilidad a la entidad B y que de alguna manera B determine qué acción realizar (muy probablemente de alguna manera polimórfica). Es decir, no preguntarle, sino decirle que haga ("Tell, don't ask").
Saludos,
Tomás
PD: Sí, en tu ejemplo muy probablemente estés violando el encapsulamiento en el método "detectar ..." aunque el primer problema que se ve es la gran cantidad de responsabilidades que tenés en un solo método.