BDD

O BDD é uma extensão do TDD, que é uma prática de design. Seu príncipio básico está na ideia de que ao iniciar a especificação de uma feature se realize inicialmente o teste ( o qual irá falhar) seguido pelo desenvolvimento da feature. Após o teste estar pronto, teremos a liberdade de refatorar seu código com a segurança de que não alterou comportamento ou gerou bugs.

Esse fluxo de ações é chamado de red — green — refactor.

Ao utilizar o BDD estamos especificando o comportamento que queremos construir definindo seu design numa abordagem outside-in development.

Resumo para iniciantes em Ruby

  • puts "Imprime"

  • nome = gets #pega valores do teclado

  • "1000".to_i #string para inteiro

  • 1.to_s #inteiro para string

  • "coisa".count "a" #quantidade de vezes que o “a” irá aparecer em “coisa”

  • " coisa".strip #retira os espaços antes e depois na string

  • "naralinus".chars #transforma a string em uma arrays de char

  • "naralinus".upcase #”NARALINUS”

  • " NaraLinus".downcase #” naralinus”

  • " NaraLinus".downcase.strip #”naralinus”

  • "Nara".chars.first #”N”

  • "Nara".chars.last #”a”

  • "Nara".chars.take 2 #[“N”, “a”]

  • "Nara".chars.drop 2 #[“r”, “a”]

  • "Nara".chars.fetch(2, "Não tem esse indice") #retorna o valor “r”

  • "Nara".chars.fetch(4, "Não tem esse indice") #retorna “Não tem esse indice”

  • "Amanda".index "a" # caso não encontre, essa função retorna nil

