Progettazione del programma: come migliorarlo e come evitare l'accoppiamento (Python)?

1

Nella struttura del programma Python di seguito ci sono due moduli con funzioni.

Descrizione del problema:

  1. Le funzioni sono utilizzate all'interno di altre funzioni dappertutto. strong accoppiamento (dipendenza). Ad esempio, func1 () nel modulo 2 che legge dal file viene chiamato molte volte perché viene chiamato in quasi tutte le altre funzioni in entrambi i moduli. Si tratta di risorse e prestazioni elevate, ma è solo una cattiva pratica.
  2. Leggere il file così tante volte (ogni volta che viene chiamato funct1 () può essere costoso.

Domanda: qual è un buon modo per migliorare questo design?

Ad esempio, passare le funzioni dal modulo helper 2 alle funzioni nel modulo 1 AS PARAMETERS? [Se lo faccio, ho ancora delle funzioni nel modulo 2 dipendenti l'una dall'altra (es .: funct4 () usa funcr1 (), funct2 (), funct3 (), ecc)]

Il mio paradigma con cui ho iniziato: stavo pensando: "Ah, avrò un modulo principale dove succederà la cosa principale, quindi avrò un modulo laterale per le funzioni che svolgono un lavoro di preparazione e pulizia e li ha chiamati dal modulo 1. " (Bene, ora ho questo pasticcio.) Mi chiedo se un buon design sia quello di rendere le funzioni meno dipendenti l'una dall'altra? Ogni funzione fa una cosa e NON chiama altre funzioni ?? Dovrei usare le lezioni? Come? Riguarda quando usare le classi contro i moduli? Funzionale rispetto al design OO?

Come ridisegnare questo in modo il più piccolo possibile e il file viene letto una sola volta (o il minor numero possibile di volte)?

Grazie per eventuali suggerimenti.

modulo 1

(main module, program execution happens here)

from module2 import *

f1()
- uses funct1() 4 times
- uses funct2() 2 times

f2()
- uses func1() 2 times
- uses func2() 2 times

f3()
- uses func1() 1 time

f4()
- uses func2() 3 times
- uses func3() 3 times
- uses func4() 1 time

f5()
- uses func1() 2 times
- uses func2() 2 times
- uses func4() 4 times

f6()
- uses func1() 3 times
- uses func2() 3 times
- uses func4() 2 times

modulo 2

(ha funzioni di aiuto che forniscono ripulitura e altre funzionalità al modulo 1)

func1()
reads from file (with open('x.txt', 'r') af f: ...

func2()
- uses func1 1 time

func3()
- uses func1 1 time

func4()
- uses func1() 1 time
- uses func2() 2 times - uses func3() 1 time
    
posta user1552294 23.03.2015 - 23:19
fonte

1 risposta

0

Ci sono almeno due domande che vengono poste qui (probabilmente molto di più, quindi dovrò ignorare molti dei più piccoli), ma la soluzione per entrambi si riduce a scrivere una classe che incapsula in modo efficace il recupero (i tuoi) dati dai (tuoi) file . Dato che hai chiesto espressamente se dovrebbe essere una classe o qualcos'altro, in questa classe linguistica ci sono le principali astrazioni di dati che sono in grado di ricordare le cose , che è ovviamente necessario se vuoi evitare di leggere lo stesso file e oltre, ecco perché dovrebbe essere una classe.

Dato che non mi hai detto cosa fanno effettivamente alcune funzioni nel modulo 2 dopo aver chiamato func1, ho intenzione di fare alcuni requisiti abbastanza generici. Supponiamo che func1 legga un file con valori separati da virgola. Supponi func2 ottiene la somma di tutti i numeri. Supponiamo che func3 ottenga la distribuzione media e standard di ogni riga.

Quello che vuoi fare è scrivere una classe che gestisca la lettura e l'analisi di questi file e esponga metodi per recuperare determinati aspetti dei dati che trova. Ad esempio, è possibile che il costruttore della classe prenda un singolo argomento filename / filepath, in modo che il file venga letto esattamente una volta durante la costruzione e tutte le chiamate di metodo sull'oggetto si limitino a manipolare la rappresentazione in memoria dei dati già letti . La cosa importante è che nessun altro modulo dovrebbe sapere (esattamente) come questa classe ottiene i suoi dati . Dovrebbero vedere i metodi getNums () e getStdDev () e getTotal (), ma probabilmente non dovrebbero sapere se questi valori provengono da un file .csv o da un foglio di calcolo Excel o da un sito Web o da qualsiasi luogo, e certamente non dovrebbero sapere se file / sito in fase di memorizzazione o meno.

Se lo fai bene, sarà banale aggiungere getEigenvectors () e whatnot a module2 ogni volta che ti sentirai senza nemmeno pensare a cosa sta facendo il modulo1 . Questo è sempre l'obiettivo principale della riduzione dell'accoppiamento. Questo vale praticamente per tutte le lingue che supportano l'OOP.

Se hai bisogno di un aiuto più specifico dovrai spiegare meglio cosa effettivamente fanno queste funzioni e perché il consiglio generico che ho appena dato è insufficiente.

    
risposta data 23.03.2015 - 23:46
fonte

Leggi altre domande sui tag