Blog

Gerenciando múltiplas chaves SSH no Linux

Gerenciando múltiplas chaves SSH no Linux

Quem trabalha com desenvolvimento web provavelmente já deve ter ficado louco em algum momento com tantas chaves SSH para gerenciar. É chave para Github, chave para servidor de teste, chave para servidor de produção… O SSH config é uma mão na roda nessas horas.
Alias
Quando eu comecei a trabalhar com SSH, tinha apenas duas chaves para gerenciar eeu simplesmente chamava assim:

$ ssh -i ~/.ssh/chave_privada usuario@servidor

O problema com esse comando é que são muitas coisas pra digitar e é muito fácil de esquecê-las. Foi então que alguém me falou: “- Ei! Usa um Alias no Shell e para de sofrer…”. Como faz isso? Você precisa abrir seu .bashrc e adicionar o seguinte:

alias ssh_server1=’ssh -i ~/.ssh/chave_privada usuario@servidor’

Agora, sempre que eu quiser acessar o servidor em questão, abro o meu terminal e digito

$ ssh_server1

Config file
Eu costumo ser bem chato com organização. Hoje tenho cerca de cinco chaves para gerenciar e utilizar Alias para todas não parecia ser o mais legal. Na verdade, estava bem feio. Foi aí que descobri que o próprio open-ssh disponibiliza um arquivo de configuração para gerenciar as chaves.
Veja como é fácil converter o exemplo anterior para o arquivo de configurações:

O primeiro passo é acessar o diretório ~/.ssh e criar o arquivo config:


$ cd ~/.ssh
$ touch config

Agora você deve definir os parâmetros de sua conexão ssh:


Host server1
User usuario
HostName server1.com
IdentityFile ~/.ssh/chave_privada_do_server1

Agora, para acessar o server1 por ssh, rode o comando:

$ ssh server1

Simples assim!
Você também pode gerenciar as chaves utilizadas em repositórios GIT. Digamos que o seu repositório esteja hospedado sob o endereço repositorios.com. Então, ao invés de utilizar o ssh-agent para configurar a chave privada a ser utilizada, você pode criar uma nova entrada no arquivo de configuração ~/.ssh/config

Host repos
HostName repositorios.com
IdentityFile ~/.ssh/chave_privada_do_repositório
IdentitiesOnly yes

e utilizar o seguinte comando para clonar o repositório

$ git clone git@repos:seu_repositorio.git

O IdentitiesOnly yes serve para dar prioridade à chave privada definida em IdentityFile. Sem essa opção, a primeira tentativa de chave a ser utilizada seria a chave id_rsa
Essa dica é bem simples e vai ajudar bastante na organização de suas chaves. Outras dicas podem ser encontradas na documentação oficial do open-ssh, ou aqui no blog em um próximo post!
Até a próxima!
O post Gerenciando múltiplas chaves SSH no Linux apareceu primeiro em Blog Locaweb – Notícias sobre tecnologia, programação e muito mais..

Gerenciando múltiplas chaves SSH no Linux
Fonte: Locaweb

Ser ágil é ser rápido?

Ser ágil é ser rápido?

