La encapsulación es clave para crear software confiable: oculta el estado interno, expone solo lo necesario y protege las invariantes del dominio. Aquí verás cómo convertir una clase en un bloque seguro con campos privados, getters y setters con validación, y manejo de errores con try y catch para no romper el flujo.
¿Cómo aplicar la encapsulación con campos privados y getters?
Usar campos privados con el símbolo numeral garantiza que el estado no se modifique desde fuera de la clase. El acceso externo directo provoca un syntax error, así que todo se controla desde métodos internos con this.
Define campos privados con el símbolo numeral antes del constructor.
Limita el acceso externo: solo desde métodos internos con this.
Expón datos con getters como propiedades de solo lectura.
classHabit{// Campos privados #name; #frequency; #id;constructor({ name, frequency, id }){// Usa setters para respetar validaciones e invariantes.this.name= name;this.frequency= frequency;this.#id= id;// sin setter: se asigna internamente.}// Getters: exponen lectura controladagetname(){returnthis.#name;}getfrequency(){returnthis.#frequency;}getid(){returnthis.#id;}}
¿Qué implicaciones tiene el acceso interno y externo?
Acceso interno: solo dentro de la clase con this y el nombre privado.
Acceso externo: bloqueado, se evita modificar el estado sin control.
Beneficio directo: se protege la coherencia del objeto.
¿Por qué los setters con validación protegen las invariantes del dominio?
Las invariantes del dominio son reglas que jamás deben romperse. Con setters validas y normalizas la entrada antes de guardar, evitando estados inválidos y manipulaciones malintencionadas desde el DOM del navegador.
Normaliza entradas: elimina espacios con trim.
Valida longitudes mínimas y formatos.
Restringe valores permitidos con listas de opciones.
classHabit{ #name; #frequency; #id;constructor({ name, frequency, id }){this.name= name;// valida y normalizathis.frequency= frequency;// restringe a opciones válidasthis.#id= id;}getname(){returnthis.#name;}getfrequency(){returnthis.#frequency;}getid(){returnthis.#id;}// Setter con normalización y longitud mínimasetname(value){const normalized = value.trim();if(normalized.length<3){thrownewError('el nombre del hábito debe de tener al menos tres caracteres');}this.#name= normalized;}// Setter con opciones acotadassetfrequency(value){const validFrequencies =['daily','weekly'];if(!validFrequencies.includes(value)){thrownewError('la frecuencia debe de ser daily o weekly');}this.#frequency= value;}}
¿Qué reglas de negocio quedan blindadas?
Nombre con mínimo de 3 caracteres.
Frecuencia solo en 'daily' o 'weekly'.
Estados inválidos bloqueados con throw new Error.
¿Cómo manejar errores con try y catch sin romper el flujo?
Cuando algo falla, no debe colapsar la experiencia. Con try y catch capturas los errores que lanzan los setters, muestras un mensaje claro con showMessage y detienes la operación con return null.