Performance para concatenar texto

Enquanto desenvolve algum programa, é possível esquecer alguns detalhes que podem impactar quando este estiver completo. Isso ocorre principalmente quando ainda não se tem um domínio grande sobre a linguagem utilizada, mas claro que deslizes ocorrem por mais experiente que seja. Esse texto se aplica mais ao primeiro caso.

Concatenar texto

Ta ai uma tarefa que dependendo com o que você trabalha, quase nunca vai utilizar. Mas no geral, todo mundo tem que fazer, é uma das coisas mais básicas que existe.

Mas durante essa rotina, em grande parte das vezes, estamos concatenar pequenos texto, algumas palavras, ou mesmo letras. O problemas começa a aparecer quando a quantidade de caracteres que precisam ser concatenados aumenta. Ou pior; quando a capacidade de processamento, de quem vai ‘rodar’ o programa, é limitada. A tarefa, então, se torna pesada. Lidar com grande quantidades de texto com pouca capacidade de processamento e / ou memória, pode destruir a experiencia do usuário.

Continue lendo

Propriedade TopMost VB .NET

Em certos momentos um formulário (janela) de um programa precisa ficar a frente de todas as outras. Em outros casos essas telas precisam ficar a frente de tudo. Quando eu digo tudo, me refiro a tudo mesmo, até as janelas do Windows se necessário. Por isso mostrarei hoje a propriedade TopMost.

A propriedade TopMost, é do tipo booleana, ou seja, aceita True ou False e é utilizada nesses casos onde o formulário desejado precisa ficar a frente de tudo. Seja para chamar a atenção do usuário ou para não deixar que ele execute qualquer outra tarefa.

Continue lendo

Herança em programação Orientada a Objeto

No post de hoje, vou mostrar como é feita a herança no Visual Basic. Mas antes, uma pequena descrição a respeito de herança em programação Orientada a Objeto.

Herança é um conceito pelo qual é possível criar uma classe (subclasse) com base em uma existente. Essa nova classe herda todos os atributos, comportamentos e implementações da classe herdada (superclasse).

Diagrama mostrando a herança entre classes.

Diagrama mostrando a herança entre classes.


Continue lendo

Implementando resolução do problema das 100 portas

Hoje mostrarei como implementar a resolução do problema das 100 portas em Visual Basic .NET. Enquanto navegava na grande rede de computadores internet, encontrei esse problema e achei que seria interessante mostrá-lo aqui.

O que é o problema das 100 portas

O problema das 100 portas cria a seguinte situação: você tem 100 portas em linha e todas as portas estão inicialmente fechadas. Você deve passar por cada porta 100 vezes. A cada vez que você passa pela porta, você deve fechá-la se estiver aberta, ou abri-la se estiver fechada. Na primeira vez você deve passar por todas as portas. Na segunda vez deve passar somente nas portas que são múltiplo de 2 (2, 4, 6, …). Na terceira vez, somente pelas portas que são múltiplos de 3 (3, 6, 9, …). Faça isso até a porta 100.

A pergunta: Ao final, quando passar por todas as portas, quais estarão abertas e quais estarão fechadas?

Resolvendo o problema

Nesse primeiro modelo que faremos para resolver o problema, levaremos o enunciado ao pé da letra e passaremos por todas as portas.

Para os exemplos, utilizarei uma Console Application do Visual Basic .NET.

Resolvendo com um For dentro de outro

    Sub Main()
        Dim portas(100) As Boolean

        For pass = 1 To 100
            For porta = pass - 1 To 99 Step pass
                portas(porta) = Not portas(porta)
            Next
        Next

        For porta = 0 To 99
            Console.WriteLine("Porta " & (porta + 1) & " está " & If(portas(porta), "Aberta", "Fechada"))
        Next
        Console.Read()
    End Sub

No código acima, temos a situação onde o código segue o que o enunciado pede.

Primeiro fazemos um laço de repetição For que passa por todas as portas e dentro do laço fazemos outro, que passa somente pelos múltiplos dessa porta; isso é possível porque cada interação do segundo For, “pula” os número das portas com o auxilio da variável pass, que é o número da porta do primeiro laço.

Dentro do segundo laço, falamos que cada porta deve ficar no status contrário ao que está, executando o código = Not portas(door).
No final fazemos um laço exibindo o status da porta ao fim das iterações. Aqui temos um trecho interessante, o condicional If está montado em linha (If(portas(porta), "Aberta", "Fechada")). Essa é uma ótima maneira de mostrarmos um valor mesmo que haja uma condição para a exibição. Essa forma segue a seguinte estrutura:

If (condição booleana, valor verdadeiro, valor falso)

Resolvendo o problema de outra forma

Quadrado PerfeitoNo próximo exemplo, o código é um pouco menor, porque só será necessário um laço de repetição. Dessa vez é utilizada a matemática para resolver o problema.

Segundo discursarão sobre a resolução do problema (ver fonte ao final do texto), somente as portas com números que são quadrados perfeitos ficam abertas.

Quadrado perfeito em matemática, é um número inteiro não negativo que pode ser expresso como o quadrado de um outro número inteiro.

Fonte: Wikipédia

Dito isso, vamos ao código:

    Sub Main()
        Dim portas(100) As Boolean

        For i = 1 To 10
            portas(i ^ 2 - 1) = True
        Next
        For porta = 0 To 99
            Console.WriteLine("Porta " & (porta + 1) & " está " & If(portas(porta), "Aberta", "Fechada"))
        Next

        Console.ReadLine()
    End Sub

