24

Stavo esaminando la classe StringTokenizer.java e c'erano alcune domande che mi venivano in mente.Metodi privati ​​su metodi pubblici

Ho notato che i metodi pubblici che devono essere utilizzati da altre classi hanno invocato un metodo privato che ha fatto tutto il lavoro. Ora, so che uno dei principi dell'OOD è quello di rendere il più possibile privato e nascondere tutti i dettagli di implementazione. Non sono sicuro di capire completamente la logica dietro questo però.

Capisco che è importante rendere privati ​​i campi per impedire che vengano memorizzati valori non validi in essi (solo uno dei tanti motivi). Tuttavia, quando si tratta di metodi privati, non sono sicuro del motivo per cui sono così importanti.

Ad esempio, nel caso della classe StringTokenizer, non è possibile che abbiamo inserito tutto il codice di implementazione nei metodi pubblici? Come avrebbe fatto la differenza per le classi che usano questi metodi poiché l'API per questi metodi (vale a dire le regole per chiamare questi metodi pubblici) rimarrebbe la stessa? L'unica ragione per cui posso pensare perché i metodi privati ​​sono utili è perché ti aiuta a scrivere codice duplicato. Ad esempio, se tutti i metodi pubblici hanno fatto la stessa cosa, è possibile dichiarare un metodo privato che esegue questa attività e che può essere utilizzata dai metodi pubblici.

Altra domanda, qual è il vantaggio di scrivere l'implementazione in un metodo privato rispetto a un metodo pubblico?

Ecco un piccolo esempio:

public class Sum{ 

    private int sum(int a, int b){ 
     return a+b; 
    } 

    public int getSum(int a, int b){ 
     return sum(a,b); 
    } 
} 

... Vs

public class Sum{ 

    public int getSum(int a, int b){ 
     return a+b; 
    } 
} 

Com'è il primo campione più vantaggioso?

risposta

28

Per aggiungere qualcosa, un metodo privato può SEMPRE essere modificato in modo sicuro, perché si sa per certo che viene chiamato solo dalla propria classe, nessuna classe esterna è in grado di chiamare un metodo privato (non possono nemmeno vedere esso).

Quindi avere un metodo privato è sempre buono, come sapete non c'è alcun problema nel cambiarlo, anche se potete tranquillamente aggiungere più parametri al metodo.

Ora pensa a un metodo pubblico, chiunque potrebbe chiamare tale metodo, quindi se aggiungi/rimuovi un parametro, dovrai anche modificare TUTTE le chiamate a quel metodo.

+1

Non ho potuto ottenere il tuo punto. Perdonami se mi manca qualcosa. Mi dici: "Quindi avere un metodo privato è sempre buono, perché sai che non c'è alcun problema nel cambiarlo, anche se puoi tranquillamente aggiungere più parametri al metodo". Ma l'API pubblica di fronte al cliente è sempre la stessa. quindi scrivi tutta la logica all'interno di un metodo pubblico o chiama una funzione al suo interno o fai qualunque cosa il client che guarda all'API pubblica non osservi alcuna differenza. Il codice all'interno dell'implementazione può ancora essere modificato in qualsiasi momento, il che equivale a modificare il contratto/l'implementazione della funzione privata – Saurabh

+0

@saury In questo caso particolare, sì, è la stessa API, ma non è ancora garantito che manterrà lo stesso in futuro Dalla mia esperienza personale posso consigliarti dall'idea di "Oh, facciamolo pubblico direttamente e, se in futuro ne abbiamo bisogno, lo cambieremo". Quello che finisce per accadere è che tali metodi non sono mai diventati privati, quindi è meglio avere un po 'di sovra-architettura all'inizio piuttosto che finire a fare un enorme refactoring in seguito. –

+0

Se un metodo pubblico chiama il metodo privato che è stato modificato "senza problemi", il metodo pubblico non si interromperà comunque? Se è così, non c'è davvero alcuna differenza nel "cambiare in modo sicuro" qualsiasi cosa; tutto ciò che si modifica deve essere testato: renderlo pubblico/privato non ti darà ulteriore sicurezza in questa materia. – gented

2

L'unico motivo per cui posso pensare perché i metodi privati ​​sono utili è perché ti aiuta a scrivere codice duplicato.

Oltre al consolidamento del codice duplicato (spesso espresso come "Non ripetere te stesso" o "DRY"), l'utilizzo di metodi privati ​​può anche aiutarti a strutturare e documentare il codice. Se ti ritrovi a scrivere un metodo che fa diverse cose, potresti prendere in considerazione la possibilità di suddividerlo in diversi metodi privati. Ciò potrebbe rendere più chiaro quali sono gli input e gli output per ogni elemento logico (con una granularità più fine). Inoltre, i nomi dei metodi descrittivi possono aiutare a completare la documentazione del codice.

+1

