C# – Para Iniciantes – Parte 2 – For – Foreach – While

Olá Pessoal, Como fazer Laço de repetição em C# dos tipos For – Foreach – While?

Se você não sabe ou tinha dúvida, vamos aprender hoje!
Os laços de repetição estão presentes desde as primeiras linguagens e até hoje são extremamente utilizados, basicamente o laço repete um bloco de instruções até que uma condição seja satisfeita.
Vamos lá:

A simulação de código foi feito em um projeto Windows Application.

Laço FOR

    for (int i = 0; i <= 10; i++)
    {
        MessageBox.Show("6 x " + i.ToString() + " = " + (i * 6).ToString());
    }

Leitura:
Para i (inteiro) igual a 0 até i menor igual a 10 acrescente i+1

Simples né?
Podemos fazer um For inverso, onde ele começa de um maior e regride:

    for (int i = 11 - 1; i >= 0; i--)
    {
        MessageBox.Show("6 x " + i.ToString() + " = " + (i * 6).ToString());
    }

Esse tipo de For é útil quando temos um Array de valores onde sabemos o tamanho total dele.

Laço FOR EACH

    foreach (Control item in this.Controls)
    {
        MessageBox.Show(item.Name);
    }

Funciona um pouco diferente, é muito utilizado para varrer tipos de objetos que estão contidos em uma coleção (array de objetos).

Por ex, neste código foi criado um item do tipo Control (controle de formulário tipo button, label). Esse item a cada laço do ForEach recebe um elemento da coleção de todos os controles do formulário.

Laço WHILE

int div = 1000;

while (div != 3)
{
     div = div / 2;
     MessageBox.Show("valor de número é: " + div.ToString());
}

Leitura:
Enquanto (condição esperada não ocorre) faça:
Em determinado momento a variável div sendo dividida por 2 vai ser igual a 3 e satisfará a condição do While, enquanto isso não ocorrer o laço continuará em Loop.
PS – Cuidado com o laço While, cometer um erro que resulta em loop infinito é fácil, nesse caso basta alterar para while (div != 2) e teremos um loop infinito 😉

Laço DO WHILE

    int num = 10;

    do
    {
        num += 5;
        MessageBox.Show("valor de número é: " + num.ToString());
    }
    while (num > 100);

É a mesma ideia do primeiro While, o que muda é que no primeiro a condição é testada no começo do laço e no Do While, é testada no final do laço. Isso é importante dependendo do que precisar fazer.

Essas são as estruturas de laço de repetição que temos no C#, procure memorizar e entender para qual cenário cada um é mais adequado.

Logo mais abordarei Expressões Lambda, que em determinados momentos podem substituir o uso de um ForEach.

Utilizem os comentários para tirar dúvidas.
Até a próxima.

C# – Para Iniciantes – Parte 1 – Variáveis, Passagem por Valor ou Referência.

Olá Pessoal, Vou fazer uma série sobre (C Sharp) C# para iniciantes.

Atendendo à diversos pedidos vou procurar abordar de uma forma diferente a transferência de conhecimentos nessa linguagem, apostila e tutorial tem de monte na internet, a intenção não é essa, vamos abordar necessidades reais de quem quer dar os primeiros passos em C# e agora quer aprender mais.

Só para começar, um pouquinho de história:
O C# é uma linguagem derivada do C++, mas também tem base em Java e Object Pascal.
Criada em meados de 1999 por Anders Hejlsberg (pai do Turbo Pascal e Delphi) vem desde 2001 ganhando espaço e se tornou uma das linguagens mais populares da atualidade.

Vamos dar o primeiro passo:

Variáveis

Toda variável é uma alocação de uma quantidade de memória, é nesse espaço de memória que está armazenado o conteúdo da variável, internamente uma variável possui um ponteiro, o ponteiro para o sistema operacional é um endereçamento físico de memória, serve para localizar onde está armazenado tal dado.

A declaração de variável em C#:

Tipo NomeDaVariavel;

int MeuInteiro; 

Deve-se sempre inicializar uma variável:

int MeuInteiro = 0; 

Stack e Heap

O gerenciamento da memória no C# é feito em duas áreas de memória, o Stack e o Heap.

O Stack é uma área bem pequena de memória (alguns KB) e funciona no formato de pilha.

