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
No pienses demasiado, esas funciones están bien. – ken2k
:), 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
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