Linha de Código

Blogs e Fóruns - Portal Linha de Código - Espaço criado em 26/06/2006.
Welcome to Linha de Código Sign in | Join | Help
in Search

Rodrigo Moreira

Discutindo C#: Funções do Question Mark

Tipos anuláveis


Tipos comuns por valor não possuem valor nulo. Por exemplo, um inteiro sem valor, armazena o valor "0", uma string, recebe o valor vazio (representado pela constante String.Empty). Porém, em situações específicas, é possível extrair vantagens no uso do valor nulo em tais tipos (Por exemplo, em inserção de dados em campos nullable no banco de dados).
A partir do C# 2.0, foi introduzido o conceito de tipos anuláveis, ou seja, tornar possível que tais tipos convivam com o valor "nulo", sendo este o primeiro uso do operador "?" que veremos por aqui.

int? variavel = null;

if (variavel == null)

   // seu codigo

Operador Ternário

Esse também é bem popular. Ele não oferece uma funcionalidade diferenciada, mas sim uma economia de código, uma estrutura diferente em termos de sintaxe. A idéia é simples: As vezes é necessário realizar decisões simples, que são resolvidas através de "if". Porém a utilização do operador ternário, pode economizar algumas linhas de código.

int a = 1;

int b;

b = (a == 1) ? a : 10;

Seu equivalente utilizando a estrutura “if” seria:

if (a == 1)

{

      b = a;

}

else

{

b = 10
}


Portanto a sintaxe do operador ternário é:
Variável = (condição) ? valor caso true : valor caso false

Coalesce Operator

Sim, o nome está em inglês porque nunca vi o termo em português, então não inventar por aqui :P Acredito que dos três operadores com “Question Mark” (“?”), esse é o menos “famoso”, porém de uso também simples. A idéia é diminuir a quantidade de código para verificações com o objetivo de descobrir se o valor é nulo ou não. Ele também pode ser fácilmente substituído pelo uso de “Ifs”.

int? a = null;

int b;
b = a ?? 10;

Seu equivalente seria:

if (a == null)

    b = 10;

else
    b = (int) a;  

Repare que, apesar da mesma funcionalidade, utilizando a estrutura de “IF”, já surge a preocupação da conversão dos tipos (no caso de um inteiro anulável e um inteiro).

Discussão

Um esforço antigo da engenharia de software é tornar o código cada vez mais “legível” a humanos, ou seja, torná-lo simples, de fácil entendimento. Exatamente por isso, existe uma resistência ao uso dos operadores descritos acima, justamente porque eles viriam a tornar mais “obscuro” o código do que se utilizassem estruturas simples de decisão. A minha opinião particular é que, partindo do pressuposto que programadores devem conhecer a sintaxe da linguagem utilizada, não acredito que o uso de tais operadores seja prejudicial, na verdade, devido à redução do número de linhas de código dentro do método que usa os tais operadores, acredito que se perca menos tempo tentando entender lógicas obtusas de comparações, se dando o luxo de prestar mais atenção as regras de negócio. E vocês? A discussão está em aberto :-)

Published sexta-feira, 13 de junho de 2008 10:19 by JackFlash
Filed Under:

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

 

EduardoBottcher said:

Eu acho que esses operadores são positivos em termos de produtividade. Concordo que as linguagens de hoje tendem a se tornar English Query, ou seja, do jeito que voce fala é como voce escreve o código, mas mesmo assim essa lingaguem super alto nivel deverá ter alguns símbolos. Ai fica a pergunta, quantos simbolos a linguagem deve ter para ser considerada "alto nivel" e ser bem legivel? Acredito que ninguem tem essa resposta. Além disso uma linguagem de programacao tem um ciclo de vida um tanto diferente de uma linguagem normal, por exemplo, a quantos anos nao surge um novo acento na lingua portuguesa?  E quantas palavras reservadas novas suurgiram no C# 3.0.?
junho 16, 2008 12:24
 

JackFlash said:

Por isso que devemos pensar: até que nível os símbolos podem ser considerados "dialetos comum" entre desenvolvedores, fazendo com que seu uso não aumente a complexidade do código?
Sobre C# 3.0, não sei quantas palavras novas apareceram mas já é possível ver que a questão dos símbolos se torna mais comum. No C# 3.0, aproximando-se do paradigma de programação funcional, já temos as expressões lambda, que podem ser ao mesmo tempo uma mão na roda para quem já está familiarizado com o conceito de ponteiros/delegates/métodos anônimos e um novo pesadelo para quem não está...
junho 16, 2008 16:27
 

apoena said:

Desde que conheci operadores desse tipo, estudando pra certificação, acabei que incorporando meio sem perceber a utilização deles.

Eu tenho a vantagem de ser o único programador que meche na camada de dados da empresa, o que me favorece, pois não encontro resistência de outros, na hora de desenvolver nesta camada.

O que mais uso hoje são os tipos anuláveis, que para mim, caiu como uma luva, para a técnica de lazy load (essa eu aprendi com o Jack) que rola aqui na empresa. Hoje, não consigo mais viver sem ele.

Quanto à ilegibilidade do código, acho que nada como um BOM comentário para descrever. Um bom programador sabe reconhecer, de quando um código precisa de um comentário, não mata ninguém.



Como aqui é VB.Net (sei que o post é de C#, mas sempre tem um pobre coitado como eu que é obrigado a trabalhar em VB.Net), cassei uns códigos aqui referentes ao post:



Dim b As Nullable(Of Boolean)



If b is nothing then

b = ((1 + 1) = 2)

End if



Dim s1 as String

S1 = iif(b.value,”Verdadeiro”,”Falso”) .ToString()

If CBool(b) then s1 = “True” else s1 = “False”



Mas uma observação, o iff é apenas uma implementação safada do operador ternário acima citado (retorna um object), pois quando compilado, gera a estrutura completa do if then else (como demonstrado depois). Apenas facilita a vida do programador. Alguém me contou que esse iif vem DESDE primórdios de VB 5, mas como eu nunca abri e nem quero abrir esse visual studio, fica aí a lenda.

Popó...
junho 16, 2008 18:51
 

KeitaroSan said:

Bom, fiquei feliz de ver no final do post a seguinte frase: "... partindo do pressuposto que programadores devem conhecer a sintaxe da linguagem utilizada ...", eu sou totalmente a favor de operadores que diminuam as linhas de códigos, gosto bastante do operador ternário e do coalesce também. Eu acho que o código deve ser legível sim, mas dentro dos padrões da linguagem e não do padrão humano...

Bom, é isso aí!
fevereiro 18, 2009 12:15
 

kraol1 said:

good game! i liked it too
abril 13, 2010 16:49

What do you think?

(required) 
(optional)
(required) 

This Blog

Post Calendar

<junho de 2008>
doseteququse
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

Syndication

Powered by Community Server, by Telligent Systems