Pilha é uma estrutura de dados em que a inserção e a remoção de elementos de uma sequência se faz pela mesma extremidade, geralmente designada por topo da pilha”

Ou seja, o último que entra na pilha é o primeiro que sai (LIFO – Last-In-First-Out)
Qualquer dado inserido na Stack é automaticamente retirado automaticamente após a conclusão do processo que a alocou, isso livra o programador de se preocupar com isso.
Quando a Stack atinge seu tamanho máximo temos um problema muito conhecido como “stack overflow”. Os dados armazenados na Stack são chamados de “Value Types”.

A Heap é uma área de memória bem grande, diferente da Stack que é pequena, seu tamanho muda dinamicamente conforme o uso, a Heap é acessada indiretamente, por meio de referência, por isso chamamos os dados da Heap de “Reference Type”.
Existe um processo chamado Garbage Collector (GC) que é responsável pela limpeza desta área de memória.

O custo de se criar um objeto na Heap é muito maior do que na Stack, sendo assim na área de memória Stack nós temos os Value Types a seguir:
Tipos numéricos (int, long, short etc), ponto flutuante (float, double), decimal, booleanos (true e false) e estruturas definidas pelo usuário (struct).

Na Heap nós temos os Reference Types do tipo: Classes, Interfaces e Delegates.

As características dos tipos alocados em cada uma dessas áreas são as seguintes:

Value Types:

  • Uma variável deste tipo contém o valor, e não um endereço de referência para o valor;
  • Derivam de System.ValueTypes;
  • Variáveis de escopo local precisam ser inicializadas antes de serem utilizadas;
  • Atribuir o valor de variável a outra, implicitamente, é feita uma cópia do conteúdo da variável. Sendo assim, qualquer alteração no conteúdo de uma delas, não afetará a outra. Quanto maior for um objeto deste tipo mais custosa será sua cópia.

Reference Types:

  • Uma variável contém a referência (ou endereço) para o objeto que está na Heap;
  • Atribuir o valor de uma variável para outra faz uma cópia da referência, e não do próprio objeto. Ou seja, não é feita a cópia do objeto, e sim do endereço de memória do objeto, o que não gera muito custo para objetos grandes;
  • São alocados na Heap e seus objetos são coletados pelo Garbage Collector;
  • São passados por referência, enquanto que Value Types são passados por valor. Ou seja, a alteração de um objeto afetará todas as instâncias que apontam para ele.

Boxing e Unboxing

Boxing é o processo de converter um “Value Type” para o tipo de object ou a qualquer tipo de interface implementada por este tipo de valor “Reference Type”.

Unboxing extrai o “Value Type” do objeto. Transforma um objeto em um tipo simples.

      // Vamos fazer um Boxing
      int i = 123;
      object obj = i;

      // Agora vamos fazer Unboxing
      obj = 123;
      i = (int)obj;

Simples né?

O Garbage Collector (GC)

Como na Heap todos objetos são referenciados, o GC verifica se existe alguma variável fazendo referência a determinado objeto, caso não encontre ele desaloca “Coleta” aquela área de memória.

Um fato interessante, por mais que se chame o Garbage Collector a sensação que temos é de que ele irá entrar em ação no mesmo instante, mas não, estamos apenas sinalizando a ele. “Passe por aqui GC”.

Não é recomendado chamar manualmente o GC, deixe com que ele trabalhe de sua forma.
Abaixo estamos chamando o GC, porém sinalizando para que ele aguarde o trabalho em memória terminar:

      GC.Collect();
      GC.WaitForPendingFinalizers();

Passagem de Valor ou por Referência

Dada as funções:

      public void FuncaoPorValor(int numero)
      {
          numero = 10;
      }

      public void FuncaoPorReferencia(ref int numero)
      {
          numero = 10;
      }

A única diferença entre as duas é que uma trata a variável “numero” passada por valor e a outra trata a variável “numero” por referência.

Observemos os resultados:

      int variavel = 0;
      FuncaoPorValor(variavel);

      MessageBox.Show("Resultado = " + variavel.ToString());
      // Resultado = 0 Foi passada uma cópia da variável pro método.

      int variavel2 = 0;
      FuncaoPorReferencia(variavel2);

      MessageBox.Show("Resultado = " + variavel2.ToString());
      // Resultado = 10 Foi passada a referência da variável pro método.

