Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Ascensao

Repetição de Codigo

Mensagens Recomendadas

Ascensao

Boas

Quero melhorar um código diminuindo a repetição de linhas ou seja tenho cerca de 5 classes com cerca de 83 linhas cada e na qual todas as 5 classes são semelhantes apenas se diferenciam numa linha.

exemplo:

private void updateStats(char color)
{
            FileStream stream = new FileStream(path, FileMode.OpenOrCreate);
            StreamReader reader = new StreamReader(stream);
            string line = null;
            int countTotal=0;
do
            {
                line = reader.ReadLine();
                if (line != null)
                {
                    countTotal++;
                    if (checkColor(Convert.ToInt32(line)) == color)
                    {
                        ......
                    }
                    else
                    {
                        ...
                    }
                }
}

private void updateStats2(char number)
{
            FileStream stream = new FileStream(path, FileMode.OpenOrCreate);
            StreamReader reader = new StreamReader(stream);
            string line = null;
            int countTotal=0;
do
            {
                line = reader.ReadLine();
                if (line != null)
                {
                    countTotal++;
                    if (checkNumber(Convert.ToInt32(line)) == number)
                    {
                        ......
                    }
                    else
                    {
                        ...
                    }
                }
}

private void updateStats3(char odd)
{
            FileStream stream = new FileStream(path, FileMode.OpenOrCreate);
            StreamReader reader = new StreamReader(stream);
            string line = null;
            int countTotal=0;
do
            {
                line = reader.ReadLine();
                if (line != null)
                {
                    countTotal++;
                    if (checkOdd(Convert.ToInt32(line)) == odd)
                    {
                        ......
                    }
                    else
                    {
                        ...
                    }
                }
}

private void updateStats4(char great)
{
            FileStream stream = new FileStream(path, FileMode.OpenOrCreate);
            StreamReader reader = new StreamReader(stream);
            string line = null;
            int countTotal=0;
do
            {
                line = reader.ReadLine();
                if (line != null)
                {
                    countTotal++;
                    if (checkGreat(Convert.ToInt32(line)) == great)
                    {
                        ......
                    }
                    else
                    {
                        ...
                    }
                }
}

private void updateStats5(char colun)
{
            FileStream stream = new FileStream(path, FileMode.OpenOrCreate);
            StreamReader reader = new StreamReader(stream);
            string line = null;
            int countTotal=0;
do
            {
                line = reader.ReadLine();
                if (line != null)
                {
                    countTotal++;
                    if (checkColun(Convert.ToInt32(line)) == colun)
                    {
                        ......
                    }
                    else
                    {
                        ...
                    }
                }
}

Como podem reparar em cada classe somente muda o nome da variável que entra e a condição if.

Existe alguma forma de usar apenas um classe e poder "molda-la"?


Agradeço conselhos e opiniões:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Betovsky

Diria que o uso de delegates (neste caso mais especifico Func<string,bool>), seria a melhor forma. Extender uma classe base seria overkill.


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bruno1234

Diria que o uso de delegates (neste caso mais especifico Func<string,bool>), seria a melhor forma. Extender uma classe base seria overkill.

Para o código que o Ascensao mostrou, o Func como indicaste também me parece a melhor solução.

No entanto, não conheço o resto do contexto do código, se calhar vendo com mais detalhe a solução da classe base até se poderia adequar, mas isso só quem está a definir a aplicação é que pode decidir.


Matraquilhos para Android.

Gratuito na Play Store.

https://play.google.com/store/apps/details?id=pt.bca.matraquilhos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Ascensao

Tive a  pesquisar sobre delegates, pois ainda não tinha ouvido falar sobre delegates. Ainda não percebi como e que elas me podem ajudar no meu caso.

Tive a pensar numa maneira mas penso ser bastante primitiva, seria usar um switch na zona onde tenho o if e depois quando chamasse o método seria só escolher o caso que queria usar.


Agradeço conselhos e opiniões:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Betovsky

Ficarias com algo como:

private void UpdateStats(Func<string, bool> predicate) {
  //...

  if(line != null) {
    countTotal++;
    if(predicate(line)) {
      // ...
    } else {
       //...
     }
  }
}

Depois para o primeiro caso, podias fazer tipo:

//...
char color = '?';
UpdateStats(line => checkColor(Convert.ToInt32(line)) == color);


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Ascensao

Ja agora, se eu tiver numa situação de repetição de classe e na qual so se diferencie um nome de uma label do tipo:

private void UpdateStats(Func<string, bool> predicate) {
  //...
if(x>10)
predicate(label).BackColor = Color.Green;

posso fazer desta maneira?


Agradeço conselhos e opiniões:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Betovsky

posso fazer desta maneira?

Nops.

predicate é do tipo Func<string,bool>, ou seja, uma função que recebe como entrada uma string e devolve como resultado um booleano.

O que tu queres fazer, pode ser facilmente conseguido, passando a Label como parâmetro do método UpdateStats


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.