Tabelas de Decisão em Python

Aluno: Eduardo Ribeiro Silva de Oliveira

Orientador: Prof. Dr. Valdemar W. Setzer

Proposta de Trabalho

Este trabalho de conclusão de curso propõe o desenvolviemento de um pré-processador para tabelas de decisão (TDs) em Python, em que a abordagem e método de tradução de TDs se baseia na dissertação de Satoshi Nagayama [Nagayama, 1990]. A dissertação apresenta diversos modelos de tradução de TDs, como o switch method, que foi utilizado no pré-processador deste trabalho. Além disso, ressalta-se a relevância da documentação, utilizando uma técnica de auto-documentação do Prof. Dr. Valdemar W. Setzer [Setzer, 1988].

Além disso, o trabalho ressalta a relevância da auto-documentação, utilizando a técnica proposta pelo Prof. Dr. Valdemar W. Setzer [1988]. Essa prática facilita a manutenção do código e promove a colaboração entre desenvolvedores.

Introdução

A programação, em sua essência, envolve a criação de algoritmos que fazem escolhas com base em condições lógicas. Tradicionalmente, essas escolhas lógicas são implementadas por meio de árvores de decisão com aninhamentos de `if...then...else`, que podem se tornar complexas e difíceis de manter. Nesse contexto, as TDs emergem como uma alternativa poderosa, oferecendo uma forma compacta, gráfica e organizada de especificar escolhas lógicas [\cite{setzer_comunicacao_pessoal}].

Exemplo de TD

Abaixo está um exemplo de tabela de decisão:

Hierarquia Gestor Gestor Gestor Gestor Analista Analista Analista Analista
Setor Comercial Comercial Administrativo Administrativo Comercial Comercial Administrativo Administrativo
Metas atingidas Y N Y N Y N Y N
Inscrição em cursos de desenvolvimento 1 1 1 1 1 1 1 1
Bonificação de 5% do salário - - - - 2 2 - -
Bonificação de 10% do salário 2 2 - - - - 2 2
Bonificação de 15% do salário - - 2 2 - - - -
3 dias de folga 3 - 3 - 3 - 3 -

Exemplo de Código em Python

hierarquia = ''
setor = ''
meta_atingida = ''

def inscreve_em_cursos():
    print(f'Funcionário inscrito em cursos de desenvolvimento')

def define_bonificacao(valor:int):
    print(f'Funcionário recebe bonificacção de {valor}% do salário')

def atribui_3dias_de_folga():
    print(f'Funcionário recebe 3 dias de folga')

if __name__ == '__main__':
    hierarquia = input('').upper()
    setor = input('').upper()
    meta_atingida = (input('').upper() == 'Y')
    #TD decision table td_estrutura_de_incentivos
    #TD sets
    #TD        hierarquia_gestor                     {"GESTOR"}
    #TD        hierarquia_analista                   {"ANALISTA"}
    #TD        setor_comercial                       {"COMERCIAL"}
    #TD        setor_administrativo                  {"ADMINISTRATIVO"}
    #TD conditions
    #TD        hierarquia               hierarquia_gestor   hierarquia_gestor   hierarquia_gestor       hierarquia_gestor       hierarquia_analista     hierarquia_analista     hierarquia_analista     hierarquia_analista
    #TD        setor                    setor_comercial     setor_comercial     setor_administrativo    setor_administrativo    setor_comercial         setor_comercial         setor_administrativo    setor_administrativo
    #TD        meta_atingida            Y                   N                   Y                       N                       Y                       N                       Y                       N
    #TD actions
    #TD        inscreve_em_cursos()     1                   1                   1                       1                       1                       1                       1                       1                    
    #TD        define_bonificacao(5)    0                   0                   0                       0                       2                       2                       0                       0      
    #TD        define_bonificacao(10)   2                   2                   0                       0                       0                       0                       2                       2           
    #TD        define_bonificacao(15)   0                   0                   2                       2                       0                       0                       0                       0
    #TD        atribui_3dias_de_folga() 3                   0                   3                       0                       3                       0                       3                       0
    #TD end table
    