Oras, se você estiver se referindo ao significado do adjetivo ágil, contido no dicionário e que se refere a algo “que se movimenta com excesso de facilidade; que se move de maneira rápida; veloz”, pode até ser que sim. Agora, se você estiver se referindo ao ágil dentro do contexto de software, então com certeza não!
Ainda lembro quando estava estagiando na SAP da Hungria, primeiro lugar em que realmente tive experiência com desenvolvimento de software, e, em minha entrevista, o gerente falou que eles eram ágeis.
Eu já havia feito um minicurso de Scrum em um evento da universidade e para mim até então, saber Scrum era ser ágil. Logo, sem hesitar, falei para eles que achava legal o fato de utilizarem a metodologia e estava me gabando por saber o que significava ágil (mal sabia eu, que se eles não utilizassem Scrum mesmo, talvez eu nem tivesse conseguido a vaga :D).
Outra coisa que eu havia colocado em minha cabeça é que ser ágil é realmente ser mais rápido. Pode até que isso realmente aconteça em algumas situações, mas essa não é a regra do mindset, de maneira alguma.
E você não precisa ler aqueles livros de páginas sobre as mais diferentes abordagens que dão para o ágil por aí. Basta ler o manifesto ágil. Sim, simples assim. Tem até o link aqui para ficar ainda mais fácil.
Agora, faça o seguinte: abra a busca de texto do seu navegador na página do manifesto e procure pelas palavras “rápido” e “veloz”. Achou? Pois é!
Para iniciar no ágil, essa é a primeira coisa que você tem que colocar em sua cabeça: desenvolvimento de software ágil não é necessariamente desenvolvimento de software rápido. Não! Uma das melhores definições para o ágil que eu já vi é a seguinte:
 
“The point of Agile is reducing the cost of change and uncertainty.”.
 
Não é uma maravilha? Esse sim é o ponto do ágil: reduzir os custos das mudanças e incertezas. O que o seu cliente quer hoje, amanhã pode não querer mais e não é porque ele é indeciso (pode até ser, vai :D), mas porque o mercado muda e os objetivos também. E toda essa mudança e incerteza não são colocados na conta dos processos antigos que existiam e ainda existem por aí.
 
Mas então por que o ágil consegue responder às mudanças e outras metodologias não?
Ué, por entregar software mais rápido! Êpaaaa! Como assim, Pablo? Você acabou de dizer que não tem nada a ver com rapidez!
Então, são unidades do software final que gerem algum valor para que o cliente entenda se está tudo bem; se a ideia é essa mesmo, se é esse o valor que ele estava esperando. E isso sim é mais rápido.
O que eu estou querendo mostrar é que não adianta pensar que um projeto que você demoraria um ano para entregar utilizando waterfall, agora você vai entregar com dois meses utilizando ágil. O que vai acontecer é que, mesmo que você demore o mesmo ano (o que provavelmente será menos), o valor que você vai gerar para o seu cliente será certeiro.
O software entregue será o que ele realmente estava precisando, ao invés de chegar no final do ano de desenvolvimento com waterfall – e descobrir que seu cliente queria uma moto vermelha mas você acabou entregando um barco azul.
Tenha na cabeça que ágil não é uma metodologia milagrosa. As incertezas sempre estarão lá e o seu cliente sempre vai mudar, isso é algo natural. O que o ágil faz é permitir que você responda às mudanças sem ter que esperar muito tempo. E como já dizia Benjamin Franklin “Tempo é dinheiro”!
O post Ser ágil é ser rápido? apareceu primeiro em Blog Locaweb – Notícias sobre tecnologia, programação e muito mais..

Ser ágil é ser rápido?
Fonte: Locaweb

Instalando Node.js 6.x e npm no Ubuntu 16.04

Instalando Node.js 6.x e npm no Ubuntu 16.04

Node.js é uma plataforma Javascript que permite que os desenvolvedores criem aplicações de rede escaláveis e de maneira rápida. É utilizada no mundo todo e mantida por uma grande comunidade.
Outro importante elemento é o gerenciador de pacotes npm (node package manager). Com o npm é possível ter acesso a um repositório online onde existem milhares de projetos de código-aberto para o Node e, claro, gerenciar todas as dependências e versões que precisarmos. Dito isso, vou mostrar duas maneiras de instalar o node e também como instalar o npm no seu Ubuntu 16.04. Vamos lá?
Utilizando os repositórios do Ubuntu
A maneira mais simples de instalar o node no Ubuntu é obtendo-o dos repositórios padrões do sistema operacional. Geralmente não será a última versão, mas será uma versão estável. Primeiro, precisamos ter certeza que nossos repositórios e os pacotes do sistema estão atualizados

