[Code Kata] String Calculator

Helloword para todos!!

No primeiro post do reboot  deste blog, começaremos falando sobre code katas e como essas práticas podem torná-lo um programador melhor.

O que são Code Katas ?

A palavra Kata é  de origem japonesa, usada para descrever movimentos realizados por praticantes de artes marciais no objetivo de aprimorar suas habilidades físicas e mentais em combates reais. Para que isso possível, todo kata consiste em treinos de repetição até que o praticante assimile todos os movimentos de maneira natural.

Partindo do conceito de Katascode kata nada mais é do que exercícios para programadores aprimorarem suas habilidades em programação. Hoje iremos praticar o code kata string calculator.

String Calculator

Este exercício consiste em criar uma função que realiza a operação de adição baseada em um input de uma string. Sugiro que seja utilizado uma ferramenta de testes automatizados, como o NUnit e técnica de programação TDD (Test-Driven Design). Abaixo está o exercício, um vídeo com passo a passo e código final escrito em C#.

String Calculator Kata

1. Cria o seguinte método: int Add(string numbers).

  1. O método pode receber 0, 1 ou 2 números e retornar a soma (Caso a string seja vazia, retorne 0).
  2. Inicie o teste com uma string vazia e depois com uma string contendo 1 e 2 números.
  3. Lembre-se de passar os testes da forma mais simples possível, sem pensar numa forma de resolver todos os problemas de uma vez.
  4. Lembre-se de fazer refactor depois de passar todos os testes.

2. O método Add suporte uma quantidade não especificada de métodos.
3. O parâmetro string pode possuir o caractere especial de quebra linha (“\n”)

  1. O input a seguir está correto: 1\n2,3 (resultado é 6).
  2. O input a seguir não está correto: 1,\n (você não precisa validar isso, é apenas para especificar).

4. Suporta diferentes delimitadores.

  1. Para alterar um delimitador, a string deve começar deve possuir o seguinte padrão: //[delimiter]\n[numbers…]“. Por exemplo, //;\n1;2″ deve retornar 3, pois o novo delimitador é ‘;’.

Classe final:

public class Calculator
{
    public static int Add(string exp){

        if (string.IsNullOrEmpty(exp))
            return 0;

        char delimitador = ',';

        if (exp.StartsWith("//")) {
            delimitador = char.Parse(exp.Substring(2, 1));
            exp = exp.Substring(3);
        }

        if (exp.Contains(delimitador)){
            return exp.Replace("\n", "").Split(delimitador).Select(num => int.Parse(num)).Sum();
        }

        return int.Parse(exp);
    }
}

Classe de testes:

[TestFixture]
class CalculatorTest
{
    [Test]
    public void Quando_a_string_for_vazia_retorna_zero(){
        string exp = string.Empty;
        int resultado = Calculator.Add(exp);

        Assert.AreEqual(0, resultado);
    }

    [TestCase("1",1)]
    [TestCase("10", 10)]
    [TestCase("100", 100)]
    public void Quando_a_string_possuir_1_numero_retorna_numero(string numero,int esperado) {
        string exp = numero;
        int resultado = Calculator.Add(exp);

        Assert.AreEqual(esperado, resultado);
    }

    [Test]
    public void Quando_a_string_possuir_2_numeros_retorna_soma() {
        string exp = "1,2";
        int resultado = Calculator.Add(exp);

        Assert.AreEqual(3, resultado);
    }

    [Test]
    public void Quando_a_string_possuir_n_numeros_retorna_soma(){
        string exp = "1,2,3";
        int resultado = Calculator.Add(exp);

        Assert.AreEqual(6, resultado);
    }

    [Test]
    public void Quando_string_possuir_quebra_linha_ignorar_retornar_soma() {
        string exp = "1\n2,3";
        int resultado = Calculator.Add(exp);

        Assert.AreEqual(15, resultado);
    }

    [Test]
    public void Permitir_a_troca_do_delimitador_e_retornar_soma(){
        string exp = "//;\n1;2;3";
        int resultado = Calculator.Add(exp);

        Assert.AreEqual(6, resultado);
    }
}

Por hoje é só pessoal.

Obrigado.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: