Per rendere una funzione di classe o no?

2

Mi sto interrogando sulle funzioni utilizzate in questo modo:

object1->objectMethod1(arg1, arg2);

se objectMethod1 :
- non cambia lo stato dell'oggetto
- non usa affatto lo stato dell'oggetto
- è ampiamente utilizzato dalla classe
- si adatta logicamente come usato dalla classe

dovrebbe essere trasformato in una funzione membro?

esempio:

class CSVFile {
private:
  filestream stream
  string header
  int num_columns
public:
  CSVFile(string filename)
  CSVFile() throws DefaultConstructorException()
...
CSVFile::initHeader() {
  header = stream.getLine()
  assert(isInCSVFormat(header)) <-- that

dovrebbe isInCSVFormat (stringa) essere una funzione membro o no?

    
posta user2738698 21.03.2014 - 20:54
fonte

4 risposte

1

Risponderei considerando le dipendenze. Presumo che la tua classe dipenda da questa funzione, quindi che altro fa?

Se nessun'altra classe fa, allora sì, dovrebbe essere inclusa nella classe. Potresti persino renderlo privato. Che si tratti di un metodo statico, di una classe statica o di uno spazio dei nomi dipende dalla lingua di implementazione e dalle convenzioni di codifica locali.

Se altre classi dipendono da questo, ma solo quando si utilizza la classe, probabilmente dovrebbe essere ancora inclusa nella classe.

Se altre classi dipendono da questo per usi diversi da quelli relativi all'utilizzo della classe, allora dovrebbero essere impacchettati separatamente.

Dovresti anche considerare se questa funzione porta le sue dipendenze. Se la funzione introduce un'intera libreria aggiuntiva con le sue dipendenze, potrebbe essere meglio tenerla separata, indipendentemente da quanto sopra.

    
risposta data 22.03.2014 - 08:14
fonte
2

Il solito argomento contro ciò che chiamate class funzioni (alcune lingue usano la parola chiave static per questi) è che non sono facilmente raggirabili e quindi non sono testabili. Ma questo è un argomento per rendere le tue funzioni di classe pure, non evitando di farle affatto. Le funzioni di classe non richiedono una simulazione per gli stessi motivi per cui non richiedono un'istanza di un oggetto.

Dato che hai già stabilito che le funzioni di classe che stai scrivendo saranno pure (in virtù delle condizioni che hai inserito su di loro, come non cambiare stato e non causare effetti collaterali), considero questo come un caso d'uso perfettamente ragionevole per loro.

I metodi di classe sono particolarmente utili come metodi di fabbrica .

    
risposta data 21.03.2014 - 21:20
fonte
1

Dati questi criteri, no. Il fatto che non acceda ai campi privati dell'oggetto significa che non è una parte essenziale della tua astrazione. Mantenere tali funzioni fuori dalla classe è meglio per l'incapsulamento: si limita la quantità di codice che potrebbe essere potenzialmente influenzata da una modifica dell'implementazione. Vedi questo articolo .

Inoltre, c'è un numero illimitato di modi in cui potresti usare la tua classe. Se metti una nuova funzione lì dentro ogni volta che trovi un modo comune per usarla, la classe crescerà indefinitamente. In una lingua come C ++, dovresti ricompilare tutto ciò che includeva il file di intestazione della tua classe.

    
risposta data 21.03.2014 - 21:23
fonte
0

Per semplificare e semplificare la comprensione, provo a ridurre il numero di funzionalità che il mio codice utilizza (o potrebbe potenzialmente utilizzare). Se questa subroutine non ha bisogno di essere inviata dinamicamente (per il polimorfismo o l'ereditarietà), allora non dovrebbe essere una funzione membro e forse è meglio come un metodo statico. Se oltre a questo non è necessario accedere a nessuna variabile privata, allora puoi tranquillamente mettere quella subroutine in una classe totalmente separata.

    
risposta data 21.03.2014 - 21:49
fonte

Leggi altre domande sui tag