$ sudo apt update
$ sudo apt upgrade

E logo então podemos instalar o node (aqui precisei de sudo)

$ sudo apt install nodejs

E por último o npm (também precisei de sudo)

$ sudo apt install npm

Para verificar que tudo foi instalado corretamente, vamos conferir as versões que foram instaladas (pode ser que você já tenha instalado uma versão mais atual)

$ node -v
v6.9.4
$ npm -v
3.10.10

Utilizando um PPA
PPA (Personal Package Archives) são pacotes pessoais que não pertencem as atualizações ou softwares padrões do Ubuntu; criados e mantidos pela comunidade. Geralmente são utilizadas para manter as versões mais atualizadas dos softwares, que não estão nos repositórios padrões. Eu não vou entrar aqui no assunto se PPAs são seguros ou não, porque nesse caso o PPA que vou indicar para vocês é indicado pelo site oficial do node.
Primeiro precisamos instalar uma dependência do pacote python-software-properties caso você ainda não o tenha


$ sudo apt install python-software-properties

e agora basta adicionar o PPA

$ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -

Feito isso

$ sudo apt install nodejs

Utilizando o PPA, o npm é instalado automaticamente junto com o node. Novamente testando a instalação


$ node -v
v6.9.4
$ npm -v
3.10.10

No momento em que escrevi este artigo, a versão mais atual do Node.js é a v7.4.0, mas ela ainda não estava com LTS (Long Term Support), o que não impede você de testá-la ou usá-la. Se quiser fazer isso, simplesmente repita a instalação via PPA, mas com o seguinte repositório


$ curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -

Verá que as versões foram atualizadas


$ node -v
v7.4.0
$ npm -v
4.0.5

É isso ai pessoal! Tem alguma dúvida? Me deixe uma mensagem nos comentários. Até a próxima!

O post Instalando Node.js 6.x e npm no Ubuntu 16.04 apareceu primeiro em Blog Locaweb – Notícias sobre tecnologia, programação e muito mais..

Instalando Node.js 6.x e npm no Ubuntu 16.04
Fonte: Locaweb

Na mesa do Chief – Entrevista com a Designer Cristiane Amaral

Na mesa do Chief – Entrevista com a Designer Cristiane Amaral

Eae! Td bele? Mais um hangout para vocês. :) No vídeo de hoje converso com a Designer Cris Amaral. Nesse hangout falamos sobre a profissão, mercado, clientes, entre outras coisas. Assista abaixo esse bate-papo: Sobre a Designer Cris Amaral Formada em Design de Interiores (CAD) e Design Gráfico pela Universidade Federal de Santa Catarina, experiência como […]
O post Na mesa do Chief – Entrevista com a Designer Cristiane Amaral apareceu primeiro em Chief of Design.

Na mesa do Chief – Entrevista com a Designer Cristiane Amaral
Fonte: Chef of Design

APPs híbridos com Cordova

APPs híbridos com Cordova

Desde que tive meu primeiro smartphone, sempre quis entender como os aplicativos eram feitos. Eu achava aquilo um máximo! Por isso, ainda na faculdade, em minhas horas vagas, depois que eu aprendi a programar, sempre ficava me aventurando no mundo do Android. Aprendi o suficiente para saber fazer aplicativos básicos e até elementos um pouco mais avançados.
Mas ainda não era suficiente, porque eu queria saber como desenvolver aplicativos para iOS e Windows Phone (sim, acreditem :D) também. Então naquela época eu fiz algumas aulas de Objective C e de C# e acabei até fazendo meus primeiros aplicativos para as duas plataformas.
O problema é que é muito complicado você manter o mesmo APP em três linguagens diferentes e eu não tinha vontade para aprender Objective C (com seus infinitos colchetes) e nem memória no PC para manter o Visual Studio e programar com C# :D
Foi aí que em um belo dia ouvi falar do PhoneGap, basicamente um framework mobile multiplataforma baseado nas tecnologias padrões da web. Isso significa que o mesmo código de um aplicativo rodaria nas três plataformas que eu mencionei e em mais algumas que o Phonegap dava suporte. Sensacional, não?
 