Código gerado pelo pré-processador

    hierarquia = ''
    setor = ''
    meta_atingida = ''
    
    def inscreve_em_cursos():
        print(f'Funcionário inscrito em cursos de desenvolvimento')
    
    def define_bonificacao(valor:int):
        print(f'Funcionário recebe bonificacção de {valor}% do salário')
    
    def atribui_3dias_de_folga():
        print(f'Funcionário recebe 3 dias de folga')
    
    if __name__ == '__main__':
        hierarquia = input('').upper()
        setor = input('').upper()
        meta_atingida = (input('').upper() == 'Y')
        #2[
        #2 #TD decision table td_estrutura_de_incentivos
        #2 #TD sets
        #2 #TD        hierarquia_gestor                     {"GESTOR"}
        #2 #TD        hierarquia_analista                   {"ANALISTA"}
        #2 #TD        setor_comercial                       {"COMERCIAL"}
        #2 #TD        setor_administrativo                  {"ADMINISTRATIVO"}
        #2 #TD conditions
        #2 #TD        hierarquia               hierarquia_gestor   hierarquia_gestor   hierarquia_gestor       hierarquia_gestor       hierarquia_analista     hierarquia_analista     hierarquia_analista     hierarquia_analista
        #2 #TD        setor                    setor_comercial     setor_comercial     setor_administrativo    setor_administrativo    setor_comercial         setor_comercial         setor_administrativo    setor_administrativo
        #2 #TD        meta_atingida            Y                   N                   Y                       N                       Y                       N                       Y                       N
        #2 #TD actions
        #2 #TD        inscreve_em_cursos()     1                   1                   1                       1                       1                       1                       1                       1                    
        #2 #TD        define_bonificacao(5)    0                   0                   0                       0                       2                       2                       0                       0      
        #2 #TD        define_bonificacao(10)   2                   2                   0                       0                       0                       0                       2                       2           
        #2 #TD        define_bonificacao(15)   0                   0                   2                       2                       0                       0                       0                       0
        #2 #TD        atribui_3dias_de_folga() 3                   0                   3                       0                       3                       0                       3                       0
        #2 #TD end table
        #2]
        def decision_table_td_estrutura_de_incentivos() ->None:
            I_0 = 0 #Inicialização do auxiliar da condição hierarquia
            I_1 = 0 #Inicialização do auxiliar da condição setor
            I_2 = 0 #Inicialização do auxiliar da condição meta_atingida
            I   = 0 #Inicialização do número da regra
            if hierarquia in set(["GESTOR"]):
                I_0 = 0
            elif hierarquia in set(["ANALISTA"]):
                I_0 = 1
            if setor in set(["COMERCIAL"]):
                I_1 = 0
            elif setor in set(["ADMINISTRATIVO"]):
                I_1 = 1
            if meta_atingida == True:
                I_2 = 0
            elif meta_atingida == False:
                I_2 = 1
            I = (2*2*1)*I_0 + (2*1)*I_1 + (1)*I_2
            match I:
                case 0:
                    inscreve_em_cursos()
                    define_bonificacao(10)
                    atribui_3dias_de_folga()
                case 1:
                    inscreve_em_cursos()
                    define_bonificacao(10)
                case 2:
                    inscreve_em_cursos()
                    define_bonificacao(15)
                    atribui_3dias_de_folga()
                case 3:
                    inscreve_em_cursos()
                    define_bonificacao(15)
                case 4:
                    inscreve_em_cursos()
                    define_bonificacao(5)
                    atribui_3dias_de_folga()
                case 5:
                    inscreve_em_cursos()
                    define_bonificacao(5)
                case 6:
                    inscreve_em_cursos()
                    define_bonificacao(10)
                    atribui_3dias_de_folga()
                case 7:
                    inscreve_em_cursos()
                    define_bonificacao(10)
                case _:
                    exit()
        decision_table_td_estrutura_de_incentivos()    

Resultados

O pré-processador desenvolvido foi capaz de traduzir TDs em código Python executável, utilizando o método de tradução switch method, foi projetado usando o Strategy Pattern[Freeman et al., 2004], possibilitando a fácil extensão de novos métodos de tradução; A modularidade do sistema permitiu uma fácil manutenção e evolução do projeto; E a integração de práticas de auto-documentação foi outro marco importante do trabalho por acarretar em uma documentação clara, atualizada e concisa.

Bibliografia

Links relevantes

github

monografia

poster