2012-03-06 16 views
12

Como muestra la interrogación,string.IsNullOrEmpty (myString) o string.IsNullOrWhiteSpace (myString) no viola la regla de SRP?

Como estamos utilizando funciones de cadena como IsNullOrEmpty o IsNullOrWhiteSpace como el nombre de funciones de espectáculos, éstos están haciendo más de un trabajo, ¿no es una violación de SRP?

más bien no debería ser string.isValid (Enum typeofValidation) que usar el patrón de estratagemas para elegir la estrategia correcta para validar.

o está perfectamente bien violar SRP en la clase de utilidades o clases estáticas.

+3

No pienses demasiado, esas funciones están bien. – ken2k

+0

:), absolutamente, tienes razón, pero a veces me confunde mucho, así que pensé que esta vez, yo preguntaría con los expertos de la industria. – TalentTuner

+0

Creo que agregar algo parecido a un patrón a estas 2 funciones aumenta la confusión y la legibilidad de su código. Simplemente mantenlo simple (estúpido) – Alex

Respuesta

16

El SRP dice que una función o clase solo debe tener un motivo para cambiar. ¿Cuál es una razón para cambiar? Una razón para cambiar es un usuario que solicita cambios. Por lo tanto, una clase o función solo debe tener un usuario que solicite cambios.

Ahora una función que hace algunos cálculos y luego un poco de formateo, tiene dos usuarios diferentes que podrían solicitar un cambio. Uno solicitaría cambios en los cálculos y el otro solicitaría cambios al formato. Dado que estos usuarios tienen diferentes necesidades y harán sus solicitudes y en diferentes momentos, nos gustaría que reciban servicios de diferentes funciones.

No es probable que IsNullOrEmpty (String) esté sirviendo a dos usuarios diferentes. El usuario que se preocupa por null probablemente sea el mismo usuario que se preocupa por el vacío, por lo que isNullOrEmpty no infringe el SRP.

+0

excelente, tengo lo que realmente estoy buscando. – TalentTuner

+0

¿tiene algún nombre de libros para referirse o enlaces para compartir? – TalentTuner

0

No veo esto haciendo más de una cosa. Solo es asegurarse de que su cuerda pase una condición requerida.

3

En la programación orientada a objetos, las única responsabilidad principio establece que cada objeto debe tener una única responsabilidad

Estás describiendo métodos: IsNullOrEmpty o IsNullOrWhiteSpace, que también son auto-descripción en lo que hacer, no son objetos. string tiene una responsabilidad única: ¡ser responsable de las cadenas de texto!

Los ayudantes estáticos pueden realizar muchas tareas si usted elige: el objetivo del principio de responsabilidad única es hacer que su código sea más fácil de mantener y legible para los equipos futuros y usted mismo. Como dice un comentario, no lo pienses demasiado. No está diseñando el marco aquí, sino consumiendo algunas partes que limpiarán sus cadenas y validará los datos entrantes.

+1

¿Quiere decir que SRP solo se aplica a los objetos pero no a las operaciones? Estoy de acuerdo con el comentario, no lo piense demasiado, solo quiero confirmar mi confusión. – TalentTuner

+0

Sí, SRP es otra forma de decir cohesión, un término muy antiguo OO :) –

+0

Pero como creo que SRP es válido tanto a nivel de objeto como a nivel de método, ambos deben tener una sola razón para el cambio, por ejemplo, escribí la función como SerilizeAndValidate (ObjectToSerilizeAndValidate), claramente este método/clase, está haciendo 2 cosas, Serilize y Validation, claramente una violación, algunos métodos de tiempo en una clase llevan a mantener la pesadilla como ejemplo anterior de serilize y validación – TalentTuner

2

El SRP se aplica a las clases, no a los métodos. Aún así, es una buena idea tener métodos que hagan una sola cosa. Pero no puedes llevar eso a los extremos. Por ejemplo, una aplicación de consola sería bastante inútil si su método principal pudiera contener solo una declaración (y, si la declaración es una llamada a un método, ese método también podría contener solo una declaración, etc., recursivamente).

Piense en la implementación de IsNullOrEmpty:

static bool IsNullOrEmpty(string s) 
{ 
    return ReferenceEquals(s, null) || Equals(s, string.Empty); 
} 

Así que, sí, es hacer dos cosas, pero que están hecho en una sola expresión. Si va al nivel de expresiones, cualquier expresión booleana que involucre operadores binarios booleanos podría decirse que está "haciendo más de una cosa" porque está evaluando la verdad de más de una condición.

Si le molestan los nombres de los métodos porque implican demasiada actividad para un solo método, envuélvalos en sus propios métodos con nombres que impliquen la evaluación de una sola condición. Por ejemplo:

static bool HasNoVisibleCharacters(string s) { return string.IsNullOrWhitespace(s); } 
static bool HasNoCharacters(string s) { return string.IsNullOrEmpty(s); } 

En respuesta a tu comentario:

dicen que escribí la función como SerilizeAndValidate (ObjectToSerilizeAndValidate), claramente este método/clase, está haciendo 2 cosas, serializar y validación, claramente una violación, algunos métodos de tiempo en una clase conduce a la pesadilla de mantenimiento como el anterior ejemplo de serialización y validación

Sí, usted tiene razón para estar preocupado por esto, pero de nuevo, no se puede, literalmente, tener métodos que hacen una sola cosaRecuerde que los diferentes métodos tratarán diferentes niveles de abstracción. Es posible que tenga un método de muy alto nivel que llame al SerializeAndValidate como parte de una secuencia larga de acciones. En ese nivel de abstracción, podría ser muy razonable pensar en SerializeAndValidate como una sola acción.

imaginar escribir un conjunto de instrucciones paso a paso para un usuario experimentado para abrir "propiedades" diálogo de un archivo:

  • el archivo
  • elegir la opción "Propiedades" clic con el botón derecho

Ahora imaginar escribir las mismas instrucciones para alguien que nunca ha utilizado un ratón antes:

  • Pos ition el puntero del mouse sobre el icono del archivo
  • Presione y suelte el botón derecho del mouse
  • Aparecerá un menú. Colocar el puntero del ratón sobre la palabra "Propiedades"
  • Pulsar y soltar el botón izquierdo del ratón

Cuando escribimos programas de ordenador, que necesitamos para funcionar a ambos niveles de abstracción. O, mejor dicho, en un momento dado, estamos operando en un nivel de abstracción u otro, para no confundirnos. Además, confiamos en el código de la biblioteca que opera en niveles más bajos de abstracción.

Los métodos también le permiten cumplir con el principio de "no repetir" (a menudo conocido como "SECO"). Si necesita serializar y validar objetos en muchas partes de su aplicación, querría tener un método SerializeAndValidate para reducir el código duplicado. Usted sería muy bien asesorado para implementar el método como un simple método de conveniencia:

void SerializeAndValidate(SomeClass obj) 
{ 
    Serialize(obj); 
    Validate(obj); 
} 

Esto le permite la conveniencia de llamar a un método, preservando al mismo tiempo la separación de la lógica de serialización de la lógica de validación, lo que debería hacer el programa más fácil de mantener

+0

vea mi segundo comentario en ChrisS answer. – TalentTuner

+0

@Saurabh He agregado algunas reflexiones relacionadas con ese comentario – phoog

+0

:), pregunta bastante discutible. Puedo couter su argumento, pero suena muy razonable para mí, por lo que aceptar como respuesta – TalentTuner

Cuestiones relacionadas