*`“Amanda”.reverse # “adnamA”

LAÇOS

1) IF

if algo?
    
    puts "foi!"

else

    puts "não foi"

end

OU

if algo?

    puts "vai"

elsif outro_algo?
      
    puts " vai agora.."

end

2) FOR

for valor in 1..3

    puts valor  # codigo a ser executado

end

3) CASE

case ano

when 2016

    puts "ano atual"

when 2015

    puts "ano passado"

when 2014

    puts "ano retrasado"

else 

    puts " num deu.."

end

4) WHILE

while existir_amor
    
    toca_o_som  deejay  #função recebendo parâmetro

end

5) LOOP DO

loop do
    
    toca_o_som  deejay

    break if nao_eh_amor?

end

def nao_eh_amor?

    puts "good vibes? (S/N)"

    ta_bom = gets.strip
    
    nao_ta_bom = ta_bom.upcase == "N"

end

ARRAYS

Adicionando itens

valores = []  ou valores = Array.new 

valores[0] = 4  
      #valores = [4]

valores.at (0) 
        # retorna item da posição 0 => 4

valores.empty?  
        #informa se o array está vazio (false nesse caso)

valores.include? 4  
         #true

valores.push 5  
         # valores = [4, 5] add o item 5 no final do array

qtd = valores.size  
        #informa quantidade de itens/  qtd=2

valores<< 6   
        #valores = [4, 5, 6]  add o item 6 no final do array

valores.unshift 2  
        #valores = [2, 4, 5, 6]  add o item 2 no inicio

valores.insert 1,3  
        #add na posicao de index 1 o item 3/ valores = [2, 3, 4, 5, 6]

Removendo itens

valores = [1, 2, 3, 4, 5, 6]

ultimo_elemnt = valores.pop   
        #deleta sempre o último elemento
        #ultimo_elemnt = 6 e  valores = [1,2,3,4,5]

primeiro_elemnt  = valores.shift 
        #deleta sempre o primeiro elemento
        #primeiro_elemnt = 1 e valores =  [ 2, 3, 4, 5]

elemnt_delet = valores.delete 5 
        #deleta o elemento especificado
        #elemnt_delet =5  e valores =  [ 2, 3, 4]

elemnt_del_no_index  = valores.delete_at (2)  
        #deleta sempre em um determinado index
       #elemnt_del_no_index = 4 e valores = [2, 3]

Selecionando itens do array - Não destrutiva

valores = ["Nara", "Linus", "Coisa"]
 
var = valores.select { |item| item  == "Nara" } 
        #var =  ["Nara"]  e valores = ["Nara", "Linus", "Coisa"] 
        # retorna os itens que batem com a validação

var = valores.reject { |item| item  == "Coisa" }
#var = ["Nara", "Linus"] e valores = ["Nara", "Linus", "Coisa"] 
#retorna todos os itens que  não batem com a validação
   
valores = [1, 2, 3, 4]

var = valores.drop_while {|item| item <=3}
#var = [4]  e valores = [1, 2, 3, 4]

Selecionando itens do array - Destrutiva

valores = ["Coisa1",  "Coisa2", "Coisa3"]
 
var = valores.delete_if { |item| item  == "Coisa1" } 
        #var =  ["Coisa2", "Coisa3"]  e valores = ["Coisa2, Coisa3"] 
        # retorna o array sem os itens que batem com a validação
        #causa alterações no array matriz

valores = ["Coisa1",  "Coisa2", "Coisa3"]

var = valores.keep_if{ |item| item  == "Coisa3" }
        #var =  [ "Coisa3"]  e valores = ["Coisa3"] 
        # retorna o array apenas com itens que batem com a validação
        #causa alterações no array matriz

UTILIZANDO FILA NO ARRAY

   numeros = [ ]
  
   numeros.push 1  #numeros = [ 1 ]

   numeros.push 2  #numeros = [ 1,  2 ]
  
   numeros.push 3  #numeros = [ 1, 2, 3 ]
  
   numeros.shift   #numeros = [ 2, 3]

   numeros.shift   #numeros = [ 3 ]

UTILIZANDO PILHA NO ARRAY

   numeros = [ ]
  
   numeros.push 1  #numeros = [ 1 ]

   numeros.push 2  #numeros = [ 1,  2 ]
  
   numeros.push 3  #numeros = [ 1, 2, 3 ]
  
   numeros.pop  #numeros = [ 1, 2 ]

   numeros.pop   #numeros = [ 1 ]

INTERPOLAÇÃO DE STRINGS

valor = "Linus"

puts " O filho mais amado do mundo eh #{valor}"

ARRAY ASSOCIATIVO

parentes = { 1 => [ "Nara", "pequena" ], 2 => ["Marido", "grande"], 3 => [ "Linus", "miúdo"] }

puts parentes [ 1 ] # imprime o texto "Nara" e "pequena"

puts parentes [ 1 ] [ 0 ]   #imprime o texto "Nara"

puts parentes [ 1 ] [ 1 ]   #imprime o texto "pequena""

INTERATOR

amores = ["Nara", "Marido", "Linus", "Amanda"]

Vamos imprimir todos os itens dessa lista, um por linha:

amores.each  do |nome|
     
    puts "(#{nome})"
   
end

Imprimiu:

	(Nara)
	(Marido)
	(Linus)
	(Amanda)

Porém ficaria muito mais bonitinho se fosse impresso contendo o index do nome no array, assim:

    amores.each_with_index do |item, index| 

	puts "(#{index},  #{nome})"

end

Imprimindo portanto:

    (0, Nara)
    (1, Marido)
    (2, Linus)
    (3, Amanda)

FUNÇÕES

def uma_funcao

    valor =15

    verifica_algo algo  #função com seu parâmetro

    valor # a última linha é um return

end

IMPORTANDO ARQUIVOS

require_relative 'ui'   #importando de arquivos relativos

require       # importando do ruby

LENDO DE ARQUIVOS

Dado um arquivo (hello_adele.txt) contendo o texto:

Hello

Can you hear me?

o_arquivo_de_adele  =  File.new("hello_adele.txt", "r")

pegando_linha_incrementalmente =  o_arquivo_de_adele.gets   

            #pegando_linha_incrementalmente = "Hello\n" 

pegando_linha_incrementalmente =  o_arquivo_de_adele.gets   

            #pegando_linha_incrementalmente = "Can you hear me?"

arquivo.close

OU

texto_adele = File.read("hello_adele.txt")

puts texto_adele # vai imprimir "Hello\nCan you hear me?"

E como eu gosto muito dessa música quero quebrar o texto em uma array de Strings cujo separador seja a quebra de linhas.

frases_belas = texto.split "\n"
  
puts frases_belas         #Vai imprimir  ["Hello", "Can you hear me?"]

Mas faltou colocar na música aquela parte que dá pra cantar a plenos pulmões:

testando_pulmoes = "\nSo hello from the other side\n
                 I must've called a thousand times\n
                 To tell you I'm sorry\n
                 For everything that I've done\n
                 But when I call you never\n
                 Seem to be home\n"

File.open('hello_adele.txt', 'a') { |o_arquivo_de_adele| o_arquivo_de_adele.write(testando_pulmoes) }

Texto completo:

	Hello
	Can you hear me?
	I'm in California dreaming about who we used to be

	So hello from the other side
	I must've called a thousand times
	To tell you I'm sorry
	For everything that I've done
	But when I call you never
	Seem to be home

CLASSE

Vamos definir a classe Pessoa que possue 3 atributos:

 class Pessoa

    def initialize(nome)
        @nome = nome
        set_posicao "em casa"
    end
    def set_posicao new_posicao
        if new_posicao.downcase == "em casa"
            @posicao = "em casa"
            @humor = "muito feliz"
        else
            @posicao = new_posicao
            @humor = "bla."
        end
    end
    def to_s
        "#{@nome} está #{@posicao} e #{@humor}."
    end
  end

meu_marido = Pessoa.new("James")
puts meu_marido.to_s   #James está em casa e muito feliz.

Início

Bem,

Olá! =)

Logo, logo vamos ter por aqui um blog um pouquinho organizado. (Espero..^^)

Meu objetivo nesse blog será cobrir alguns assuntos que sempre estão motivando/marretando meus dias, como por ex: usabilidade, automação de testes, padrões, ruby, python, extração de requisitos.. enfim. Como dá pra notar não é um blog de algo específico, será um conjunto de informações sobre estudos iniciados/em_andamento/finalizado. =)

Já existe uns projetinhos nesse github, pensei que subindo os códigos ficasse mais fácil lembrar meus próprios passos mas considerei eles tão sem vida quando apenas commitados lá.. Commitados sem nenhuma historinha, sem um vinho, uma conversa fiada e tal. Nada mais? Ai fiz uns powerpoints coloquei lá no sharedfiles. E ai pensei: Agora sim.

Pois não foi suficiente.. precisava de mais alma, mais explicação, mais emoção, mais vida..

E cá estamos…

Vamos começar!

“Segunda à direita e sempre em frente até o dia amanhecer!”