Redesign factory per generare errori sul tempo di caricamento anziché sul tempo di esecuzione

0

Sto usando un modello factory per ottenere oggetti che non dovrebbero essere istanziati a parte la classe factory. Questi oggetti sono di tipo ViolationType , che rappresentano le violazioni su un insieme di regole. Ecco il riepilogo della fabbrica e i tipi di violazione disponibili:

class ViolationFactory:
    def __init__(self):
        raise ValueError('%s cannot be instantiated' % self.__class__.__name__)

    class ViolationType:
        def __init__(self, name):
            self.name = name

    _violations = (
        ViolationType('RULE_X'),
        ViolationType('RULE_Y'),
        # the rest of the types...
    )
    _violations_dict = {v.name: v for v in _violations}

    @staticmethod
    def get(violation_name):
        if violation_name not in ViolationFactory._violations_dict:
            raise ValueError('Invalid ViolationType')
        return ViolationFactory._violations_dict[violation_name]

Un ViolationType viene principalmente utilizzato per creare un'istanza di Violation :

violation = Violation(ViolationFactory.get('RULE_X'), **kwargs)

Il problema con questo è che se faccio un errore di ortografia della stringa passata al metodo get() factory non saprò che c'è un errore finché non viene eseguito quel particolare pezzo di codice. Quindi se provo a fare ViolationFactory.get('RULE_Z') e tale tipo non esiste, dovrebbe generare un errore durante l'esecuzione del programma

Penso che il design attuale semplicemente non permetta un simile comportamento, quindi: come posso riprogettarlo in modo da ottenere un errore di caricamento piuttosto che uno di runtime?

    
posta dabadaba 22.06.2017 - 12:26
fonte

1 risposta

0

Potresti usare enumerazioni come identificatori di regole. In questo modo, sapresti se hai fatto un errore in fase di compilazione. Qualcosa in questo senso:

enum Rules
{
   Rule_X = 0,
   Rule_Y = 1,
   Rule_Z = 2
}

Quindi, la chiamata sarebbe simile a questa:

violation = Violation(ViolationFactory.get(Rules.Rule_X), **kwargs)

In alternativa, è possibile implementare ogni regola come plug-in, nel proprio assembly, e caricare gli assembly in modo dinamico. Quindi, se il plugin non è stato caricato correttamente, genera un'eccezione e saprai che c'è stato un problema al momento del caricamento. Lo svantaggio è che se hai molte regole, avrai molti assembly.

    
risposta data 23.06.2017 - 09:07
fonte