A tecnologia
O que deu vida ao PhoneGap foi um conjunto de APIs móveis open-sources chamado de Apache Cordova, gerenciado pela Apache foundation.
Basicamente, o que o Cordova faz é prover APIs que permitem acessar os elementos nativos dos dispositivos móveis e computadores tais como, câmera, gps, NFC, áudio, etc., via JavaScript.
Como é o Cordova que vai fazer com que nossas chamadas via Javascript sejam interpretadas por cada uma das plataformas que desejarmos, temos aí uma maneira universal para programar nossos apps sem termos que nos preocupar com Java, Swift ou C#, mas somente com HTML, CSS e qualquer framework JavaScript que estivermos dispostos a usar.
Uma vez combinado com um framework UI (Interface de usuário), as possibilidades para criar aplicativos utilizando somente as linguagens web que mencionei, eram infinitas. Essa modalidade de aplicativos ficou então conhecida como aplicativos híbridos.
Desde os tempos iniciais do PhoneGap até os dias de hoje, a plataforma evoluiu bastante e já é possível utilizá-la inclusive para criar aplicativos para Windows, Ubuntu e OS X, ultrapassando as barreiras do mobile.
 
Frameworks e mais frameworks
Falando em frameworks, o PhoneGap já não está mais sozinho no universo Cordova. Existe um verdadeiro ecossistema de frameworks open-source que permitem que você construa aplicativos híbridos.
Um deles é o ionic, um dos melhores atualmente. Ele foi construído utilizando Angular e é uma plataforma que já permite até mesmo integrar serviços como push notifications e analytics.
A grande vantagem do ionic é a extensa comunidade que ele já possui e com isso a vasta gama de elementos UI que ele possui. Só para você ter uma ideia, enquanto escrevia esse artigo, o projeto já tinha mais de 27 mil estrelas no GitHub.
Além do ionic, existem diversos outros que talvez você possa se interessar: jQuery Mobile, Sencha Touch, Ratchet e Lungo. Esses são os que eu conheço, mas existem muitos outros por ai.
 
Nativo X Híbrido
Eu já falei da principal vantagem que vejo em se fazer aplicativos híbridos: a complexidade de desenvolvimento multiplataforma que é bastante facilitada. Ainda assim, pense que é preciso uma equipe com expertise nas plataformas para as quais iremos desenvolver por conta dos testes que realizaremos. Afinal, garantir o funcionamento do produto em todas as plataformas continua sendo uma obrigação de quem desenvolveu o produto, não é mesmo?
É por isso que por mais que diminua a complexidade de desenvolvimento, o custo de desenvolver para múltiplas plataformas continuará sendo alto em outros aspectos. Nós sabemos que desenvolver software de qualidade ainda é uma tarefa complexa e cara. Mesmo assim é possível utilizar tecnologias híbridas para desenvolver um software mobile multiplataforma de qualidade; basta estarmos dispostos a pagar o preço para isso.
Atualmente, muitas empresas utilizam os APPs híbridos como MVP (Minimum Viable Product) porque conseguem desenvolver rapidamente os aplicativos para várias plataformas, a fim de testá-los e validá-los com seu público-alvo. É realmente uma das finalidades que eu indicaria para que você utilizasse essa tecnologia, pois a um custo baixo, você poderia errar ou acertar rapidamente (agora eu vi vantagem :D).
Muitos APPs híbridos acabam virando nativos mais tarde, quando atingem uma base considerável de usuários, muitas vezes por conta de performance. Eu não vou entrar muito no assunto de performance porque os softwares como o Cordova estão cada vez mais evoluídos e já permitem, como disse anteriormente, a utilização de recursos nativos dos aparelhos em contrapartida dos apps “fakes” feitos com WebView.
Mas é fato que se você precisar desenvolver um código nativo (em C por exemplo), como muitas empresas de games precisam, ou se precisar de uma performance absurda, então realmente escolher o híbrido não seria uma boa ideia. É melhor então começar a pensar em montar suas equipes para cada uma das plataformas que pretende atuar.
E você, o que acha? Nativo ou híbrido?
Dúvidas? Deixe um comentário, que eu terei prazer em responder! Até a próxima!
O post APPs híbridos com Cordova apareceu primeiro em Blog Locaweb – Notícias sobre tecnologia, programação e muito mais..

