quarta-feira, 28 de novembro de 2012

Refatorando: Encontre a Governança certa e encapsule


No dia a dia de arquiteto, percebo a imensa redundância de código, pois os programadores de modo geral possuem uma imensa  dificuldade para identificar quem é responsável pela funcionalidade. Os desenvolvedores, em geral, estão preocupados em colocar seus códigos para funcionar custe o que custar. Enxergando essa dificuldade, resolvi  a partir de um Cenário para demonstrar a aplicação correta de um código que foi feito de forma redundante, por estar fora de sua governança.  O exemplo é meramente ilustrativo e utilizei uma funcionalidade básica que sempre esta fora de governança em nossos códigos.


Cenário:

Em nosso sistema possuimos Mensagens (Alert, Dialogs) disparados utilizando o mesmo padrão, mudando apenas a mensagem e possivelmente um redirect ou não.


Solução Senso Comum:

O desenvolvedor chama uma rotina que dispara a Mensagem na tela e a coloca dentro de cada formulario web, assim tendo que replicar o mesmo código a cada novo formulario.

Exemplo de codigo:

            ScriptManager.RegisterStartupScript(page, page.GetType(), identificador, "alert('Alteração realizada com sucesso');", true);
        


Problema da implementação:

Em uma eventual alteração, por exemplo de javascript para jquery, teríamos que ir formulário à formulário implementando a alteração, além de dar a responsabilidade de alerta a cada formulário e não ao conjunto de formulários  nesse caso a implementação esta errada pois esta fora de sua governança, pois quem deveria possuir tal método seria uma classe responsável pelas funcionalidades que pode ser usadas por qualquer formulário.


Solução:

A solução para o problema é a criação de uma classe que será delegada a responsabilidade de disponibilizar  as funcionalidade que podem ser usadas de forma genérica pelos formulários. E nela colocaremos o nosso código.


    public static class FormularioFuncionalidades

    {

        public static void Alert(Page page, string mensagem, string identificador)

        {

            string strScript = "alert('" + mensagem + "')";

            ScriptManager.RegisterStartupScript(page, page.GetType(), identificador, strScript, true);

        }

    }



Em nossos formulários web chamaríamos o alert dessa maneira:

FormularioFuncionalidades.Alert(page, "Atualização efetuada com sucesso.", href, "OK2");




Vantagens: 

Respeitaremos o principio SOLID, assim em caso de alteração teremos que faze-la em apenas 1 unico lugar. Por exemplo imagine que agora queremos implementar um redirect e que a Mensagem seja disparada utilizando Jquery UI, nesse caso seria facil em nosso medoto Alert fariamos as alterações abaixo e já estaria replicado para todo formulario que estivesse chamando o Alert.

public static void Alert(Page page, string mensagem, string href, string identificador)
        {
            page.Controls.Add(PreparaMensagem(mensagem));
            ScriptManager.RegisterStartupScript(page, page.GetType(), identificador, PreparaScript(href), true);
        }

        private static string PreparaScript(string href)
        {
            string strScript = string.Format("$(document).ready(function () {"
                                    + "$('#dialog').dialog({"
                                    + "                    modal: true,"
                                    + "                    width: 400,"
                                    + "                    show: 'drop',"
                                    + "                    hide: 'drop',"
                                    + "                    resizable: false,"
                                    + "                    buttons: {"
                                    + "                    Ok: function () {"
                                    + "                        $(this).dialog('close');"
                                    + "                    }"
                                    + "                }"
                                    + "}).bind('dialogclose', "
                                    + "                function(event, ui) "
                                    + "                { {0}"
                                    + "                }"
                                    + ");;"
                                + "});", (string.IsNullOrEmpty("")) ? "" : "window.location.href = '" + href + "'; ");
            return strScript;
        }

        private static Literal PreparaMensagem(string mensagem)
        {
            return new Literal() { Text = String.Format("

{0}

", mensagem) }; }

Nenhum comentário:

Postar um comentário