Normalmente quando passamos uma variável para uma função, estamos passando uma cópia dela para a função trabalhar.
Caso essa cópia seja modificada a original permanece igual.

Quando passamos a variável por referência, um ponteiro de memória está sendo passado, ou seja, caso seja modificada a própria variável está sendo alterada, pois o ponteiro de memória aponta para a alocação original.

E por hoje ficamos por aqui.
Espero que aproveitem e em caso de dúvidas podem postá-las nos comentários.

Referências:

LightSwitch – Um jeito simples de criar aplicações modernas para empresas.

Olá pessoal, trago hoje mais uma novidade da Microsoft, o LightSwitch 2012

Todas as empresas atendem um determinado negócio e hoje em dia é praticamente impossível imaginar que não exista um sistema apoiando o controle do negócio ou pelo menos parte dele.

Desde a papelaria da esquina até um banco, todas empresas necessitam de um sistema, seja ele de apoio aos negócios ou de controle (estoque por exemplo).

As empresas possuem esta necessidade, é vital para seu funcionamento, mas nem sempre estão dispostas a investir financeiramente para adquirir um sistema moderno sob encomenda, tão quanto esperar aqueles meses de projeto para que fique pronto.

Resultado:
Sistemas Access, planilhas Excel, Softwares de prateleira ou até aquele sistema em VB5 que o vizinho tinha desenvolvido uns 10 anos atrás.

Em minha experiência com sistemas já presenciei diversos cenários, um dos mais intrigantes foi estar em um departamento de um banco de grande porte onde todo o processo era controlado por um sistema chamado “Planilhão”. O planilhão fazia tudo, controlava valores, entradas, saídas, diferenças.
Exposição à erros humanos, duplicação de informação e perda de dados era rotina.

Desenvolver um sistema sob encomenda que atenda o negócio de um determinado cliente não é barato para quem compra e não é fácil para quem faz.

Pensando nesse cenário a Microsoft inovou mais uma vez e lançou uma solução:

LightSwitch for Visual Studio

  • Desenvolva rapidamente aplicações de negócio.
  • Obtenha mais de seus dados.
  • Surpreenda os usuários finais.
  • Estenda sua aplicação sem redesenhá-la.

O LightSwitch é 100% RAD (Rapid Application Development).
Disponível para download no Visual Studio 2010, parte do Visual Studio 2012.
Cria automaticamente toda a estrutura (telas, CRUD, pesquisas, visualizações).
O único código que é escrito é a regra de negócios. Possui a facilidade de acompanhar o crescimento do sistema sem maiores manutenções.
Pode ser hospedado no Windows Azure 🙂

Arquitetura:

Arquitetura LightSwitch

Desenvolvedores tem em mãos com LightSwitch uma oportunidade de gerar novos negócios, pois possibilita o rápido desenvolvimento de sistemas, em conjunto com o Entity Framework todas as Entidades são criadas com base na modelagem de dados.

Não tem mais desculpa para usar o velho “planilhão” agora 🙂

Curioso para experimentar?
Abaixo uma série de vídeos passo-a-passo que irá prover todo o suporte necessário para se ambientar com a nova ferramenta:
(Conteúdo oficial Microsoft – Em Inglês) 

1 – How Do I: Define My Data in a LightSwitch Application?
(6 minutos 55 segundos)

2 – How Do I: Create a Search Screen in a LightSwitch Application?
(8 minutos, 58 segundos)

3 – How Do I: Create an Edit Details Screen in a LightSwitch Application?
(5 minutos, 15 segundos)

4 – How Do I: Format Data on a Screen in a LightSwitch Application?
(12 minutos, 52 segundos)

5 – How Do I: Sort and Filter Data on a Screen in a LightSwitch Application?
(9 minutos, 44 segundos)

6 – How Do I: Create a Master-Details (One-to-Many) Screen in a LightSwitch Application?
(9 minutos, 15 segundos)

7 – How Do I: Pass a Parameter into a Screen from the Command Bar in a LightSwitch Application?
(11 minutos, 44 segundos)

8 – How Do I: Write business rules for validation and calculated fields in a LightSwitch Application?
(15 minutos, 55 segundos)

