Cada discusión de métodos Ruby privados vs. públicos en una clase muestra cómo declarar todos los siguientes métodos como privados (o públicos o protegidos):
class airplane def preflight end def engine_start return unless preflight_complete? end private def preflight_complete? end endEso funciona muy bien la mayor parte del tiempo, donde coloca todos sus métodos públicos en la parte superior y todos sus métodos privados en la parte inferior.
Tengo una clase de buen tamaño con tres métodos públicos y unas pocas docenas de métodos privados. Los privados están secuenciados de manera lógica para la comodidad del desarrollador.
Ahora, encuentro que hay 2 o 3 métodos anteriormente privados que necesito hacer públicos. No quiero llevarlos a la cima, lejos de sus vecinos contextuales. También me resulta torpe alternar entre public y private cada vez. Esto es particularmente molesto si el tamaño de la pantalla hace que la bandera public quede fuera de la vista y no es obvio que un segundo o tercer método nuevo sea público involuntariamente solo porque los inserté después del método público más solitario.
Entonces, ¿existe una manera elegante de evitar alternar público/privado para hacer público solo un método?
Simplemente ponga public (o privado, protegido) al comienzo de la definición del método:
class airplane def preflight end def engine_start return unless preflight_complete? end private def preflight_complete? end public def tanks_full? end def pilot_authorized? end end En este caso, pilot_authorized? sigue siendo privado, pero ¿alguien puede comprobar tanks_full?
Como alternativa, puede publicar este método a través de un contenedor público.
class airplane def preflight end def engine_start return unless preflight_complete? end def tanks_full? _tanks_full? end private def preflight_complete? end def _tanks_full? end def pilot_authorized? end endDe esta manera, su código todavía está claramente dividido en dos secciones, sin desertores sorpresa, y el método aún está cerca de sus vecinos contextuales.
Esto parece lo más legible para mí:
class Example def public_method1 end private def used_by_public_method1 end private def also_used_by_public_method1 end def public_method2 end private def used_by_public_method2 end def public_method3 end end