2012-01-04 10 views
10

Solo me pregunto, ¿cuándo deberíamos realmente usar private o protected para algunos métodos en el modelo?¿Cuándo deberíamos considerar el uso privado o protegido?

A veces no me puedo molestar en agrupar mis métodos en private ni protected. Simplemente lo dejo como está. Pero sé que debe ser una mala práctica, de lo contrario, estas 2 agrupaciones no se crearán en la programación.

Gracias.

Respuesta

15
  • Si va a llamar a un método externamente, record.method(), a continuación, "público"
  • Si se va a utilizar sólo internamente, self.method(), a continuación, "privado"
  • Si va a utilizar internamente, pero también en los descendientes, self.method() # in subclass, a continuación, "protegidos"
+2

Esto me suena un poco ... tu ** 3er punto **. Una subclase puede acceder internamente a los métodos 'privados' de su superclase. Un método 'protected' le da la capacidad de pasar un objeto de la misma clase y ejecutar métodos protegidos en ese objeto. – slindsey3000

+0

http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby "En realidad, se pueden llamar métodos protegidos siempre que el receptor sea de la misma clase que 'self'" – clyfe

0

No sé Rubí como un caso especial, pero supongo que la respuesta sería la misma que para otros idiomas también, así que aquí está:

Un método privado sólo se puede acceder por miembros de la misma clase, mientras que una protegida también está disponible para miembros de clases que extienden la clase base donde se declara el método.

+0

Yupp, es una pregunta de programación general. He leído lo que hacen 'private' y' protected', pero ¿cuándo no debemos ignorarlo? – Victor

+0

¿Te refieres al caso en que un método no está declarado como público, privado o protegido en absoluto? – fkerber

+0

@Victor No 'ignora' la encapsulación, pero en general, mantenga las cosas 'privadas' a menos que haya una buena razón para que estén 'protected' o' public' –

2

voy a dar mi opinión , y tal vez obtendrá una patada por ella, pero no se molestan con protegido o privado en Ruby. La realidad es que Ruby te trata como a un adulto, si quieres ejecutar un método privado desde fuera de la clase, puedes (allí areways). Puede ejecutar métodos protegidos fuera de la clase. Incluso puedes reasignar constantes ... puedes hacer lo que quieras, básicamente.

Y es por eso que me gusta, es su responsabilidad. Mi sensación es que, a marcar algo como protegida o privada que está haciendo dos cosas:

  1. Indicando que usted no cree un consumidor que va a necesitar.
  2. Segundo adivinando lo que alguien más necesita.

y, además, que está haciendo que sea más difícil de probar, ya que puede ser un verdadero dolor de los métodos de pruebas privadas (ver What's the best way to unit test protected & private methods in Ruby? de formas a su alrededor)

Para los dos últimos motivos, I don' Me molesto con ellos. Si realmente deseaba algún tipo de barrera entre sus clases/métodos y los consumidores (ya sean códigos o desarrolladores), entonces hay otras formas más efectivas (proxies, ofuscación, cifrado, métodos protegidos con contraseña, etc.). De lo contrario, ¿por qué no darles acceso a las mismas herramientas que usaste?

+1

+1 Tengo pensamientos similares El único motivo por el cual ** I ** lo uso: rdoc tiene la opción '--visibility'. Con público, protegido y privado puedo generar diferentes versiones de documentación con más o menos detalles. – knut

+0

@knut esa es una idea interesante, tendré que tener eso en cuenta. Tiendo a usar yardoc y tiene la etiqueta '@ private', pero nunca he visto de qué utilidad podría ser. Gracias. – iain

Cuestiones relacionadas