2012-01-04 16 views
10

Basta chiedersi, quando dovremmo effettivamente usare private o protected per alcuni metodi nel modello?Quando dovremmo considerare l'utilizzo privato o protetto?

A volte non posso non essere preso la briga di raggruppare i miei metodi in privateprotected. Lascio semplicemente così com'è. Ma so che deve essere una cattiva pratica, altrimenti questi 2 gruppi non verranno creati in programmazione.

Grazie.

risposta

15
  • Se avete intenzione di chiamare un metodo esterno, record.method(), poi "pubblico"
  • Se verrà utilizzato solo internamente, self.method(), poi "privata"
  • Se si prevede di utilizzare internamente, ma anche in discendenti, self.method() # in subclass, quindi "protetto"
+2

Mi sembra un po 'strano ... il tuo ** 3 ° punto **. Una sottoclasse può accedere internamente ai metodi 'private' della sua superclasse. Un metodo 'protected' ti dà la possibilità di passare un oggetto della stessa classe ed eseguire metodi protetti su quell'oggetto. – slindsey3000

+0

http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby "i metodi protetti possono essere effettivamente chiamati ogni volta che il ricevitore appartiene alla stessa classe di" sé "" – clyfe

0

Non so di Ruby come un caso speciale, ma suppongo la risposta sarebbe la stessa per le altre lingue troppo, ecco che è:

Un metodo privato è accessibile solo dai membri del stessa classe, mentre un protetto è disponibile anche per i membri delle classi che estendono la classe base in cui è dichiarato il metodo.

+0

Yupp, è una domanda di programmazione generale. Ho letto cosa fanno 'private' e' protected', ma quando non dobbiamo ignorarlo? – Victor

+0

Intendi il caso, in cui un metodo non è dichiarato pubblico, privato o protetto? – fkerber

+0

@Victor Non si ignora l'incapsulamento, ma in generale si mantengono le cose 'private' a meno che non ci sia una buona ragione per essere' protected' o 'public' –

2

ti darò il mio parere , e forse avrò un calci per questo, ma non si preoccupano con protected o private in Ruby. La realtà è che Ruby ti tratta come un adulto, se vuoi eseguire un metodo privato al di fuori della classe, puoi (lì areways). Puoi eseguire metodi protetti al di fuori della classe. Puoi persino riassegnare le costanti ... in pratica puoi fare quello che vuoi.

Ed è per questo che mi piace, è una tua responsabilità. La mia sensazione è che per marcare qualcosa come protected o private che si sta facendo due cose:

  1. Indicando che non pensi un consumatore avrà bisogno.
  2. Secondo indovinare quello che qualcun altro ha bisogno.

e, inoltre, si sta rendendo più difficile per testare, in quanto può essere un vero e proprio dolore metodi di prova privati ​​(vedi What's the best way to unit test protected & private methods in Ruby? di modi intorno ad esso)

Per questi ultimi due motivi, I don' t rompiti con loro. Se vuoi davvero una sorta di barriera tra le tue classi/metodi e i consumatori (siano essi codice o sviluppatori) allora ci sono altri modi più efficaci (proxy, offuscamento, crittografia, metodi protetti da password ecc.). Altrimenti, perché non dare loro l'accesso agli stessi strumenti che hai usato?

+1

+1 Ho pensieri simili. L'unico motivo per cui ** I ** lo usa: rdoc ha l'opzione '--visibility'. Con pubblico, protetto e privato posso generare diverse versioni della documentazione con più o meno dettagli. – knut

+0

@knut è un'idea interessante, dovrò tenerlo a mente. Io tendo ad usare yardoc e ha il tag '@ private', ma non ho mai visto quale uso potrebbe essere. Grazie. – iain

Problemi correlati