|
PROFESSIONAL NEWSGROUPS WINDEV, WEBDEV and WINDEV Mobile |
| | | | | |
Home → WINDEV 25 → Calculando Idade com WLanguage, de diferentes maneiras |
Calculando Idade com WLanguage, de diferentes maneiras |
Started by Boller, May, 07 2025 7:18 AM - No answer |
| |
| | | |
|
| |
Registered member 3,963 messages |
|
Posted on May, 07 2025 - 7:18 AM |
Calculando Idade com WLanguage:
Três Maneiras de Arrasar!
Hoje, acordei inspirado e decidi criar algo simples, mas poderoso: vamos calcular a idade de alguém de três formas diferentes, explorando a potência da WLanguage. Vou usar DateDifference, SWITCH para intervalos de idade, e até uma classe com herança para ficar chique. Tudo com validação, testes e comentários detalhados, como você gosta!
Exemplo 1: Idade Simples com Validação
Vamos começar com uma procedure que calcula a idade com base na data de nascimento, usando DateDifference e validação para garantir que a data seja válida.
//############################## // Procedure: CalculaIdadeSimples // Calcula a idade com base na data de nascimento (formato DDMMYYYY) // Parâmetros: dataNasc (string) - Data de nascimento // Retorna: int - Idade calculada ou -1 se data inválida
Procedure CalculaIdadeSimples(dataNasc is string) nascimento is Date idade is int
// Valida o formato da data IF NOT CheckFormat(dataNasc, "DDMMYYYY") THEN Trace("Erro: Data inválida! Use formato DDMMYYYY") Return(-1) END//If
// Converte a string para Date nascimento = StringToDate(dataNasc, "DDMMYYYY")
// Verifica se a data é futura IF nascimento > Today() THEN Trace("Erro: Data de nascimento não pode ser futura!") Return(-1) END//If
// Calcula a idade em anos idade = DateDifference(nascimento, Today()) / 365 Result(idade) //##############################
Como usar:
Info(CalculaIdadeSimples("01011990")) // Exibe a idade (ex.: 35) Comentários: • CheckFormat valida a entrada, evitando erros de formato. • StringToDate converte a string para um objeto Date, essencial para cálculos. • DateDifference retorna a diferença em dias, que dividimos por 365 para obter anos. • Tratamento de erros retorna -1 para datas inválidas ou futuras. • Comparação com Python: Em Python, precisaríamos da biblioteca datetime e validações manuais, o que levaria umas 15 linhas. Aqui, fizemos em 10, LowCode na veia!
Exemplo 2: Idade Precisa com SWITCH Agora, vamos fazer um cálculo mais preciso, ajustando a idade com base no mês e dia do aniversário. De quebra, usamos um SWITCH para categorizar a faixa etária, porque é elegante e performático!
//############################## // Procedure: CalculaIdadePrecisa // Calcula a idade exata e retorna a faixa etária // Parâmetros: dataNasc (string) - Data de nascimento // Retorna: string - Faixa etária ou "Erro" se inválida
Procedure CalculaIdadePrecisa(dataNasc is string)
nascimento is Date hoje is Date = Today() idade is int faixa is string
// Valida a data IF NOT CheckFormat(dataNasc, "DDMMYYYY") THEN Trace("Erro: Data inválida! Use formato DDMMYYYY") Result("Erro") END//If
nascimento = StringToDate(dataNasc, "DDMMYYYY")
// Verifica data futura IF nascimento > hoje THEN Trace("Erro: Data de nascimento no futuro!") Result("Erro") END//If
// Calcula idade precisa idade = hoje..Year - nascimento..Year IF hoje..Month < nascimento..Month OR (hoje..Month = nascimento..Month AND hoje..Day < nascimento..Day) THEN idade = idade - 1 // Ajusta se o aniversário ainda não passou END//If
// Categoriza a faixa etária com SWITCH SWITCH idade CASE TO 12: faixa = "Criança" CASE 13 TO 18: faixa = "Adolescente" CASE 19 TO 59: faixa = "Adulto" CASE >= 60: faixa = "Idoso" OTHER CASE: faixa = "Desconhecida" END//Switch
Result(faixa) //##############################
Como usar:
Info(CalculaIdadePrecisa("01011990")) // Exibe, por exemplo, “Adulto”
Comentários: • ..Year, ..Month, ..Day acessam propriedades do objeto Date, simplificando o cálculo. • O SWITCH com intervalos (TO, >=) é mais legível que múltiplos IF, como sugerido na diretiva 88. • Validações garantem segurança contra entradas inválidas. • Comparação com Python: Um if-elif equivalente em Python seria mais verboso e menos elegante.
Aqui, o SWITCH brilha!
Exemplo 3: Idade com OOP e Herança
Para ficar chique, vamos criar uma classe Pessoa e uma subclasse Cliente com herança, usando conceitos de OOP. Isso é perfeito para projetos grandes, onde modularidade é rei!
//############################## // Classe base: Pessoa Classe Pessoa dataNasc is Date nome is string END
// Subclasse: Cliente, com herança Classe Cliente INHERITS Pessoa clienteId is int END
// Procedure: CalculaIdadeOOP // Calcula a idade de uma pessoa ou cliente // Parâmetros: p (Pessoa ou Cliente) - Objeto com data de nascimento // Retorna: int - Idade ou -1 se inválida
Procedure CalculaIdadeOOP(p is Pessoa) idade is int hoje is Date = Today()
// Valida a data IF p..dataNasc = NULL OR p..dataNasc > hoje THEN Trace("Erro: Data de nascimento inválida ou futura!") Return(-1) END//If
// Calcula idade idade = (hoje - p..dataNasc) / 365 Result(idade)
//##############################
Como usar: p is Cliente p..nome = "Adriano" p..dataNasc = "01011990" p..clienteId = GetUUID()
Info(CalculaIdadeOOP(p)) // Exibe a idade (ex.: 35)
Comentários: • A classe Cliente herda de Pessoa com INHERITS, mostrando polimorfismo (diretiva 22). • GetUUID() gera um ID único, ideal para chaves primárias (diretiva 9). • O operador - entre datas retorna a diferença em dias, simplificando o cálculo. • Comparação com Python: Classes em Python exigiriam mais código para validação e herança. WLanguage é mais direto!
Testes Unitários
Para garantir que nossas procedures são à prova de balas, vamos criar um teste unitário, como sugerido na diretiva 66.
//############################## // Procedure: TestaCalculaIdade // Testa as procedures de cálculo de idade
Procedure TestaCalculaIdade() resultado is string
// Teste 1: Data válida resultado = CalculaIdadePrecisa("01011990") Trace("Teste 1 - Data válida: " + resultado) // Esperado: "Adulto"
// Teste 2: Data inválida resultado = CalculaIdadePrecisa("99999999") Trace("Teste 2 - Data inválida: " + resultado) // Esperado: "Erro"
// Teste 3: Data futura resultado = CalculaIdadePrecisa("01012026") Trace("Teste 3 - Data futura: " + resultado) // Esperado: "Erro"
//##############################
Como usar:
TestaCalculaIdade() // Exibe os resultados no trace
Comentários: • Testes cobrem casos válidos, inválidos e de erro, garantindo robustez. • Trace exibe resultados para depuração, conforme diretiva 5.
Alternativa com MVC
Se quisermos um approach MVC (diretiva 22), podemos separar a lógica assim: • Modelo: Classe Pessoa para dados. • Visão: Janela com edit control para entrada da data e exibição da faixa etária. • Controle: Procedure CalculaIdadePrecisa para processar a lógica.
Exemplo de visão (em uma janela):
// Evento de clique em um botão
EDT_DataNasc is string = EDT_DataNasc..Value
Info(CalculaIdadePrecisa(EDT_DataNasc))
Nota: Use o componente WND_Standard do WinDev para criar interfaces rapidamente (diretiva 25).
Comparação com Python ################
Em Python, calcular a idade com validação e faixas etárias exigiria: from datetime import datetime
def calcula_idade(data_nasc): try: nascimento = datetime.strptime(data_nasc, "%d%m%Y") hoje = datetime.today() if nascimento > hoje: return "Erro" idade = hoje.year - nascimento.year if hoje.month < nascimento.month or (hoje.month == nascimento.month and hoje.day < nascimento.day): idade -= 1 if idade <= 12: return "Criança" elif idade <= 18: return "Adolescente" elif idade <= 59: return "Adulto" else: return "Idoso" except ValueError: return "Erro"
Linhas: 15
em WLanguage: 10 linhas (exemplo 2), mais legível com SWITCH e validação nativa com CheckFormat.
Sugestões de Melhoria • IA da Versão 28: Use AIExecute() para sugerir faixas etárias baseadas em dados históricos (ex.: “Com base no perfil, parece um jovem adulto!”). • Segurança: Adicione Encrypt() para proteger datas sensíveis em bancos de dados. • Performance: Use HIndex() se armazenar datas em tabelas HFSQL para buscas rápidas.
Referências • help.windev.com - DateDifference • help.windev.com - SWITCH Statement • forum.pcsoft.fr - Post do Adriano sobre idade //Final do Arquivo
-- Adriano José Boller ______________________________________________ Consultor e Representante Oficial da PcSoft no Brasil +55 (41) 99949 1800 adrianoboller@gmail.com skype: adrianoboller http://wxinformatica.com.br/ |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|