APPs híbridos com Cordova
Fonte: Locaweb

Instalando o Cordova 6.x no Ubuntu e Mac OS X

Instalando o Cordova 6.x no Ubuntu e Mac OS X

Instalar o Cordova no Ubuntu e no Mac OS X é uma tarefa bem simples se já tivermos com o Node.js e npm instalados. Caso você ainda não tenha essas dependências, você pode instalá-las utilizando um destes dois guias, para Ubuntu ou para Mac OS X.
Bom, agora que você já tem as dependências necessárias, vamos utilizar o npm para instalar o Cordova. Neste guia, eu estou utilizando o Ubuntu 16.04, mas os mesmos comandos podem ser utilizados para instalar no Mac OS X também. Para instalar o framework, simplesmente digite em seu terminal

$ npm install -g cordova

Aqui eu precisei de sudo, por conta de algumas permissões de pastas do meu computador. A saída desse comando, deve ser mais ou menos a seguinte (pode mudar dependendo de quantas dependências do cordova você já tiver instaladas)

Para ter certeza que tudo está certo, vamos então criar uma aplicação de teste bem simples. Todos os comandos que vamos precisar para criar essa aplicação serão feitos através da CLI (command-line interface) do Cordova.
Entre em um diretório de sua preferência onde deseja criar a aplicação. No meu caso

$ pwd
/home/pablo
$ cd repos

Uma vez no diretório, digite

$ cordova create appTest
Creating a new cordova project.

Se nenhum erro apareceu, a aplicação inicial foi criada. Aqui não estamos falando de nenhuma plataforma, simplesmente estamos testando nosso framework. Por isso, vamos utilizar o nosso navegador mesmo para testar nossa aplicação, pois não vamos precisar instalar nenhuma dependência de plataforma. Com a aplicação criada, entre no diretório em que ela está

$ cd appTest

Agora vamos adicionar uma plataforma ao nosso projeto, neste caso como disse o próprio navegador (é possível que ele instale algumas dependências automaticamente)

$ cordova platform add browser
Adding browser project…
Running command: /home/phsil/.cordova/lib/npm_cache/cordova-browser/4.1.0/package/bin/create /home/phsil/repos/MyApp/platforms/browser io.cordova.hellocordova HelloCordova
Creating Browser project. Path: platforms/browser
Discovered plugin “cordova-plugin-whitelist” in config.xml. Adding it to the project
Fetching plugin “cordova-plugin-whitelist@1” via npm
Installing “cordova-plugin-whitelist” for browser

Uma vez que o nosso projeto agora tem suporte para o navegador, vamos então rodar nossa aplicação para confirmar que tudo deu certo

$ cordova run browser
Running command: /home/phsil/repos/MyApp/platforms/browser/cordova/build
Cleaning Browser project
Running command: /home/phsil/repos/MyApp/platforms/browser/cordova/run –nobuild
Static file server running @ http://localhost:8000/index.html
CTRL + C to shut down

Como você pode ver, foi criado um servidor estático no endereço http://localhost:8000/index.html. Abra seu navegador (se ele não foi aberto automaticamente) e digite o endereço do servidor.
Se tudo deu certo, você verá a seguinte tela:

