Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
Ascensao

Repetição de Codigo

Recommended Posts

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:

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.