terça-feira, 7 de junho de 2022

C#: Valores Nulos e Operadores Relacionados (??, ??=, ?. e ?[])

Depois de alguns anos, voltando a trabalhar com C# e com isso, algumas novidades. Se tem uma coisa que senti saudade no C# que o Java não tinha são o operador de coalescência nula e o operador de condicional nulos (também conhecido como Operador Elvis, porque parece um emoticon do Elvis Presley), muito útil para evitar o tal famoso NullPointerException. Mas vamos por partes:

terça-feira, 6 de julho de 2021

Javascript: Verificar se uma string é vazia | Valores considerados falsos

Estava eu precisando verificar num código Javascript se o valor de uma variável é uma string vazia, gerada de um split. O problema é que Javascript não tem um método isEmpty(), que foi a primeira coisa que me veio a cabeça. Entretanto, existe duas maneiras para verificar se a string está vazia. 

A primeira é verificando se o tamanho dela é 0. Para isso, podemos acessar a propriedade length de uma string, e verificar se o valor é 0, como no exemplo abaixo:

01. var variavel = "";
02. if(variavel.length!=0){
03.   alert("Processa a variavel string");
04. }

Entretanto, ela funciona bem quando temos certeza que estamos analisando uma variável do tipo String, e sabemos bem que Javascript é uma linguagem de tipagem fraca, então pode ser que o que normalmente seria string, viesse um valor nulo. Então como verificamos neste caso? 

No caso do Javascript, temos alguns valores que são considerados falsos em uma verificação booleana. são eles:
  • false (Boolean e o mais óbvio)
  • 0, -0, 0.0 e 0x0 (Number, todos os formatos de zero);
  • 0n e 0x0n (BigInt, este tipo de dado foi introduzido em 2020. Igual ao Number, mas como ambos os tipos não devem se misturar em operações, então vamos manter eles separados);
  • "", '' e `` (Strings vazias);
  • null (valor nulo);
  • undefined (valor indefinido);
  • NaN (Not a Number);
Voltando ao nosso problema original, podemos verificar se a nossa string é vazia e tratar a possibilidade de valor nulo da seguinte forma:

01. var variavel = "";
02. if(variavel){
03.   alert("Processa a variavel");
04. }

Então é isso por hoje.

segunda-feira, 21 de junho de 2021

Java: Verificando a classe de um objeto (instanceof)

 Existem alguns casos em que é necessário verificar a classe de um objeto instanciado. Existe duas maneiras de verificar isso. A primeira é utilizando o operador instanceof, utilizado quando a classe é conhecida em tempo de compilação. A sintaxe é a seguinte:

[Objeto] instanceof [NomeDaClasse] 

Exemplo de Código:

Animal animal = new Cachorro();
if(animal instanceof Cachorro){
  //Entra aqui se a instância de animal for da classe Cachorro
}


Entretanto, pode haver casos em que você deverá fazer uma verificação de classe em tempo de execução. Você pode obter uma referência do tipo da classe através de um objeto Class. Tendo o objeto Class da classe que deseja, você pode utilizar o método isInstance para fazer a verificação.

Exemplo: 

Animal animal = new Cachorro();
Class classInfo = Cachorro.class;
if(classInfo.isInstance(animal)){
  //Entra aqui se a instância de animal for da classe Cachorro
}

Então é isso por hoje.

quinta-feira, 28 de janeiro de 2021

Javascript: Problemas com Requisição de URL

 Alguns problemas comuns quando você faz uma requisição de uma URL são alguns caracteres especiais, nos quais geralmente dá dor de cabeça. Entretanto, existe caracteres mais especiais no meu caso. Precisava fazer uma requisição e passar por get uma string que continha um caractere "+". O problema é que por padrão URI, um sinal de "+" é usado para representar um espaço e quando chegava no back-end da aplicação, o sinal simplesmente sumia.

Aí que entra uma questão. Para tratar uma URI, no Javascript temos o comando encodeURI(), entretanto, ele não codifica os caracteres que são usadas por padrão (por exemplo, os caracteres : e / do "http://"), e o nosso "+" está incluso nisso. 

Para isso, a função correta para ser usada é "encodeURIComponent()", onde você usará na string que vai ser enviado por get.  Exemplo de uso:

encodeURIComponent("1+3=4")

o retorno da função será:

1%2B3%3D4


terça-feira, 26 de janeiro de 2021

SQL Server: Concatenação

Durante um trabalho, precisei utilizar a concatenação no SQL Server. Normalmente utilizo a função CONCAT, mas para a minha não tão surpresa, a versão do cliente era mais antigo. Então, hoje vou registrar aqui as formas de concatenação possível no SQL Server.

terça-feira, 29 de dezembro de 2020

Java: Switch e Strings

 Diferente de muitas linguagens, a linguagem JAVA permite desde a versão 1.7 utilizar Strings como controle de fluxo. O exemplo abaixo mostra como podemos utilizar:

String str = "Olá! Está aí?";
switch(str){
    case "Tchau":
        System.out.println("Tchau");
        break;
    case "Olá! Está aí?":
        System.out.println("Sim, estou");
        break;
    default:
        System.out.println("Não entendi");
}

O código acima seria o equivalente ao código abaixo realizado com if-else em cascata, mas é mais elegante utilizar da maneira acima, além de que o bytecode gerado é mais eficiente:

String str = "Olá! Está aí?";
if (str.equals("Tchau")){
    System.out.println("Tchau");

}else if (str.equals("Olá! Está aí?")){
      System.out.println("Sim, estou");

}else{
        System.out.println("Não entendi");
}


Android+Gradle: Depreciação da configuração de dependência

Não sei exatamente quando, mas retomando um projeto, eu me deparei diversos avisos como esse:

"Configuration 'androidTestCompile' is obsolete and has been replaced with 'androidTestImplementation' and 'androidTestApi'.
It will be removed at the end of 2018. For more information see: http://d.android.com/r/tools/update-dependency-configurations.html"

Então foi que eu fiz, visitei o link, mas como temos alguns artigos que fiz, então vamos ver o que precisei mudar e o que recomendo.

Bem, vamos começar com a mensagem acima: o comando "androidTestCompile" vai ser substituído pelo "androidTestImplementation" e "androidTestApi". Entretanto, é curioso porque uma outra mensagem é a seguinte:

"Configuration 'androidTestApi' is obsolete and has been replaced with 'androidTestImplementation'.
It will be removed at the end of 2018. For more information see: http://d.android.com/r/tools/update-dependency-configurations.html"
Bem, agora só sobrou nós utilizarmos "androidTestImplementation".

A próxima mensagem é a seguinte:
"Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.
It will be removed at the end of 2018. For more information see: http://d.android.com/r/tools/update-dependency-configurations.html"
Essa mensagem aparece quando usamos uma biblioteca externa, mas qual é a diferença? Quando você usa "implementation", você está garantindo o encapsulamento da biblioteca, enquanto que a "api" permite visualizar e manipular arquivos internos. Dica de ouro? Troque para "implementation" em aplicativos em geral e aprenda a respeitar o encapsulamento, pois se está privado, é porque você não deve mexer com tais objetos. Se você está mexendo com bibliotecas para ser distribuído, use "api".

Ah! Existe uma terceira possibilidade para substituir o "compile" que é "annotationProcessor", use-o quando você quer utilizar uma biblioteca de anotações.