Pregunta

Problema

Supongamos que tiene un usuario de clase. Desea poder devolver este objeto de usuario a otros para que puedan usarlo para extraer información usando Getters. Sin embargo, no desea que las personas puedan establecer fácilmente el estado interno porque la información interna debe relacionarse directamente con una fila en la base de datos. ¿Tiene sentido tener mutadores protegidos (setters) para que solo una clase extendida pueda establecer las variables? ¿Es esta una mala práctica, irrelevante, excesiva o inútil?

He considerado tratar de limitar __construct a un uso (creo que esto a veces se arbitra como un patrón singleton, aunque no estoy seguro de si entiendo completamente).

Soy un programador aficionado, perdono cualquier ignorancia. Gracias.

Ejemplo:

<?php

    class user
    {

    private username;

    protected function set_username($username)
    {
        $this->username = $username;
    }

    public function get_username()
    {
        return $this->username;
    }

?>
¿Fue útil?

Solución

Depende. Si nada en particular debe suceder cuando se cambia el estado, puede dejar a los establecedores por completo. Cualquier subclase tendrá acceso directo a las propiedades que están protegidas o más sueltas.

Si necesita que suceda algo cuando el estado cambie (por ejemplo, tener una actualización de la base de datos que ocurra cuando cambia el estado), los setters hará que su vida sea mucho más fácil, ya que la llamada al código de actualización de la base de datos se coloca en el setter. Esto significa que si siempre pasa por el setter, el DB siempre se actualizará cuando cambie el estado del objeto.

Entonces, en resumen, depende.

Otros consejos

Si tiene un constructor que acepta una identificación, por ejemplo, ¿por qué querría tener setters en absoluto? No hay una regla que te obligue a dar a un establecimiento de objetos solo porque tiene Getters. Si su USECase está construyendo el objeto en algún lugar y después de eso solo úselo para extraer datos de él, simplemente cree ningún setter en absoluto.

La extensión de los objetos puede manipular las variables de clase protegidas para que no requieran ninguna forma de setter también. Si no desea que el "mundo exterior" pueda establecer algo en la clase, no lo permita.

Su código está muy bien y en mi humilde opinión encapsula perfectamente. TT también es compatible con el acoplamiento suelto.

Para un uso más fácil, puede agregar todos los miembros necesarios (debe tener) como parámetros de constructor.

Con respecto al patrón de singleton, úselo con cuidado. Los usuarios en común no son solteros. Consulte la refactorización de los patrones (Joshua Kerievsky).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top