2010-12-06 9 views
6

He estado escribiendo una clase PHP que tiene exactamente 450 líneas y contiene 14 métodos estáticos y 4 propiedades estáticas, así como 6 constantes (y __construct() y __clone() privados).Tengo una clase con 14 métodos estáticos y 4 propiedades estáticas, ¿es malo?

Me pregunto aquí es que estoy haciendo algo mal, ¿mi clase es mala?

Cuando se utiliza la clase, que siempre a un solo método como:

MyClass::coolMethod(); 

y luego lo deja solos por completo por lo que parece que sería estúpido para que sea construible?

No tiene mucho sentido en la construcción de objetos, porque es más como una herramienta que contiene algunos métodos que puede llamar directamente.

En realidad, de esos 14 métodos, 7 de ellos son públicos, el resto son privados para que la clase los use.

+0

Así que estás usando la clase como espacio de nombres. Me parece perfectamente válido. Lo estás haciendo bien. Al menos hasta que cambie a PHP 5.3 o superior. –

+0

IMO está bien así. Usando la clase como un contenedor de agrupación. –

Respuesta

4

Debe evitar static tanto como global.

Las estáticas le dan las mismas desventajas que las globales le dan. Siempre que esté utilizando algún método de clase, estará codificando una dependencia de esa clase en el código de consumo. El resultado es un código estrechamente acoplado menos mantenible. Esto puede evitarse fácilmente por avoiding statics altogether y un uso disciplinado de Dependency Injection.

No se puede inyectar y pasar alrededor de las clases estáticas, por ejemplo, when you have to unit-test them, you cannot mock them (or at least only with some effort). Es simplemente doloroso. Static methods are death to testability.

Además, tenga en cuenta que las clases deben hacer una sola cosa. They should have a single responsibility. Repase su clase para ver si hay algo allí mejor ubicado en otro lugar para evitar escribir un God Class.

3

Depende del propósito de esta clase. Si los métodos son en su mayoría incoherentes en términos de datos, esta es una solución perfectamente válida de funciones de agrupación (ahora métodos). Esta es una muy mala idea si necesita compartir valores entre funciones, ya que eso sería más que una simple lista de funciones, agrupadas bajo un nombre común. Los espacios de nombres son otra opción, pero si está utilizando una versión PHP inferior a 5.3, esta es probablemente la mejor solución.

+1

De acuerdo, esto también ayuda a evitar el clásico "include (crapload_of_functions.php)" que muchos frameworks/aplicaciones php a menudo usan – JayTee

+1

. Ayuda a evitar eso solo si usa la carga automática. Al agruparlos en clases, usted hace que su código sea más limpio, no más rápido. –

2

Esto es como decir: "Tengo una casa con cuatro habitaciones. ¿Es eso malo?"

Los métodos estáticos no son ni buenos ni malos. Tener catorce métodos no es ni bueno ni malo. Tener catorce métodos estáticos es, por extensión, ni bueno ni malo.

Si en sus catorce métodos hace grandes esfuerzos para simular instancias de objeto o simular herencia, entonces algo ha ido terriblemente mal. PHP te permitirá crear instancias y admite la herencia, por lo que sería una tontería intentar simularlas de otra forma.

Pero si solo está utilizando su clase esencialmente como un espacio de nombres, donde las funciones y los datos trabajan juntos pero no hay instancias individuales de la clase con las que lidiar, no hay absolutamente nada de malo en eso.

1

No está mal. Sin embargo, con todos esos accesorios estáticos, es posible que desee considerar hacer de esto un singleton.

Aquí hay un código único que estoy usando en el marco que estoy construyendo. Puede dividirlo y convertirlo en el único método público para su clase que devuelve una versión de sí mismo.

class ClassName { 
    function getInstance() 
     { 
      static $instance; 

      if (!isset($instance)) 
     { 
       $instance = new ClassName(); 
      } 

      return $instance; 
     } 
} 

puede utilizar esta, a continuación, haciendo NombredeClase :: getInstance() -> othermethod();

La clase puede tener toneladas de valores privados y obtener todas las cosas buenas que tiene con un objeto.

+0

Creo que los singleton son una muy mala idea (son uno de los ejemplos más populares de antipatrones). Si realmente necesita valores privados, entonces necesita una clase real para ese propósito. Él solo quiere agrupar algunas funciones, como en un espacio de nombres, por lo que yo entiendo. – jwueller

+0

No estoy seguro de que los singletons sean antipatrones. Absolutamente pueden ser mal utilizados, pero eso es cierto para todos los patrones. ¿Qué te lleva a llamarlos un antipatrón? - Debo mencionar que en este marco, el singleton solitario es la aplicación principal que necesita no solo rastrear una gran cantidad de datos en un solo lugar, sino también poner a disposición una gran cantidad de recursos comunales (como los modelos). Cualquier otro método requeriría pasar referencias a ese objeto de control. Y todos sabemos cómo pueden ser las referencias y las referencias de loopy. – DampeS8N

+0

@ DampeS8N: Un singleton introduce estado global, que es malo. Además, hacen que las pruebas sean un verdadero desastre. El patrón del localizador de servicios sería una buena alternativa para pasar referencias como loco. – jwueller

0

Yo diría que no, no está mal. De hecho, esa era la única forma de fingir cierto comportamiento antes. Era, por ejemplo, una forma de falsificar espacios de nombres. Uno podría encapsular funciones en clases estáticas en lugar de tenerlas "fuera en la libertad". Así que muchos desarrolladores de PHP están familiarizados con esto y no confundirán a la mayoría de las personas. Sin embargo, lo que DEBERÍA intentar hacer hoy en día es hacer uso de la "nueva" función de espacio de nombres de PHP y, si es necesario, combinarla con un patrón único si realmente necesita almacenar datos en un formato de objeto. También podría tener una variable "global" contenida en su espacio de nombres y que a veces podría funcionar bien. Pero eche un vistazo a los espacios de nombres y vea si eso le queda de alguna manera y luego vea si el patrón singleton puede coincidir con sus necesidades específicas.

Cuestiones relacionadas