Domanda

Con l'obiettivo di massimizzare il riutilizzo del codice, ho creato una gerarchia di classi piuttosto complesso per il mio codice Python. E 'più o meno così:

class ElectionMethod
    class IterativeMethod
        class SNTV
        ...
    class NonIterativeMethod
        class OrderDependent
            class CambridgeSTV
            ...
        class OrderIndependent
            class WIGM
                class ERS97STV
                ...
            class Recursive
                class MeekSTV
                ...

Solo le foglie della gerarchia delle classi sono mai un'istanza in oggetti. Questo fa servire al suo scopo di massimizzare il riutilizzo di codice, ma il codice stesso è complicata (alcune classi hanno 20 o giù di lì i metodi) e dato i molti livelli che può richiedere molto tempo per trovare dove è implementato qualcosa.

Ho provato tirando fuori pezzi di funzionalità e mettere tale funzionalità in un oggetto separato, ma non ho trovato un buon modo per fare questo in quanto quasi tutte le funzionalità dipende dai dati comuni. Vale a dire, posso spostare il codice per un oggetto diverso ma ha bisogno di fare riferimento alla grande gerarchia complessa per ottenere i dati di cui ha bisogno in modo che non è davvero l'incapsulamento.

Qualcuno ha qualche consiglio su come rendere questo più gestibile?

È stato utile?

Soluzione

Multi-metodo s forza, a seconda della vostra architettura, essere un'altra valida soluzione a questo tipo di problema. L'idea è di rendere i metodi funzioni di livello di modulo che possono agire su qualsiasi istanza classe che sarebbe auspicabile passare a loro. Ecco un link un altro che li esamina come un alternativa alla ereditarietà multipla . E 'l'appello di loro funzioni generiche, ma l'idea è simile. Si discute anche non-documentata del pitone costruito in attuazione del concetto.

Se si potesse spostare tutto ciò che non hanno a che fare con l'impostazione o di ottenere un particolare valori istanze di una classe di funzioni a livello di modulo e solo il codice livello di classe in questione, con l'attuazione di un'interfaccia di dichiarare-esposizione / modifica, quindi non si potrebbe nemmeno bisogno di multi-metodi.

Altri suggerimenti

Se l'unica difficoltà è trovare dove è implementato qualcosa, forse non hai bisogno di refactoring. Al contrario, cercare estensioni per il vostro editor di corrente, o passare a uno che supporta il salto-to-definizioni.

Per esempio, emacs con ropemacs installato salti per definizioni quando il cursore viene posizionato su un oggetto viene premuto nome e Ctrl-c g.

Sono sicuro che ci sono trucchi simili, se si utilizza vi / vim.

Questa è classico problema, quindi non c'è una risposta universale (altrimenti non era un problema). Ma ha diverse soluzioni di uso comune. Uno di loro - principi solidi in progettazione. Quindi devi cercare di non funzionalità attraverso i livelli di gerarchia, si possono trovare facilmente o recepirlo nel appropriato elemento singolo codice-responsabile. E se avete bisogno di accedere ad alcuni dati comuni, si dovrebbe creare oggetti responsabili per l'accesso a questi dati.

Design by Contract e soprattutto la tecnica di iniezione di dipendenza ha bisogno generalmente di qualche sostegno quadro, quindi Ricerca per fabbricante per .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top