Sì, sono d'accordo con te su questo.La domanda che sto tentando di porre è questa, perché è utile scrivere il codice di implementazione in un metodo privato rispetto a un metodo pubblico? Se dovessimo inserire tutto il codice all'interno del metodo pubblico, quale sarebbe la differenza? In sostanza, stiamo ancora chiamando il metodo pubblico nello stesso modo e ci aspettiamo ancora che restituisca lo stesso risultato di prima. – kpatelio

+3

@ user600194 Mantenere il codice privato nasconde i dettagli di implementazione e consente alle implementazioni di cambiare senza interrompere i consumatori API. Il livello di nascondimento/incapsulamento è spesso arbitrario (e occasionalmente capriccioso). –

0

Fare funzioni privato vi dà vantaggio in caso di:

  1. Fare funzione privata dà JVM compilatore la possibilità di inlining della funzione e quindi incrementare la prestazione dell'applicazione
  2. Se la classe è ereditabile e si estendono da una classe figlio, quindi nel caso in cui si desideri nascondere le funzioni dalla classe figlio, è possibile farlo (è possibile estendere StringTokenizer).
  3. Se un pezzo di codice deve essere utilizzato in molteplici funzioni si sposta che il codice nel metodo di utilità privata
+0

Il tuo # 3 non è un * vantaggio * del privato; il codice condiviso può essere pubblico o privato. –

+0

Ok, per spiegare il mio punto, aggiungo che hai una serie di funzioni di implementazione dell'algoritmo (tutte pubbliche). Ora, nel caso in cui le diverse API debbano calcolare la radice quadrata della somma del quadrato di due numeri, è meglio spostare questa logica in una funzione privata che prende due numeri come input. Rendere pubblica una tale funzione potrebbe non avere molto senso poiché la tua classe sta fornendo la soluzione a diversi livelli di problemi algoritmici. Fare una tale funzione pubica potrebbe vanificare la definizione di quella classe. – Saurabh

1

Quando si scrive codice pulito in Java o qualsiasi altro linguaggio orientato agli oggetti, in generale, il più pulito più leggibile il codice consiste in metodi concisi e concisi. Spesso emerge che la logica all'interno di un metodo potrebbe essere espressa meglio in chiamate di metodo separate per rendere il codice più pulito e più gestibile.

Con questo in mente, possiamo immaginare situazioni in cui vi sono molti metodi che eseguono compiti verso un singolo obiettivo. Pensa a una classe che ha un solo scopo complesso. Il punto di ingresso per quell'unico obiettivo può richiedere solo un punto di partenza (un metodo pubblico) ma molti altri metodi che fanno parte dell'operazione complessa (molti metodi di aiuto privati).

Con metodi privati ​​siamo in grado di nascondere la logica che non è e non dovrebbe essere accessibile da qualsiasi luogo al di fuori della classe stessa.

1

I metodi pubblici sono in genere codice che le altre classi che implementano quella classe vorranno utilizzare. I metodi privati ​​non sono generalmente utili al di fuori della classe, o non (da soli) servono allo scopo di ciò che la classe intende realizzare.

Supponiamo che tu sia nel tuo IDE di scelta e implementi una classe A. La classe A è progettata solo per fare una cosa, ad esempio la generazione di documenti. Naturalmente nella classe A ci saranno alcuni metodi operativi matematici e di byte per la generazione di documenti, ma le persone che cercano di usare la Classe A non avranno bisogno di questi altri metodi, perché vogliono semplicemente un documento. Quindi rendiamo privati ​​questi metodi per mantenere le cose semplici per ogni futuro utente della nostra classe.

0

Un vantaggio e anche un buon motivo per utilizzare metodi privati ​​all'interno di classi pubbliche è per la sicurezza e la prevenzione degli errori. I metodi dichiarati come privati ​​sono accessibili solo dalla classe di cui fanno parte. Ciò significa che il tuo metodo privato non può essere chiamato accidentalmente da un'altra parte del programma, riducendo bug e altre complicazioni. Se dichiari il tuo metodo come pubblico, puoi accedere all'intero problema e causare complicazioni.

Si può avere un numero di metodi che funzionano su una determinata parte di dati che non si desidera che qualsiasi altra parte del programma sia in grado di interferire. L'utilizzo dell'incapsulamento dei dati tramite metodi e/o variabili privati ​​aiuta a prevenire questo e rende anche il codice più facile da seguire e documentare.

1

Lo scopo di dichiarare un metodo privato è

  • dettagli nascondere implementazione
  • escludono il metodo da essere indicato come API pubblica
  • assicurarsi che la logica dietro il codice non è utilizzato/impropriamente esternamente
  • la maggior parte delle volte l'esecuzione del proprio metodo dipende da altri metodi eseguiti prima di esso; quindi puoi anche essere sicuro di controllare la sequenza corretta di utilizzo del metodo

Utilizzare private per i metodi a meno che non si intenda utilizzare il metodo in modo sicuro al di fuori del contesto della classe.

Problemi correlati