Cuando divido grandes métodos (o procedimientos, o funciones), esta pregunta no es específica de OOP, pero dado que trabajo en lenguajes de OOP el 99% del tiempo, es la terminología con la que me siento más cómodo en muchos pequeños. , A menudo me encuentro disgustado con los resultados. Se hace más difícil razonar sobre estos pequeños métodos que cuando solo eran bloques de código en el grande, porque cuando los extraigo, pierdo muchas suposiciones subyacentes que provienen del contexto de la persona que llama.
Más tarde, cuando miro este código y veo métodos individuales, no sé inmediatamente de dónde se llaman, y pienso en ellos como métodos privados comunes que se pueden llamar desde cualquier parte del archivo. Por ejemplo, imagine un método de inicialización (constructor o de otro tipo) dividido en una serie de pequeños: en el contexto del método en sí, usted sabe claramente que el estado del objeto aún no es válido, pero en un método privado ordinario probablemente pase de suponer que el objeto ya está inicializado y está en un estado válido.
La única solución que he visto para esto es la where
cláusula en Haskell, que le permite definir pequeñas funciones que se usan solo en la función "padre". Básicamente, se ve así:
len x y = sqrt $ (sq x) + (sq y)
where sq a = a * a
Pero otros lenguajes que uso no tienen nada como esto: lo más parecido es definir una lambda en un ámbito local, lo que probablemente sea aún más confuso.
Entonces, mi pregunta es: ¿te encuentras con esto e incluso ves que es un problema? Si lo hace, ¿cómo lo resuelve normalmente, particularmente en lenguajes OOP "convencionales", como Java / C # / C ++?
Edite sobre duplicados: como otros notaron, ya hay preguntas sobre métodos de división y pequeñas preguntas que son ingeniosas. Los leí, y no discuten el tema de los supuestos subyacentes que pueden derivarse del contexto de la persona que llama (en el ejemplo anterior, se inicializa el objeto). Ese es el punto de mi pregunta, y es por eso que mi pregunta es diferente.
Actualización: Si siguió esta pregunta y discusión debajo, podría disfrutar este artículo de John Carmack sobre el asunto , en particular:
Además de conocer el código real que se está ejecutando, las funciones en línea también tienen el beneficio de no permitir llamar a la función desde otros lugares. Eso suena ridículo, pero tiene sentido. A medida que un código base crece con los años de uso, habrá muchas oportunidades para tomar un atajo y simplemente llamar a una función que solo hace el trabajo que cree que debe hacerse. Puede haber una función FullUpdate () que llame a PartialUpdateA () y PartialUpdateB (), pero en algún caso particular puede darse cuenta (o pensar) que solo necesita hacer PartialUpdateB (), y está siendo eficiente al evitar el otro trabajo. Muchos y muchos errores se derivan de esto. La mayoría de los errores son el resultado de que el estado de ejecución no es exactamente lo que crees que es.