9 – How Do I: Create a Screen that can Both Edit and Add Records in a LightSwitch Application?
(7 minutos, 30 segundos)

10 – How Do I: Create and Control Lookup Lists in a LightSwitch Application?
(7 minutos, 24 segundos)

11 – How Do I: Set up Security to Control User Access to Parts of a Visual Studio LightSwitch Application?
(23 minutos, 52 segundos)

12 – How Do I: Deploy a Visual Studio LightSwitch Application?
(20 minutos 24 segundos)

13 – How Do I: Deploy a LightSwitch Application to Azure?
(12 minutos, 41 segundos)

14 – How Do I: Modify the Navigation of Screens in a LightSwitch Application?
(04 minutos, 19 segundos)

15 – How Do I: Open a Screen After Saving Another Screen in a LightSwitch Application?
(08 minutos, 41 segundos)

16 – How Do I: Connect LightSwitch to an Existing Database?
(15 minutos, 20 segundos)

17 – How Do I: Connect LightSwitch to SharePoint Data?
(15 minutos, 26 segundos)

18 – How Do I: Save Data from Multiple Data Sources on the Same Screen?
(07 minutos, 19 segundos)

19 – How Do I: Set Default Values on Fields when Entering New Data?
(03 minutos, 21 segundos)

20 – How Do I: Copy Data from One Row into a New Row?
(07 minutos, 18 segundos)

21 – How Do I: Add Commands as Buttons and Links to Screens?
(08 minutos, 15 segundos)

22 – How Do I: Show Multiple Columns in an Auto-Complete Dropdown Box?
(02 minutos, 39 segundos)

23 – How Do I: Create Custom Search Screens in LightSwitch?
(18 minutos 22 segundos)

24 – How Do I: Handle Database Concurrency Issues?
(14 minutos 12 segundos)

O objetivo desse post é divulgar a novidade, em breve postarei mais conteúdo como exemplos, códigos e dicas.

Downloads:

Saiba mais em:

Debugando Windows Services no Visual Studio

Um colega de trabalho me questionou como debugar um Windows Services, geralmente isso é uma tarefa chata, precisamos instalar o serviço e ativar a interação para depois iniciar o Visual Studio em modo debug atachando o processo do serviço instalado.

Veja bem, não precisa ser complicado assim. Basta definir no próprio código o comportamento. Acredito que isso veja a ajudar bastante o nosso dia-a-dia então ai vai:

No seu arquivo Program.cs em seu estado original encontraremos o código a seguir:

namespace ServicoEduardo
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
			{
				new Service1()
			};
            ServiceBase.Run(ServicesToRun);
        }
    }
}

No código a seguir estamos deixando o serviço apto a ser debugado pelo Visual Studio sem a necessidade de instalação ou demais configurações:

namespace ServicoEduardo
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
#if (!DEBUG)
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
			{
				new Service1()
			};
            ServiceBase.Run(ServicesToRun);
#else
            // Debug code: Permite debugar um código sem se passar por um Windows Service.
            // Defina qual método deseja chamar no inicio do Debug (ex. MetodoRealizaFuncao)
            // Depois de debugar basta compilar em Release e instalar para funcionar normalmente.
            Service1 service = new Service1();
            // Chamada do seu método para Debug.
            service.MetodoRealizaFuncao();
            // Coloque sempre um breakpoint para o ponto de parada do seu código.
            System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
#endif
        }
    }
}

O que fizemos? Simples, informamos no próprio código o seu devido comportamento, assim quando estiver em modo Debug no Visual Studio ao dar um F5 seu código iniciará na chamada do método que foi definida.

Para testarmos as rotinas é muito prático, pois evitamos a necessidade de instalar e atachar o processo do serviço, que na maioria das vezes se torna o grande problema para testarmos as funcionalidades desenvolvidas.

Espero ter ajudado, em caso de dúvidas deixe um comentário.

DDD, TDD, BDD, Afinal o que são essas siglas?

Olá pessoal, Hoje vamos falar sobre DDD, TDD, BDD.

Muitas vezes pela internet em busca de novos conhecimentos nos deparamos com diversas siglas, estando elas anunciadas em algum requisito para desenvolvimento de sistema ou até mesmo citadas em alguma abordagem técnica.