Parabéns, você criou sua primeira aplicação utilizando o Cordova.
Você pode saber muito mais sobre o framework, olhando sua documentação neste link. É uma documentação bem completa que vai te ajudar a entender melhor os aspectos do framework e começar a desenvolver para outras plataformas, como Android e iOS.
Ficou alguma dúvida? Escreva aí nos comentários! Até a próxima!
O post Instalando o Cordova 6.x no Ubuntu e Mac OS X apareceu primeiro em Blog Locaweb – Notícias sobre tecnologia, programação e muito mais..

Instalando o Cordova 6.x no Ubuntu e Mac OS X
Fonte: Locaweb

Instalando Node.js 6.x e npm no Mac OS X com Homebrew

Instalando Node.js 6.x e npm no Mac OS X com Homebrew

Node.js é uma plataforma Javascript que permite que os desenvolvedores criem aplicações de rede escaláveis e de maneira rápida. É uma plataforma extensamente utilizada no mundo todo e mantida por uma grande comunidade.
Outro importante elemento é o gerenciador de pacotes npm (node package manager). Com o npm é possível ter acesso a um repositório online com milhares de projetos de código aberto para o Node e, claro, gerenciar todas as dependências e versões que precisarmos. Dito isso, vou mostrar como instalar o node e também como instalar o npm no seu Mac OS X utilizando o brew. Vamos lá?
Nosso Homebrew de cada dia
Uma das maneiras mais simples de instalar o node no Mac OS X é utilizando o Homebrew. Primeiro, precisamos ter certeza de que os repositórios do brew estão atualizados.

$ brew update

Vamos primeiro pesquisar as versões de node disponíveis para instalação, pois aqui queremos instalar a versão 6.x, que é a versão estável e LTS. Se executarmos o seguinte comando

$ brew install node

Ele instalará a versão mais atual, que na data de escrita deste tutorial era a 7.x. Como queremos a versão 6.x, vamos pesquisar para ver se ela está disponível

$ brew search node
leafnode llnode node node-build node@0.10 node@0.12 node@4 node@5 node@6 nodebrew nodeenv nodenv
Caskroom/cask/mindnode-pro Caskroom/cask/node-profiler Caskroom/cask/nodebox Caskroom/cask/nodeclipse Caskroom/cask/printnode Caskroom/cask/soundnode

Como podemos ver no resultado da busca, temos a versão node@6, a qual iremos instalar.
O restante são outros pacotes do node que podemos instalar com o Brew e por hora vamos só ignorá-los. Logo

$ brew install node@6

Como essa não é a última versão do node, precisamos exportar o nosso bin para o nosso PATH porque o Brew não faz isso automaticamente

$ echo ‘export PATH=”/usr/local/opt/node@6/bin:$PATH”‘ >> ~/.bash_profile
$ source .bash_profile

Uma vantagem do Brew é que quando instalamos o node com ele, o npm será instalado também. Para verificar que tudo foi instalado corretamente vamos conferir as versões que foram instaladas (pode ser que você já tenha instalado uma versão mais atual)

$ node -v
v6.9.4
$ npm -v
3.10.10

É isso ai pessoal, bem simples não é? O Homebrew sempre facilita algumas coisas para nós. Tem alguma dúvida? Me deixe uma mensagem nos comentários. Até a próxima!
O post Instalando Node.js 6.x e npm no Mac OS X com Homebrew apareceu primeiro em Blog Locaweb – Notícias sobre tecnologia, programação e muito mais..

Instalando Node.js 6.x e npm no Mac OS X com Homebrew
Fonte: Locaweb

Na mesa do Chief – Entrevista com a Designer e Desenvolvedora Anyssa Ferreira do estúdio Haste Design

Na mesa do Chief – Entrevista com a Designer e Desenvolvedora Anyssa Ferreira do estúdio Haste Design

