Aggiunta di verifiche dinamiche di business / processi aziendali a un sistema

2

Mi chiedo se esiste un buon pattern esistente (il linguaggio è Python / Django ma è anche interessato al livello più astratto) per creare un livello di business logic che può essere creato senza codifica.

Ad esempio, supponiamo che l'affitto di una casa debba essere disponibile solo in un momento specifico. Un coder potrebbe creare la seguente classe:

from bizlogic import rules, LogicRule
from orders.models import Order

class BeachHouseAvailable(LogicRule):

    def check(self, reservation):
        house = reservation.house_reserved
        if not (house.earliest_available < reservation.starts < house.latest_available )
            raise RuleViolationWhen("Beach house is available only between %s and %s" % (house.earliest_available, house.latest_available))
        return True

rules.add(Order, BeachHouseAvailable, name="BeachHouse Available")

Questo va bene, ma non voglio dover codificare qualcosa di simile ogni volta che è necessaria una nuova regola.

Mi piacerebbe creare qualcosa di dinamico, idealmente qualcosa che possa essere memorizzato in un database.

Il fatto è che dovrebbe essere abbastanza flessibile da comprendere un'ampia varietà di regole:

  • evitare duplicati / sovrapposizioni (per continuare l'esempio "Hai già una prenotazione per questo orario / luogo")
  • regole logiche ("Non puoi affittare una casa a te stesso", "Questa casa è in un posto diverso dalla destinazione scelta")
  • test di integrità ("Hai fissato un prezzo di affitto di 10 volte la tariffa normale. Sei sicuro che sia il prezzo giusto?"

Cose del genere.

Prima di ricreare la ruota, mi chiedo se ci sono già dei metodi per fare qualcosa del genere.

    
posta Jordan Reiter 10.04.2012 - 22:07
fonte

2 risposte

3

This is fine, but I don't want to have to code something like this each time a new rule is needed.

I'd like to create something dynamic, ideally something that can be stored in a database.

Bene, a giudicare dalle tue esigenze, dovrai codificare qualcosa. Una nuova regola logica significa una nuova implementazione. Come si può risolvere saggiamente questo senza codice logico? Se hai abbastanza campi in un database per ogni possibilità che molto probabilmente porterebbe a complessità ingestibile.

Penso che quello che vuoi sia una facile implementazione: nuove regole, probabilmente personalizzate, senza la necessità di ridistribuire l'intero sistema.

The thing is, it would have to be flexible enough to encompass a wide variety of rules [...]

Come ho detto sopra: sarà dannatamente difficile risolvere tali problemi esclusivamente dalle configurazioni se il caso d'uso è leggermente complesso.

Penso che quello che vuoi sia estensibilità, oltre a una facile implementazione. Quindi sarebbe probabilmente meglio creare un DSL adatto alle tue esigenze o incorporare un linguaggio di scripting (che probabilmente non ti serve se usi Python). Quindi è facile creare e distribuire nuove regole. Quindi devi solo configurare le regole da utilizzare. La principale sfida qui è progettare l'interfaccia con il "sistema madre".

In molte lingue (comprese molte lingue compilate), questo problema può essere risolto con l'iniezione delle dipendenze e un pattern microkernel. Raccogli tutte le regole da tutte le librerie di regole distribuite. Ciò elimina la necessità del supporto del linguaggio di scripting, se i casi aziendali lo consentono (il tecnico del campo tecnico? Scrive nuove regole mentre si trova nel sito dei clienti?).

Certo, puoi seguire questa strada, sequenziare sequenze di regole aziendali in flussi di lavoro e così via, ma ciò porta solo a una forma speciale di DSL. Alcuni la chiamano modellazione dei processi aziendali e devo ancora vedere un sistema che impiega con successo questo tipo di tecnologia.

P.S.

Consigli: per favore non mettere i tuoi file di regole in un blob in un database.

    
risposta data 10.04.2012 - 22:28
fonte
0

I don't want to have to code something like this each time a new rule is needed.

Cosa vorresti invece fare? Le uniche opzioni sono usare un linguaggio completo di Turing, che avrà approssimativamente la stessa complessità di Python, o usare un linguaggio più semplice ma meno potente. La seconda opzione è stata tentata molte volte, ma invariabilmente qualcuno vuole scrivere una regola che non può essere espressa nel linguaggio delle regole. Hai già a disposizione un linguaggio abbastanza espressivo che ti consente di pubblicare nuove regole con il minimo sforzo. Sarà difficile fare molto meglio.

    
risposta data 10.04.2012 - 22:30
fonte

Leggi altre domande sui tag