Afinal o que são e para que servem?
Abordaremos de forma prática sua definição, muitos irão perceber que já estão usando e nem sabiam.

DDD – Domain-Driven Design (Desenvolvimento Guiado por Design ou Desenvolvimento orientado a Domínio)

Erick Evans lançou em 2003 o “Domain-Driven Design: Tackling Complexity in the Heart of Software” Mal imaginou que o livro tanto quanto o conceito alcançaria tal sucesso e respeito.

Trata-se de uma abordagem de design de software de forma disciplinada, abordando uma série de conceitos e técnicas sempre com foco no domínio do software.
Hoje em dia precisamos entender muitas técnicas, OO, SOA, EntityFramework, NHibernate, Injeção de Dependência e etc… O DDD não vem para substituir e também não é uma tecnologia, poderíamos dizer uma filosofia, não é algo super novo inventado e sim mais uma compilação de muito que já sabemos e aplicamos.

Como dito anteriormente o foco é no Domínio do Software, no propósito que o software deve atender, é a automatização de um processo de negócio.
Domínio nada mais é que do que você já está imaginando, ou seja, atender completamente um determinado negócio.

Ok! Mas todos os softwares corporativos não são desenvolvidos nesse propósito?
O DDD traz abordagens de como fazer isto, como atender um domínio complexo de informações. O pilar do DDD é conceitualizar em forma de Modelo o seu domínio.

Quando pensamos em modelo nos vem à cabeça: UML, Diagrama de Sequência, Diagrama de Estados e todo arsenal que pudermos montar.
Mas não exatamente, o Modelo pode ser feito de qualquer forma que possa ser entendido, Papel de pão, UML, Lego ou Massa de modelar, Não há padrão para modelo. Se o seu modelo expressar certo o funcionamento de negócio está perfeito!

E o que aborda o Modelo?
O modelo é um universo composto por cinco itens principais:
Entidades, Objetos de Valor, Factories, Serviços, Repositórios.
Já começou a ficar familiar, mas vamos entender mais um detalhe que o DDD aborda:

Ubiquitous Language:
Traduzindo, “Linguagem Onipresente”, é a que está em todo lugar. É a linguagem de quem entende do negócio.
Ex. O seu cliente, por um acaso um banco, fala Amortização (pagamento de parcelas). Logo sua equipe também fala Amortização, e isso se repete no modelo e no código.
É uma forma de todos falarem a mesma língua, a língua do negócio (Domínio).
Para se obter sucesso de um projeto DDD é necessário que todos os integrantes falem e entendam completamente o domínio.

Separação das camadas:
Na hora de desenvolver as camadas é necessário cuidado, as camadas precisam ser independentes, se duas camadas se misturam então não são duas camadas. Se você está desenvolvendo um sistema Web orientado a um domínio e resolveu migrar para ASP.Net, você necessita mudar a camada de UI (User Interface) e nada mais, pois são camadas independentes, o Core Domain (Dominio Principal) não depende da camada UI, e não só necessariamente uma UI, podemos estar falando de um WebService por exemplo, imagine que esta desenvolvendo um serviço SOA e quem consome o Core Domain seja um outro sistema.
Um software de negócios, com regras complexas pode ter N camadas, mas deve existir a camada Domínio, ela é o coração do sistema e a mais importante, afinal lá estão as regras de negócio que atendem ao domínio.

Voltando aos itens principais do modelo, começaremos com a Entidade:
Tudo que tenha valor ao domínio (regra de negócio) deve possuir uma entidade.
Voltando ao exemplo do banco, uma entidade seria o Cliente, toda entidade possui uma identidade nesse caso a Entidade Cliente possui uma Identidade (CPF).
Devemos escrever nesta camada todas as entidades ligadas ao domínio da forma mais simples, que seja implementada facilmente sem algum tipo de interface ou etc.

Objetos de valor:
São objetos reconhecidos por seus atributos e geralmente são imutáveis.
Por ex: Tipos de Conta são do tipo Corrente, Investimento, Crédito, Transitória e etc.
Sendo assim na hora de referenciar esse objeto de valor em sua entidade você necessita que ele possua estes tais atributos, pois fazem parte do domínio de seu negócio, chamamos isso de Agregação.