Eae! Td bele? Hoje tem hangout, hoje tem entrevista, hoje tem “Na mesa do Chief” :) Durante este mês de março, que é o mês onde temos o dia internacional da mulher, eu vou trazer para você uma série de vídeos com mulheres que atuam na área. E começamos essa série com um bate papo […]
O post Na mesa do Chief – Entrevista com a Designer e Desenvolvedora Anyssa Ferreira do estúdio Haste Design apareceu primeiro em Chief of Design.

Na mesa do Chief – Entrevista com a Designer e Desenvolvedora Anyssa Ferreira do estúdio Haste Design
Fonte: Chef of Design

6# ERROS que te impedem de fazer um Portfólio e travam a sua carreira!

6# ERROS que te impedem de fazer um Portfólio e travam a sua carreira!

Eae, td bele? Você tem um portfólio ou ainda não dedicou um tempo para criar o seu? Independente da resposta é muito provável que você tenha cometido, ou ainda comete, certos erros ao criar o seu portfólio. Existem certas coisas que prejudicam a gente e nos fazem adiar, e até mesmo desistir, de ter um portfólio. […]
O post 6# ERROS que te impedem de fazer um Portfólio e travam a sua carreira! apareceu primeiro em Chief of Design.

6# ERROS que te impedem de fazer um Portfólio e travam a sua carreira!
Fonte: Chef of Design

Conheça a arte do SOLID

Conheça a arte do SOLID

Quando escuto ou leio a palavra SOLID me vem logo o Snake, do game Metal Gear Solid na cabeça e isso acontece há muito tempo. Não sou nenhum fã do jogo, mas também não sou hater, apenas não joguei o suficiente para entrar em um dos lados da força.
Agora, voltando ao tal do SOLID – que não é jogo -, você já ouviu falar dele? Já o usou? Sabe para que serve? Neste artigo vamos fazer um overview e ver a melhor forma de usar esse cara…
Primeiro precisamos saber que SOLID é uma sigla para Single responsibility, Open-closed, Liskov substitution, Interface segregation and Dependency inversion.
Para facilitar, o SOLID é um acrônimo para os cinco primeiros princípios da programação orientada para objetos, nós buscamos segui-los para que um projeto seja realmente orientado a objetos e não um fruto da nossa linda e maravilhosa criatividade.
Vamos ver o que cada um desses princípios tratam; só para facilitar o entendimento dos conceitos, utilizaremos alguns exemplos em JAVA e outros em Ruby:
– Single Responsibility
O Single responsibility está ligado diretamente ao objetivo que a cada classe possui, sendo que uma classe deve ter sempre um único objetivo. Se o sistema está crescendo e uma classe passou a ter duas responsabilidades é hora de dividi-la em duas classes, cada uma com uma responsabilidade. Exemplo:
class Client
def save(args)
super
ExecuteDepencencies.execute(args[:dependencies])
end
end

class ExecuteDepencencies
def self.execute(dependencies)
dependencies.each do |dependency|
dependency[:module].execute(dependency[:arg])
end
end
end

class UploadFile
def self.execute(file)
#Do the upload
end
end

class Sendmail
def self.execute(email)
#Send email
end
end

Imagine um formulário de cadastro onde o usuário ao submeter os dados já faz o upload do arquivo anexo e envia um e-mail para o mesmo confirmando o cadastro. A responsabilidade de salvar ficou na classe do cliente enquanto fazer o upload e enviar o e-mail ficaram em classes separadas, podendo ser utilizados em outros lugares do sistema em que seja necessário novamente fazer o upload de um arquivo como no cadastro de produtos ou enviar um e-mail como no fechamento de uma compra.
– Open-closed
O princípio de aberto e fechado nos traz o conceito de que devemos sempre deixar nossas classes abertas para serem expandidas, porém fechadas para serem modificadas. Ou seja, você deve isolar a regra para que assim outras classes possam usar ela. Exemplo:
public class User {
public void executeRole(String role){
if(role == ‘Admin’){
// Do Something
}

if(role == ‘Client’){
// Do Something
}
}
}

