Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

transformar em metodo generico

Tenho esse código dentro de um botão que efetua vários cálculos, dentro disso tem vários if, daí tenho que repetir esse código várias vezes, como eu faço pra transformar isso num método genérico, e jogá-lo la na minha classe função global? Não estou conseguindo pq a variável prazo muda de calculo pra calculo e as caixas de texto e combos também mudam de nome....

                            if (CBPrazo.SelectedItem == null ||         CBPrazo.SelectedItem.ToString() == "meses")
                    {
                        prazo = (Convert.ToDouble(value: TXTPrazo.Text));

                    }
                    else if (CBPrazo.SelectedItem.ToString() == "dias")
                    {
                        prazo = (Convert.ToDouble(value: TXTPrazo.Text) / 30);

                    }
                    else if (CBPrazo.SelectedItem.ToString() == "anos")
                    {
                        prazo = (Convert.ToDouble(value: TXTPrazo.Text) * 12);

                    }
7 respostas

Oi Fernandom, tudo bom?

Pra fazer essa refatoração direitinho, eu recomendo você dar uma olhada no curso de design patterns. O padrão strategy é logo o primeiro capitulo e o exemplo é baseado em impostos, uma regra de negocio bem parecida com a sua =)

Qualquer problema é só falar.

Abraço!

vixe, ainda não entendo isso, estou com dificuldade pra esse nível de abstração... no caso eu já tenho o programa feito, todo procedural, e aí quero ir aos poucos deixando de pensar de maneira procedural e passar pra OO... Então eu ainda não sei como criar por exemplo, na minha classe FunçãoGlobal, uma função que faça esses ifs, pq teria que passar a variável(prazo) e a seleção do combo, e retornar o valor novo do prazo. eu não sei como fazer referencia ao combo na classe global, consegui fazer um de limpar generico usando Control, mas esse não estou conseguindo...

tinha pensado em fazer algo assim, mas não deu certo:

        public double TrataPrazo1(double p, ComboBox c, ComboBox c2, TextBox t)
        {
            if (c.SelectedItem == null || c.SelectedItem.ToString() == "meses")
            {
                p = (Convert.ToDouble(value: t.Text));
                c2.SelectedIndex = 1;
                return p;

            }
            else if (c.SelectedItem.ToString() == "dias")
            {
                p = (Convert.ToDouble(value: t.Text) / 30);
                c2.SelectedIndex = 1;
                return p;

            }
            else if (c.SelectedItem.ToString() == "anos")
            {
                p = (Convert.ToDouble(value: t.Text) * 12);
                c2.SelectedIndex = 1;
                return p;

            }
            return p;

        }

aí eu chamaria o trataprazo1 e passaria a variavel e os controles...pq não funciona?

O problema da implementação com ifs, é que cada vez que uma condição nova surgir, seu código aumenta. Com as aulas de design pattern você conheceria formas mais elegantes de lidar com esse problema, sem precisar repetir muito código =)

Uma boa abordagem pra entender melhor o código é dar nomes mais intuitivos pras variaveis. Assim, fica mais claro oq está sendo utilizado.

Por exemplo, aqui:

        public double TrataPrazo1(double prazo, ComboBox oqEsseComboFaz, ComboBox oqEsseOutroComboFaz, TextBox oqEsseTextBoxFaz)

Assim, ao longo do seu código você consegue entender melhor oq está acontecendo.

Por exemplo, aqui:

public double TrataPrazo1(double p, ComboBox c, ComboBox c2, TextBox t)
        {
            if (c.SelectedItem == null || c.SelectedItem.ToString() == "meses")
            {
                p = (Convert.ToDouble(value: t.Text));
                c2.SelectedIndex = 1;
                return p;

            }
            else if (c.SelectedItem.ToString() == "dias")
            {
                p = (Convert.ToDouble(value: t.Text) / 30);
                c2.SelectedIndex = 1;
                return p;

            }
            else if (c.SelectedItem.ToString() == "anos")
            {
                p = (Convert.ToDouble(value: t.Text) * 12);
                c2.SelectedIndex = 1;
                return p;

            }
            return p;

        }

estamos adicionando como selecionado no combobox2 o mesmo valor sempre.

                c2.SelectedIndex = 1;

a ideia é essa mesmo? o que c2 representa?

A semantica das variaveis é importante pra gente entender melhor o que o sistema deve/deveria fazer.

Se você quiser, também pode compartilhar com a gente aqui o código todo =)

Abraço

Ah, acabei de fazer isso, era isso mesmo, já até postei no msdn, eu estava errando na chamada, na realidade só faltava o prazo = funcaoGlobalblabla, já ia até postar o resultado aqui tbm... valeu!

A minha ideia é essa mesmo, vou fazendo um babysteps aqui pra chegar naquele nível da aula, que ainda é muito abstraído pra mim, daí me perco no meio da linha de raciocínio pq tem muita classe... ainda não fiquei muito fã de OO, mas vamos ver qdo eu refizer o programa só em OO pra ver se eu fico adepto mesmo...

solução!

eu não conseguia chegar num commit por causa dessa linha que eu estava escrevendo errado:

` prazo = funcaoGlobal.TrataPrazo1(prazo, CBPrazo, CBPrazo2, TXTPrazo);