Serviços:
São ferramentas, pois não são entidades nem possuem objetos de valor.
Se por exemplo você precisa enviar um relatório de contas correntes ao Banco Central, sua entidade bem como os objetos de valor não estão preparados para isso, você precisa que um serviço execute essa tarefa, e por isso eles estão presentes no modelo de domínio do DDD.

Factories:
Em português “Fábricas”, Factories criam objetos, existem cenários quais são impossíveis de definir um objeto sem a criação dele através de uma Factory, sugiro para quem não entende direito o conceito de Factory, a leitura deste exemplo.

Repositório:
Não importa onde esteja alocado seu repositório, em algum momento você vai precisar guardar e recuperar um conjunto de informações como um objeto.
Repositórios não tem regra de negócios, eles fazem a intermediação da sua camada de domínio e sua camada de mapeamento de dados. Pode ser usado NHibernate, Entity Framework entre outros, escolha bem o seu.

Enfim, qualquer abordagem de DDD é muito bem aceito numa metodologia ágil.
Receber os feedbacks dos donos do negócio ao tempo todo é fundamental para uma entrega assertiva. Dentro de uma metodologia ágil programar pequenas entregas é uma boa prática, pois não se inicia no 0% e entrega-se 100% com grandes chances de  conter desvios de entendimento.
Sprints, entregas particionadas, diminuem o risco de desvio do entendimento do domínio, assim como do retrabalho.

Lembrando que uma metodologia ágil não faz parte exatamente de uma abordagem de DDD, mas é muito bem vinda.

O DDD é indicado ao meu projeto?
O DDD é indicado para seu projeto caso ele possua um conjunto de regras complexas de negócio, para um sistema simples não é aconselhado o uso de DDD.
Na maioria dos sistemas corporativos são encontradas diversas regras de negócio e cada uma com sua particularidade e complexidade.  Iniciar um projeto usando a abordagem de DDD previne que o sistema cresça cada vez mais de uma forma não orientada ao domínio.

TDD – Test-Driven Development (Desenvolvimento Orientado a Testes)

Baseado no DDD e defendido pelo Extreme Programming  XP (outra abordagem de programação ágil) é o Desenvolvimento de Software orientado a Testes.

É uma abordagem que oferece muita agilidade dentro do ciclo de desenvolvimento, a ideia é codificar um sistema com 100% de cobertura dos testes.

O processo de desenvolvimento do TDD seria:
RedGreen, Refactor.

  1. Escrever um teste, sem mesmo ter escrito o código real a ser testado (Figure o que deseja testar).
  2. Executar os testes e acompanhar a falha (Pode ser um código falso que retorne o  erro) (Red)
  3. Escrevemos a funcionalidade do sistema que iremos testar.
  4. Testar novamente, agora para passar (Se não passou algo saiu errado, faça novamente o passo 3) (Green)
  5. Refatore sua funcionalidade e a escreva por completo (o teste também) (Refactor)
  6. Passe para o próxima estória ou caso de uso e inicie novo teste.
Para a criação de testes em .Net é bem recomendado o uso de NUnit.
Abaixo um exemplo de caso de teste desenhado:
using System;
using NUnit.Framework;

namespace TDD.ClienteBanco
{
    [TestFixture]
    public class ContaTests
    {
        [Test]
        public void TestAporte()
        {
            Conta conta = new Conta("Test");
            conta.Deposito(500.0);
            conta.Deposito(70.0);
            Assert.AreEqual(570.0, conta.Balanco);
        }
     }
}

Resumindo, é uma prática bem utilizada e entende que o desenvolvimento é feito do teste para o código.
Teste unitário não é tarefa do Tester e sim do desenvolvedor, em muitas empresas um código sem testes unitários nem sobe no repositório. Pense em código, pense em teste de cobertura de código.

Para criação dos testes é bem eficaz a utilização de Mock, Dummy, Fake, Stub, que são considerados dublês de teste, pois se passam por objetos reais sem a necessidade de codificação dos mesmos na etapa da escrita do teste.

Posso utilizar TDD com DDD?
Sim.
Posso utilizar TDD em processos não ágeis?
Sim.
TDD é útil para design de software?
Sim.
Escrever testes após desenvolvimento é TDD?
Não.

