Java - cloudfront.net

Propaganda
Como não escrever o
projeto lixo do futuro
A Ferramenta Ideal
uma questão de perspectiva
Ricardo
Valeriano
@sr_valeriano
github.com/ricardovaleriano
ruby, java, javascript, ios
Guilherme
Silveira
@guilhermecaelum
github.com/caelum
ruby, java, scala, machine learning em educação
http://caelum.com.br/online
Não é especificamente
sobre Ruby ¬¬
Não tem código ¬¬
Mentira, tem mas
pouquinho =)
Java é D+
Java
List<Categoria> categorias = new
ArrayList<Categoria>();
for(Produto p : produtos)
categorias.add(p.getCategoria());
for(int i=0;i<categorias.size();i++) {
Categoria c = categorias.get(i);
if(categorias.lastIndexOf(c)!=i) {
categorias.remove(c); i--;
}
}
double total = 0;
for(Produto p : produtos) {
total += p.getValor();
}
,
e
t
n
e s!
i
m
a
l
a
m
e
r de
é
Ruby é D+
Ruby
unicas = []
for produto in produtos
unless(unicas.include? produto.categoria)
unicas << produto.categoria
end
end
Ruby
unicas = produtos.map{|p| p.categoria}.uniq
total = produtos.inject(0){|tot, p| tot + p.valor}
Ruby
unicas = produtos.map(&:categoria).uniq
total = produtos.inject(0){|tot, p| tot + p.valor}
GORDO
Y U NO USE THA API?
Domine sua api
(sugestão para o bom programador)
Ruby
unicos = produtos.map(&:categoria).uniq
total
= produtos.map(&:valor).inject(:+)
Domine sua api
(sugestão para o bom programador)
Java
List<Categoria> categorias = new
ArrayList<Categoria>();
for(Produto p : produtos)
categorias.add(p.getCategoria());
for(int i=0;i<categorias.size();i++) {
Categoria c = categorias.get(i);
if(categorias.lastIndexOf(c)!=i) {
categorias.remove(c); i--;
}
}
double total = 0;
for(Produto p : produtos) {
total += p.getValor();
}
a
t
l
m
a
e
f
g
a na
m
a
u
c
p sa
e
d
Java
Set categorias = new HashSet();
for(Produto p : produtos) cat.add(p.categoria());
double total = 0;
for(Produto p : produtos) total += p.valor();
Ruby
unicos = produtos.map(&:categoria).uniq
,
e
total = produtos.map(&:valor).inject(:+)
t
n
e s!
i
m
a
l
a
m
e
e
r
d
Ruby é D+
é
Scala
produtos.map(_.categoria).unique
produtos.map(_.valor).sum
E
!
á
H
m
m
e
t
s
i
a
Scala
class Compra() {
lazy val produtos = Produtos.all
}
BONUS ROUND: public lazy!
class Compra(produtos:List[Produto]) {
}
class Compra(val produtos:List[Produto]) {
}
BONUS ROUND: IMUTAVEL!
class Compra(var produtos:List[Produto]) {
}
BONUS ROUND: public vars!
Scala rocks
#fato
Obrigado
The End.
Ricardo
Valeriano
@sr_valeriano
github.com/ricardovaleriano
ruby, java, javascript, ios
Guilherme
Silveira
@guilhermecaelum
github.com/caelum
ruby, java, scala, machine learning
O que buscamos em uma
linguagem?
Poder
o que posso fazer?
Expressividade
como posso fazer?
O que expressa mais,
de maneira mais breve?
PORTUGUÊS (PT-BR)
fato real:
ontem...
Usei o cartão de crédito da
minha mãe pois estava as
b
a
sem dinheiro.
íl
+
0
2
s
INGLÊS (EN-US)
OS GRINGOS DEVEM ESTAR
MORRENDO ESCUTANDO ESSE
INGLES DO VALERIANO
I’ve used my mom’s credit
s
card ‘cause I had no
a
b
a
money.
íl
+
7
1
s
MANÊS?
Súmemo jão. Mó perreio!
Utilizei do cartão da
senhora minha mãe, certo?
Prá adquirir uns bens, na
humildade mêmo, tá
ligado?
COREANO
A PRIMEIRA VISTA, QUAL VOCÊ PREFERE?
돈 없어서 엄마 카드
<
<
<
썼다.
L
A
s
a
M
b
R
a
O
F síl
>
>
> 12
Expressividade
엄카 썼다.
s
a
o
b
d
í
a
l ru
í
s
4 em
s
e
Coreano
menos palavras
mais expressividade
mais poder
LET’S ALL LEARN
KOREAN NOOOOOW!
안녕~ 집에 갈래?
‘A medida que diminuem
as palavras, aumenta a
ambiguidade’
José Valim @ GuruSP
Então... o que queremos
afinal?
MAIS poder
MAIS expressividade
MAIS concisão
‘you can accomplish more
in smaller yet readable
code’
Matz (on Ruby)
Não é só escrever
menos
Talvez o código mais
simples, seja melhor.
‘Simplicity Ain't Easy’
Stuart Halloway
Ruby
class Complaint
def has_category?
@product.category
end
end
Ruby
class Complaint
def has_category?
@product && @product.category
end
end
Ruby
class Complaint
def has_category?
@product.andand.category
end
end
Ruby
class Complaint
def has_category?
!!(@product && @product.category)
end
end
Ruby
class Complaint
def has_category?
[email protected]
end
end
andand?
@product.andand.category
Zoado né?
‘i don’t need more random
boolean conditional constructs
because thats
not what is
!
o
improvingrour
i
e
code aquality’
d o!
s
d
l
evan
phoenix
r
a
e
V
E
F
Ruby
produtos.map(&:categoria).uniq
produto.andand.categoria
produto.map(&:categoria)
não é
um random boolean conditional
é o básico de uma
mônada de funcional
products.map(_.category) (0 ou +)
product.map(_.category) (0 ou 1)
Quem ganha? Ninguém.
os dois estão certos!
um no imperativo, outro no funcional.
Contexto
Poder,
Expressividade,
Concisão
são contextuais
‘humans require
more sophisticated tools
to program’
Matz
Quem acha a sua
linguagem perfeita?
As ferramentas
mudam com o
tempo, elas evoluem.
Linguagens e
escolhas possuem
desvantagens. #fato
(re) Conheça bem as
desvantagens.
(sugestão para o bom programador)
(re) Conheça bem as
desvantagens.
(sugestão para o bom programador)
Para evitar abusar
delas.
(sugestão para o bom programador)
MySQL
Neo4J
as queue
as crud storage
resumindo
O mais importante
em um projeto é
escrever código
bonito.
O mais importante
em um projeto é
escrever código
bom.
?
+ código?
O que não
queremos?
def _read_attribute(attr_name)
attr_name = attr_name.to_s
attr_name = self.class.primary_key if attr_name == 'id'
value = @attributes[attr_name]
unless value.nil?
if column = column_for_attribute(attr_name)
if unserializable_attribute?(attr_name, column)
unserialize_attribute(attr_name)
else
column.type_cast(value)
end
else
value
end
end
end
fonte pequena?
def _read_attribute(attr_name)
attr_name = attr_name.to_s
attr_name = self.class.primary_key if attr_name == 'id'
value = @attributes[attr_name]
unless value.nil?
if column = column_for_attribute(attr_name)
if unserializable_attribute?(attr_name, column)
unserialize_attribute(attr_name)
else
column.type_cast(value)
end
else
value
end
end
end
agora sim? fonte 16
for_att
ribute(
attr_na
agora sim? fonte mil
mas
eese...
mas
se...
mas
e
se...
mas
e
se...
mas
e
mas ese...
se...
def _read_attribute(attr_name)
attr_name = attr_name.to_s
attr_name = self.class.primary_key if attr_name == 'id'
value = @attributes[attr_name]
unless value.nil?
if column = column_for_attribute(attr_name)
if unserializable_attribute?(attr_name, column)
unserialize_attribute(attr_name)
else
column.type_cast(value)
end
else
value
end
end
end
23...
Conciso?
Ruby?
C++?
Java?
Scala?
Muito if?Basic?
C#?
JavaScript?
A nova linguagem do mês?
Nova
Linguagem
novo uso idiomático
novo mindset
LET’S USE SCALA
FOR ALL THE THINGS!
Para evitar abusar
das desvantagens.
(sugestão para o bom programador)
scala
para crud
Nova
Linguagem
novo uso idiomático
novo mindset
mesmos erros
‘o teu “overuse” é muito bom
prá você mas a desgraça dos
outros’
Jay Fields
Quem está há
mais de 2 anos no
mesmo projeto?
‘pfvr néam? amanhã você
vai sair do
projeto!’
Random Scumbag
Seja o principal
crítico de suas
escolhas
(sugestão para o bom programador)
É IRADO, É DEZ
‘Quando quebra o projeto em vários,
fica mais fácil de ver que para uma
parte do projeto
uma
linguagem é
mais
interessante’
Alberto (oderski) Souza
require "sinatra"
require "json"
interestie
Sequel.connect ENV["DATABASE_URL"]
require "interest"
get "/" do
interest = Interest.new params[:interest]
interest.save ? ok_response params : error_response params
end
def ok_response(params)
respond_with params
end
def error_response(params)
respond_with(params, {
errors:["unable to set up interest"]
})
end
def respond_with(params, json_data = {ok:"ok"})
"#{params["callback"]}(#{json_data.to_json})"
end
Projetos pequenos
múltiplos projetos
Não escolha sempre
a sua linguagem
preferida.
(sugestão para o bom programador)
Quando não usar o Rails?
Quem melhor que o José Valim para dizer?
Caelum Online
(online.caelum.com.br)
Baseado nisso
mysql
alumni.caelum.com.br
RoR
alunos
java + vraptor
solr
ondetrabalhar.com
ruby
+ projetos
postgresql
promo
RoR
redis
analisador 1
sinatra
sinatra + sequel
sinatra + sequel
exercícios
RoR
postgresql
mountable engine
RoR
aws tickets
RoR
java
scala + vraptor
interestie
postgresql
postgresql
gnarus
java
java + RoR
redis
sugest
mysql
pagamentos
casa do código
scala + play
java + octave
mysql
mysql
+ 1 projeto
métricas
mysql
postgresql
postgresql
analisador 2
+ 6 projetos
java
+ 1 ‘página’
RoR postgresql
js
Baseado nisso
mysql
alumni.caelum.com.br
RoR
alunos
java + vraptor
solr
ondetrabalhar.com
ruby
+ projetos
postgresql
promo
RoR
redis
analisador 1
sinatra
sinatra + sequel
sinatra + sequel
exercícios
RoR
postgresql
mountable engine
RoR
aws tickets
RoR
java
scala + vraptor
interestie
postgresql
postgresql
gnarus
java
java + RoR
redis
sugest
mysql
pagamentos
casa do código
scala + play
java + octave
mysql
mysql
+ 1 projeto
métricas
mysql
postgresql
postgresql
analisador 2
+ 6 projetos
java
+ 1 ‘página’
RoR postgresql
js
Baseado nisso
mysql
alumni.caelum.com.br
RoR
alunos
java + vraptor
solr
ondetrabalhar.com
ruby
+ projetos
postgresql
promo
RoR
redis
analisador 1
sinatra
sinatra + sequel
sinatra + sequel
exercícios
RoR
postgresql
mountable engine
RoR
aws tickets
RoR
java
java + vraptor
interestie
postgresql
postgresql
gnarus
java
java + RoR
redis
sugest
mysql
pagamentos
casa do código
scala + play
java + octave
mysql
mysql
+ 1 projeto
métricas
mysql
postgresql
postgresql
analisador 2
+ 6 projetos
java
+ 1 ‘página’
RoR postgresql
js
Reparou?
mysql
alumni.caelum.com.br
RoR
alunos
java + vraptor
solr
ondetrabalhar.com
ruby
+ projetos
postgresql
promo
RoR
redis
analisador 1
sinatra
sinatra + sequel
sinatra + sequel
exercícios
RoR
postgresql
mountable engine
RoR
aws tickets
RoR
java
java + vraptor
interestie
postgresql
postgresql
gnarus
java
java + RoR
redis
sugest
mysql
pagamentos
casa do código
scala + play
java + octave
mysql
mysql
+ 1 projeto
métricas
mysql
postgresql
postgresql
analisador 2
+ 6 projetos
java
+ 1 ‘página’
RoR postgresql
js
RESUMINDO
(de verdade)
Domine sua linguagem
(sugestão para o bom programador)
Domine sua linguagem
api/framework a ponto
de criticar os pontos
negativos
(sugestão para o bom programador)
Domine outras
linguagens...
TANTO quanto.
(sugestão para o bom programador)
Todas as linguagens são marotas *
Contexto
Pessoa
Momento
* salvo brain f#ck
Domine suas escolhas
para não ser dominado
por elas.
(sugestão para o bom programador)
Domine suas escolhas
para não ser dominado
por elas.
(sugestão para o bom programador)
Obrigado!
@guilhermecaelum
@sr_valeriano
www.rubyonrailsonline.com.br
Download