Yo sugeriría tanto por razones teóricas y prácticas por qué el enfoque que está usando (refactorización el código común a un método separado y decir que es tanto de entrada y obtener métodos) es superior a la alternativa aparentemente más simple de simplemente hacer que uno de esos dos métodos llame al otro.
Desde un punto de vista teórico, "el método A delega completamente al método B" implica una noción de "primacía" o "asimetría" - una decisión de diseño que, en adelante, cualquier cambio que pueda aplicarse a B inevitablemente intrínsecamente se aplican a A también; que A pueda ser ligeramente personalizado en el futuro con respecto a B (agregando algún código adicional antes y/o después de la llamada de A a B) pero nunca al revés. Cuando no hay ninguna razón para esperar tal primacía, es una mala decisión de codificación insertar esa noción en su código. Al hacer que tanto A como B invoquen el método privado común C, se evita romper la simetría.
Algunas personas no están contentas con los argumentos teóricos y prefieren las pragmáticas: afortunadamente, en este caso, lo teórico se traduce directamente a la bonita pragmática. De nuevo, es un problema de evolución futura del código: tener llamadas A y B de C deja todos los grados de libertad necesarios para realizar pequeñas personalizaciones (agregar código antes y/o después de la llamada a C) a cualquiera, ambos o ninguno de A y B. Como no sabes qué partes de esta flexibilidad necesitarás, y el costo en términos de simplicidad es minúsculo, tomar la ruta simple y flexible es altamente pragmático y aconsejable.
Un último punto pragmática (aplicando a una u otra opción): Cada vez que haya un patrón como:
def amethod(self):
return cmethod(self)
que está por lo general (modestamente) mejor reformular esto como
amethod = cmethod
Este evita un nivel innecesario de anidamiento de llamadas (el plano es mejor que el anidado). Por lo tanto, la clase podría ser útil codificado:
class ListSubs(webapp.RequestHandler):
def _run(self):
self.response.out.write("This works even better!")
get = post = _run
No es gran cosa, y que tendrá que refactorizar volver a la forma original de "anidado", siempre y cuando no es necesario aplicar ajustes antes o después de la llamada anidada (desde get
hasta _run
, etc.) o necesita otros ajustes en la depuración (por ejemplo, establezca un punto de interrupción en su depurador en post
pero sin tener el punto de interrupción en get
, etc.), pero una pequeña simplificación para aquellos tiempos en que sea factible.
¡Gracias, no es una lección que olvidaré en mucho tiempo! –