No exemplo acima sempre que implementarmos alguma regra nova, por exemplo um Fornecedor (Provider), iremos colocar um if a mais no código e esses ifs tendem ao infinito.
A ideia do princípio é colocar a role em uma interface para retirar esses ifs. Exemplo:
public interface Role {
void executeRole(String role);
}

public class Admin implements Role {}
public class Client implements Role {}
public class Provider implements Role {}

Desta forma dentro das classes iremos implementar o método executeRole sem nenhum if, apenas executando o que cada um deveria fazer. A ideia nesse caso é que a interface Role seja pouco modificada (o ideal é que ela não seja modificada) e apenas a sua implementação nas classes que irão utilizá-la sejam alteradas conforme a necessidade da classe.
 
– Liskov substitution
Esse princípio está relacionado a herança e diz que se você tem um objeto B que herda A, em qualquer lugar que você tenha A você pode substituir por B sem precisar alterar o programa. Exemplo:
class Gadget
def call(number)
true
end
end

class Smartphone < Gadget
end

class Psp < Gadget
def call(number)
raise “This gadget do not make calls”
end
end

Basicamente temos uma classe Gadget e ela possui um método de call (ligar), sendo que Smartphone e PSP são Gadgets, logo herdam ela e trazem consigo o método call. Porém, o PSP não faz ligações, por isso mesmo faremos o método retornar uma exception. Com isso ferimos o princípio de Liskov.
Se tivéssemos uma instância de Gadget e a mesma fosse substituída por Smartphone funcionaria normalmente. O método call, ao invés de ter um retorno booleano, como o método da classe pai fazia, acaba retornando uma exception (claro que poderíamos fazer o método call no PSP, mas queria deixar dessa forma, como um exemplo).
 
– Interface segregation
O Princípio da Segregação de Interface trata da coesão de interfaces e diz que classes não devem ser forçadas a depender de métodos que não usam. Exemplo:
public interface Activity {
void buy(Order order);
}

public class ShopOwner implements Activity {}
public class Client implements Activity {}
public class Provider implements Activity {}

Esse exemplo está ferindo o princípio, pois o dono da loja pode comprar do fornecedor e o cliente comprar do dono da loja, mas o fornecedor não compra de ninguém e, nesse caso, você seria obrigado a implementar o método buy no fornecedor, mesmo o método não servindo para ele.
– Dependency inversion
O princípio de inversão de dependência nos diz que SE devemos acoplar alguma classe em outra, devemos fazer esse acoplamento em classes estáveis. De forma mais simples o princípio quer dizer:

Módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstrações.
Abstrações não devem depender de detalhes. Detalhes devem depender de abstrações.

Exemplo:
public interface ActionAfterBuy {
void execute(User user);
}

public class Cart implements ActionAfterBuy {}

Nesse exemplo o carrinho é um módulo de alto nível e o ActionAfterBuy (Ação depois de comprar) é uma abstração. Perceba que o ActionAfterBuy é uma classe estável, pelo fato de que ela pouco vai ser alterada ao longo do tempo (a ideia de classes estáveis é justamente essa, não alterá-la durante o ciclo de vida do software); além disso, ela não conhece detalhes de sua própria implementação.
Esse é apenas um resumo do que é o SOLID, caso queira se aprofundar no assunto, recomendo fortemente o livro “Orientação a Objetos e SOLID para ninjas” do Maurício Aniche. Outro bom artigo é o “The Principles of OOD”.

Gostou do que falamos? Ficou com alguma dúvida? Deixe nos comentários!
O post Conheça a arte do SOLID apareceu primeiro em Blog Locaweb – Notícias sobre tecnologia, programação e muito mais..

Conheça a arte do SOLID
Fonte: Locaweb