BDD – Behavior Driven Development (Desenvolvimento Guiado por Comportamento ou Desenvolvimento Orientado a Comportamento)

Foi originalmente concebido em 2003, por Dan North, como uma resposta ao TDD, tem se expandido muito assim como DDD e TDD.

É uma abordagem que funciona também muito bem com uma metodologia ágil, encorajando desenvolvedores, pessoas de qualidade, não técnicas e de negócios em um projeto de software. Também defende o uso da ubiquitous language como explicado acima facilitando a conversação entre toda equipe envolvida.

Como começa a prática do BDD:

  1. Envolver as pessoas no processo através de Outside-in Development (Desenvolvimento de Fora pra Dentro)
  2. Usar exemplos para descrever o comportamento de uma aplicação ou unidades de código
  3. Automatizar os exemplos para prover um feedback rápido e testes de regressão
  4. Usar “deve”  na hora de descrever o comportamento de software para ajudar esclarecer responsabilidades e permitir que funcionalidades do software sejam questionadas
  5. Usar dublês de teste (mocks, stubs, fakes, dummies) para auxiliar na colaboração entre módulos e códigos que ainda não foram escritos.
Como o BDD é guiado pelo comportamento do negócio uma maneira de perceber o benefício produzido é pela interface gráfica, produzindo um feedback rápido para saber se os requisitos descritos através dos comportamentos estão funcionais.Escrevendo um requisito de comportamento do sistema:
Em BDD, um desenvolvedor, ou profissional do setor de qualidade ou até mesmo o cliente podem escrever os testes que basicamente são compostos em duas partes, a definição da funcionalidade a ser implementada (User storie) e os cenários de uso que irão validar este requisito.
A funcionalidade é escrita segundo um padrão:

Funcionalidade : [Nome]

Para [ Valor ao Negócio ] Eu, como [ Papel ] Desejo poder realizar [ Funcionalidade ]

Dessa forma fica muito claro a todos quais são os objetivos que uma funcionalidade deseja atingir e é de muito fácil entendimento.
Os cenários acompanham a funcionalidade de forma que demonstram comportamentos para atendê-la:

Cenário : [ Nome ]

Dado que [ Estado inicial do sistema ] Quando [ Ação a ser realizada no sistema ] Então [ Coisas que o sistema deve fazer após a ação do Quando ]

As palavras Dado queQuando e Então (GivenWhen e Then em inglês) são quase sempre usadas para guiar os cenários, não são obrigatórias.

A criação de requisitos para teste podem ser automatizados, existe uma ferramenta chamada SpecFlow,  que se adapta ao Visual Studio e suporta o idioma português.
Através do SpecFlow no Visual Studio é necessário adicionar um arquivo do tipo Feature File “.feature” e nele seria escrever uma estória.

Um exemplo bem simples de estória de uma aplicação de vendas poderia ser: “Venda de balas na doceria”.

#language: pt-br
Funcionalidade: Vender doces
     Para quando uma doce for vendido
     Eu, como vendedor
     Desejo decrementar um item no estoque

Cenário: Baixa 1 bala do estoque
     Dado que cliente pede 1 bala
     E tenho 10 balas em estoque
     Quando ele compra realiza a compra
     Então eu fico com 9 balas em estoque

Dado esta descrição o SpecFlow irá gerar um arquivo “.feature.cs” que será usado para testes, se rodar os testes após o momento da criação do arquivo com certeza vão falhar, afinal não existe a classe escrita nem a interface desenhada.

É possível fazer testes de interface e end to end sem muito esforço, usando ferramentas como o Watin e também Mock, Dummy, Fake ou Stub como dublês de objetos.

É nesse momento que entra o desenvolvimento da sua aplicação utilizando DDD e/ou TDD (por que não?) e após desenvolvida deve-se complementar o seu arquivo “.feature.cs” com as chamadas da interface para reprodução do requisito desenhado, então você poderá acompanhar o funcionamento do seu negócio com base nesses testes.

Esta é a abordagem do BDD, estimulando os todos envolvidos da equipe, técnicos ou não a escreverem um sistema baseado em comportamentos através de requisitos, estórias, funcionalidades e cenários.

É isso ai pessoal, espero ter abordado o DDD, TDD e BDD de forma clara e que tenha conseguido explicar cada um deles, suas diferenças entre si e como podem ser trabalhados juntos.

