Classe con una sola esecuzione

2

Sto implementando un lungo algoritmo (circa 500 linee di C ++). L'algoritmo consiste attualmente di circa 10 metodi diversi. Ogni metodo devo consegnare più strutture di dati come parametri, che si chiamano a vicenda. Un solo metodo può (dovrebbe) essere utilizzato dal consumatore finale.

Mi stavo chiedendo se una classe sarebbe stata migliore. In questo modo posso tenere tutte le strutture dati in un posto (come variabili di istanza) e posso accedervi da ciascun metodo senza passare tutti questi come parametri.

Un utilizzo tipico potrebbe essere:

MyAlg myalg_instance(input_param1, input_param2, pointer to computation_results);
myalg_instance.do();

E in seguito l'istanza è inutile e può essere cancellata. E 'bello questo? Ci sono modelli migliori?

    
posta Jakube 03.09.2015 - 09:08
fonte

2 risposte

5

Quindi stiamo osservando un grande metodo statico grasso suddiviso in pezzi di dimensioni minuscole. Consiglio vivamente di metterlo in una classe, anche se è per un unico scopo. Il tuo processo ha uno stato e quello stato può essere mantenuto attraverso i membri della classe, quindi sì assolutamente.

Basta fare attenzione a distinguere tra parametri operativi e parametri di processo. I parametri di processo sono ciò che si passa all'algoritmo e ciò che è richiesto in quasi tutti i metodi. I parametri operativi sono i risultati delle chiamate precedenti ai metodi necessari per l'operazione successiva, ma solo per l'operazione successiva.

Un buon esempio di parametro di processo sarebbe un elenco di elementi da ordinare. Se si dovesse creare un algoritmo di ordinamento ricorsivo, l'intero elenco sarebbe il parametro di processo in modo tale da non dover passare continuamente lo stesso array in modo ricorsivo. Gli indici iniziale e finale sarebbero un buon esempio di parametri operativi che non hanno bisogno di essere membri della classe. Utilizzare i membri della classe per conservare le informazioni è un modo eccellente per ridurre i parametri del metodo, ma farlo solo se è utile in tutto.

Se non ti piace avviare l'algoritmo in questo modo, come formalità potresti creare un metodo statico pubblico che:

ProcessClass process = new ProcessClass(<parameters>);
process.start();

In modo che il chiamante debba chiamare solo Process.start(<parameters>) in modo da avere ancora un modo pulito di chiamarlo esternamente e internamente il tuo codice è più pulito rispetto a un metodo gigantesco.

Spero che ti aiuti!

    
risposta data 03.09.2015 - 09:35
fonte
3

Considera il concetto di chiusura (vedi ad esempio questa domanda e le sue risposte) . Una chiusura ti evita di aggirare gli argomenti extra conosciuti in un determinato contesto. Ad esempio, invece di scrivere:

def addTax(taxPercentage, amounts):
    def computeTax(perc, amount):
        return perc * amount / 100.0

    return [a + computeTax(taxPercentage, a) for a in amounts]

puoi scrivere

def addTax(taxPercentage, amounts):
    def computeTax(amount):
        return taxPercentage * amount / 100.0

    return [a + computeTax(a) for a in amounts]

La chiusura computeTax() ottiene implicitamente la variabile taxPercentage dal suo contesto (il contesto in cui è definita) in modo che non sia necessario passare più volte la stessa variabile.

Ora hai diverse funzioni che devono manipolare alcuni dati comuni. In effetti, un oggetto può essere considerato come una raccolta di chiusure che si chiude su alcune variabili comuni (le variabili membro dell'oggetto). In questo modo, queste funzioni non devono passare esplicitamente i loro dati comuni tra loro.

Quindi, sì, IMO è decisamente appropriato creare un oggetto contenente i dati da utilizzare durante il calcolo e implementare tutte le funzioni come metodi (chiusure) che accedono a tali dati comuni.

    
risposta data 03.09.2015 - 09:35
fonte

Leggi altre domande sui tag