COMO APRIMORAR A FUNÇCAO VALIDA_TELEFONES

 Tópico anterior Próximo tópico Novo tópico

COMO APRIMORAR A FUNÇCAO VALIDA_TELEFONES

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#492031 - 29/12/2019 17:28:58

PROGRAMADORVB6
LISBOA
Cadast. em:Janeiro/2004


Última edição em 29/12/2019 17:34:52 por PROGRAMADORVB6

Olá boa noite,
Fiz uma pequena função para validar números de celular (91x, 92x, 93x, 96x) e fixos (2x) está um pouco rudimentar, mas gostaria de a aprimorar melhor; fiz assim :

Imports System.Text.RegularExpressions
Public Class Form1
    '/* validar numeros moveis (91x, 92x, 93x, 96x) e fixos (2x) */
    '/^(9[1236]\d{7}|2\d{8})$/
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.TextBox1.Text = Trim(Me.TextBox1.Text)
        If Valida_Telefones(Me.TextBox1.Text) = False Then

            MessageBox.Show("O campo não foi preenchido correctamente", "Campo incorrecto", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End If
        If Valida_Telefones(Me.TextBox1.Text) = True Then
            MessageBox.Show("O campo foi preenchido correctamente!", "Campo correcto", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Exit Sub
        End If
    End Sub

    Public Shared Function Valida_Telefones(ByVal NumerosTelefone As String) As Boolean
        If NumerosTelefone.ToString = "" Then Return False
        If Not String.IsNullOrEmpty(NumerosTelefone.ToString) Then
            Dim Verifica As Match = System.Text.RegularExpressions.Regex.Match(NumerosTelefone.ToString, "^(9[1236]\d{7}|2\d{8})$") '21 474 3179
            If Not Verifica.Success Then
                Return False
            End If
            If Verifica.Success Then
                Return True
            End If
        End If

        Valida_Telefones = NumerosTelefone
    End Function
End Class


Grato desde já pela vossa atenção.
ProgramadorVB6


______________________________________________________________________________

Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé.


#492032 - 29/12/2019 18:05:51

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Torná-la um método de extensão?
Criar um componente que herde de TextBox específico para telefone?


_______________________________________________________________________
Virei Oráculo!
The end is nigh, be ready for the nukes!


#492034 - 29/12/2019 19:56:57

PROGRAMADORVB6
LISBOA
Cadast. em:Janeiro/2004


Última edição em 29/12/2019 20:05:30 por PROGRAMADORVB6

O que eu pergunto é se a função está bem escrita! Falta-lhe alguma coisa a acrescentar ?


______________________________________________________________________________

Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé.


#492035 - 29/12/2019 21:15:03

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Razoável, eu usaria um bloco try...catch dentro dela só pra garantir. Mas com certeza não seria assim a implementação. Usaria uma das opções que mencionei, assim, não precisa colocar o mesmo código por toda a parte.

_______________________________________________________________________
Virei Oráculo!
The end is nigh, be ready for the nukes!


#492037 - 29/12/2019 22:26:23

OCELOT
SOROCABA
Cadast. em:Março/2012


Última edição em 29/12/2019 22:29:39 por OCELOT

Além de poder colocar em outra classe para reutilizar mais fácil, usando ou não como método de extensão, da pra melhorar um pouco seu código, tentei explicar alguns pontos do seu código nos comentários e também o como eu faria esta função
Public Shared Function Valida_Telefones(ByVal NumerosTelefone As String) As Boolean
    'aqui você está verificando se é uma string vazia, mas usa o método ToString sendo que já é uma string
    If NumerosTelefone.ToString = "" Then Return False
    'e logo em segui verifica se é um string vazia ou nula, se ela for nula já teria ocorrido um erro na linha anterior
    If Not String.IsNullOrEmpty(NumerosTelefone.ToString) Then
        'se for utilizar várias vezes a função poderia criar o Regex antes
        Dim Verifica As Match = System.Text.RegularExpressions.Regex.Match(NumerosTelefone.ToString, "^(9[1236]\d{7}|2\d{8})$") '21 474 3179
        'não é necessário fazer dois ifs, apenas um seria o suficiente, ou melhor ainda, só um return direto
        If Not Verifica.Success Then
            Return False
        End If
        If Verifica.Success Then
            Return True
        End If
    End If

    'você provavelmente colocou esta linha pelo compilador reclamando de que é método não retornava um valor, porém isto está incorreto, você está atribuindo uma string para um boolean
    Valida_Telefones = NumerosTelefone
End Function


Como eu faria
Public Module MinhasFuncoes

    'cria uma instancia da regex para poder ser reutilizada, usar o método estático (shared) cria um novo objeto cada vez que ele é chamado
    Private RegexTelefone As New Regex("^(9[1236]\d{7}|2\d{8})$", RegexOptions.Compiled) 'não é realmente necessário o a opção Compiled, mas sem testes de performance não tem como saber quando vale ou não a pena usar

    Public Function ValidaTelefones(ByVal NumerosTelefone As String) As Boolean
        'se veio nulo, uma string vazia ou só espaços então o retorno é sempre falso
        If (String.IsNullOrWhiteSpace(NumerosTelefone)) Then
            Return False
        End If
        'todo o resto pode ser simplificado para isso
        Return RegexTelefone.Match(NumerosTelefone).Success
    End Function

End Module


Só uma observação que quero deixar é que não testei a lógica em si faz o que ela deveria, apenas reescrevi o seu código de outra forma, os dois devem ter praticamente o mesmo resultado, acho que a única diferença é que o seu daria erro se recebesse um valor nulo




#492038 - 30/12/2019 08:57:19

PROGRAMADORVB6
LISBOA
Cadast. em:Janeiro/2004


Última edição em 30/12/2019 09:16:06 por PROGRAMADORVB6

Olá pessoal desde já quero agradecer a todos vocês pela paciência, em segundo a função do colega  OCELOT , ficou xou de bola só lhe acrescentei este código :
Me.TextBox1.Text = Regex.Replace(Me.TextBox1.Text, "\s", "")

e em terceiro queria desejar a todos vocês  :
- Felicidades para uma vida melhor e um futuro brilhante!
Tenham um próspero Ano Novo e um Feliz 2020!

São os votos deste vosso amigo
ProgramadorVb6

Pst! : se quiserem acrescentar algo ao código, como uma função ( generalizada ) é só escrever desde já agradeço novamente a vossa colaboração e paciência.


______________________________________________________________________________

Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé.


 Tópico anterior Próximo tópico Novo tópico


Para responder este tópico o login é requerido
Se você já possui uma conta de usuário por favor faça seu login
Se você não possui uma conta de usuário use a opção Criar usuário