Referências:

Bem-vindo ao desenvolvimento para o Windows 8

Olá pessoal, vamos falar de Desenvolvimento para Windows 8.

Desenvolver um aplicativo pode ser uma tarefa simples, mas, ao mesmo tempo, existem vários pontos que devemos trabalhar para desenvolver um aplicativo de alta qualidade. Abaixo, elencamos atividades normalmente necessárias para se criar aplicativos de alta qualidade e os recursos básicos para cada atividade (alguns links apontam para páginas fora de sites da Microsoft).

Atividade Objetivo Recursos
1. Concepção da App
1.1 Análise das possibilidades Conhecer o que é possível fazer com a plataforma Metro Style Apps para Windows 8 Conheça o Windows 8: http://bit.ly/xpNvrMConheça a plataforma: http://bit.ly/wGuSvRO que sua App precisa ter: http://bit.ly/wzTyMRConheça o ferramental: http://bit.ly/xvVgnE

Conheça o Consumer Preview: http://bit.ly/HUtXcd

Guia do Consumer Preview: http://bit.ly/HmpcI4

Mais sobre Windows 8: http://bit.ly/HKfAGe

1.2 Definição da App (não técnico) Definir a visão da App, descrição, usuário-alvo, objetivos, principais funcionalidades e proposta de valor para o usuário Visão do produto: http://bit.ly/z9jBDKVisão do produto (PT-BR): http://bit.ly/xWiyUuProduct box e elevator pitch: http://bit.ly/whCHHu
1.3 Dar visibilidade Dar visibilidade para a Microsoft que você está desenvolvendo para Windows 8.
Você receberá conteúdos de antemão e terá prioridade nos treinamentos de Windows 8.
Registre sua aplicação na seção “Application Profile”:http://bit.ly/HUAcgj
1.4 Projeto e design da App Definir a arte, storyboards, design técnico, arquitetura e funcionalidades da plataforma. Planejar a execução. Projetando User Experience (UX): http://bit.ly/HmoNoPUser Experience Guidelines: http://bit.ly/zfOMHrRequisitos de certificação: http://bit.ly/wIg0LSDesign e estilo da App: http://bit.ly/yjVcI0

Otimização pra touch: http://bit.ly/w1Ic0P

Scrum e Product Backlog (PT-BR): http://scr.bi/zI1185

1.5 Criação de provas de conceito (Opcional) Validar ideias e mitigar riscos com provas de conceitos de tecnologias, componentes e controles. Downloads para Desenvolvedores: http://bit.ly/HeUVIFExemplos de código: http://bit.ly/HmpkqUMetro Style com DirectX: http://bit.ly/zOHEm2Metro Style com HTML5: http://bit.ly/wgD9zh

Metro Style com XAML: http://bit.ly/A8WGp6

Metro Style com Javascript: http://bit.ly/xgc9EQ

Metro Style com XAML 2: http://bit.ly/yiI8d8

2. Elaboração da App
2.1 Criação de protótipo funcional Implementar a primeira versão da App que será evoluída até a publicação na Windows Store.Primar pela qualidade e ir adicionando funcionalidades aos poucos. Metro Style com DirectX: http://bit.ly/zOHEm2Metro Style com HTML5: http://bit.ly/wgD9zhMetro Style com XAML: http://bit.ly/A8WGp6Metro Style com Javascript: http://bit.ly/xgc9EQ

Metro Style com XAML 2: http://bit.ly/yiI8d8

3. Evolução da App
3.1 Testes e correção de defeitos3.2 Evolução do protótipo adicionando novas funcionalidades Evolução da prova de conceito em produto (conteúdo do BUILD sobre desenvolvimento avançado) Ferramenta de testes de certificação:http://bit.ly/wIg0LSOutros recursos sobre Windows 8: http://bit.ly/HKfAGe

Próximos passos

  1. Baixe o Consumer Preview e as ferramentas de desenvolvimento:  http://bit.ly/HeUVIF
  2. Dê visibilidade para a Microsoft que você está desenvolvendo para Windows 8. Você receberá conteúdos de antemão e terá prioridade nos treinamentos de Windows Registre sua aplicação na seção “Application Profile”: http://bit.ly/HUAcgj