Desafio da Semana #3
DESAFIO DA SEMANA #3
Por: Roberto Alexis Farah
Oi pessoal!
Dessa vez o desafio ilustra uma situação que pode ocorrer quando projetos são migrados de VB.NET para C# ou vice-versa.
CENÁRIO
Um cliente por uma razão qualquer decidiu parar o desenvolvimento de uma aplicação em C# e usar VB.NET. Entretanto, após converter a aplicação de C# para VB.NET ele notou que, embora simples, o comportamento da aplicação era diferente nas duas linguagens de programação.
Ele checou o código fonte e concluiu que a lógica era a mesma, portanto, ele pede seu auxílio para identificar o PROBLEMA e propor uma SOLUÇÃO.
Para você poder reproduzir o problema ele criou uma aplicação muito simples que reproduz o mesmo sintoma encontrado na aplicação.
SINTOMAS
Aplicação C# retorna 100 e -60 como resultado. Esse é o resultado esperado.
Aplicação VB.NET retorna 150 e -5 como resultado. Esse resultado é incorreto.
PROBLEMA
Identifique e explique porque há essa diferença de comportamento.
SOLUÇÃO
Proponha uma solução simples que resolva o problema.
INSTRUÇÕES
Crie uma aplicação C# console com o seguinte código:
using System;
using System.Collections.Generic;
using System.Text;
namespace CSharp
{
class Program
{
static int sum = 50;
static int subtraction = 100;
static void Main(string[] args)
{
if((DoSubtraction() > 0) || (DoSum() > 0))
{
Console.WriteLine("Valor da soma das variaveis = {0:d}\n", sum + subtraction);
}
sum = -5;
if((DoSubtraction() < 0) && (DoSum() < 0))
{
Console.WriteLine("Valor da soma das variaveis = {0:d}\n", sum + subtraction);
}
else
{
Console.WriteLine("Valor da subtracao das variaveis = {0:d}\n", sum - subtraction);
}
} // Main
static int DoSubtraction()
{
return subtraction -= sum;
}
static int DoSum()
{
return sum += subtraction;
}
} // namespace.
}
E crie uma aplicação VB.NET console com o seguinte código:
Module Module1
Dim sum As Integer = 50
Dim subtraction As Integer = 100
Sub Main()
If (DoSubtraction() > 0) Or (DoSum() > 0) Then
Console.WriteLine("Valor da soma das variaveis = {0:d}", sum + subtraction)
End If
sum = -5
If (DoSubtraction() < 0) And (DoSum() < 0) Then
Console.WriteLine("Valor da soma das variaveis = {0:d}", sum + subtraction)
Else
Console.WriteLine("Valor da subtracao das variaveis = {0:d}", sum - subtraction)
End If
End Sub
Function DoSubtraction() As Integer
subtraction -= sum
DoSubtraction = subtraction
Exit Function
End Function
Function DoSum() As Integer
sum += subtraction
DoSum = sum
Exit Function
End Function
End Module
Agora é possível reproduzir os sintomas e depurar.
Boa sorte!
Comments
- Anonymous
May 11, 2006
The comment has been removed - Anonymous
May 12, 2006
Olá Danilo!
Obrigado pela sua participação constante nos desafios!
Novamente você mandou muito bem! :)
Sua explicação sobre o problema está correta e a solução proposta também. Entretanto, há um modo de resolver o problema com uma solução que não envolve mudar a lógica do if explicitamente, e sim, usando comandos do próprio Visual Basic .NET, tornando a solução mais simples e menos trabalhosa.
Estou publicando a resposta agora. - Anonymous
May 23, 2006
Nossa Roberto! Que legal! Realmente não sabia da existência desses outros operadores que forçavam a mudança do fluxo de execução.
Muito obrigado, acho que essa informação é útil para todos nós.
Parabéns pelo blog!