Para conseguirmos somente os quadrados perfeitos, utilizamos a expressão i ^ 2, onde i é o número da iteração e o símbolo ^ (circunflexo) indica que o número (i) está sendo elevado a potencia (2). Seria o equivalente a i2.

Fazemos isso dentro do laço que vai de 1 a 10, porque a porta máxima é a 100 e 102. = 100. Para sabermos qual porta do array portas será aberta, devemos passar o índice do array, por isso a expressão i ^ 2 – 1. Como dito antes, sabemos o quadrado perfeito com o i ^2, o -1 da expressão é para ‘acertar’ o cálculo para o array que é baseado em zero (inicia em zero). Dessa forma quando i = 2, o resultado do quadrado seria 4, mas na verdade a porta 4 está na posição 3 do array.

Por hoje é só galera, espero que tenha gostado e entendido.

Fonte sobre problema das 100 portas.

Criando propriedades para classes no VB .NET

No post de hoje trago algo que abordei ligeiramente na vídeo aula Como carregar um ComboBox de maneira bem fácil, que são as propriedades de uma classe. Como bom objeto, as classe que você cria tem propriedades, como uma propriedade qualquer de um objeto qualquer. Cito aqui, por exemplo, a propriedade .Text do objeto TextBox.

Conceito dass Propriedade

É algo muito simples, porém, essencial para abordar um dos aspectos da Orientação a Objetos, que é o encapsulamento. Criando um classe e definindo suas propriedades, esses dados podem ser tratados dentro dessa classe mantendo a integridade que fora definida para cara propriedade.

Algo que deixa bastante claro essa questão do encapsulamento, são as propriedades de posicionamento de um formulário de uma aplicação em VB.NET ou C#. Você pode, por exemplo, resgatar a coordenada x de um formulário utilizando o comando:

MessageBox.Show(Formulario.Location.X)

Entretanto, ao tentar entrar com um valor para tal propriedade, receberá um mensagem de erro informando que isso não é possível. Para tanto, é necessário criar um nova localização, informando tanto x quanto y. O que é feito quanto isso acontece, fica por conta da regra utilizada para o deslocamento de um formulário, ou seja, o encapsulamento garante, tanto que os dados passados sejam tratadas da maneira correto, quanto protege a integridade da propriedade.

Criando propriedades para classes

Vamos agora ver exatamente como criar as propriedades. Abaixo está o código para a criação de duas propriedades para a classe que chamei de Dados. Em seguida explico o código.

Public Class Dados
    Private _Nome As String
    Private _ID As Integer

    Public Property Nome() As String
        Get
            Return _Nome
        End Get
        Set(ByVal value As String)
            _Nome = value
            _ID = New Random().Next(1, 10000)
        End Set
    End Property

    Public ReadOnly Property Identificador() As Integer
        Get
            Return _ID
        End Get
    End Property
End Class

Acima temos dois tipos bem diferentes de propriedades. A primeira, Nome, tanto pode ser utilizada para atribuir um valor via instancia, quanto pode  ter seu valor lido. Já a segunda, só pode ter o seu valor lido. A segui, explico linha a linha o que está acontecendo.

Linha 1: declaração da classe Dados;

Linhas 2 e 3: são declaradas duas variáveis que serão utilizadas para armazenar os valores atribuídos às propriedades;

Linha 5: declaro a primeira propriedade, Nome, ela é pública e do tipo String;

Linhas 6, 7 e 8: utilizo o comando Get para informar o que deve ser feito quanto o tentarem ler o que está na propriedade. Neste caso, somente retorno o que fora atribuído. Poderia por exemplo, aplicar a função Trim,  Replace ou mesmo ToUpper, como a propriedade pertence a classe pode ser feito qualquer coisa, inclusive retornar sempre uma String vazia;

Linhas 9, 10, 11 e 12: utilizo o comando Set, para criar os procedimentos que devem ser realizados quando for atribuído um valor à propriedade. Neste caso, simplesmente passo o valor que for atribuído, para a variável que criei anteriormente. Na declaração, é criado um parâmetro, que deve ser do mesmo tipo da propriedade. Mas, uma coisa interessante que adicionei, é que quando for atribuído um nome, a propriedade ID recebe um valor aleatório (entre 1 e 10000);

Linha 13: finalizo a declaração da propriedade Nome;

Linha 15: declaro a propriedade ID, publica do tipo Integer. Porém, diferente da anterior, adicionei a instrução ReadOnly, informando que não pode ser atribuído valor a esta variável por meio de uma instância da classe.

Linhas 16, 17 e 18: utilizo o comando Get para informar o que deve ser feito quanto o tentarem ler o que está na propriedade.

Linha 19: finalizo a declaração da propriedade ID;

Linha 20: finalizo o código da classe;

No momento que a classe for instanciada, ocorreria o seguinte:Classe criada quando instanciadaVeja que conseguimos atribuir um valor à propriedade Nome, porém, quando tentamos com o Identificador, é informado que esta propriedade é somente leitura.

E como resultado disso tudo, corrigindo o erro, temos:

Resultado do código

E dessa forma, você pode trabalhar suas classes, criando regras de negócios para seu sistema e mantendo a integridades dos dados.

Até um próxima!