Вы находитесь на странице: 1из 5

03/05/2019 Exercícios calistênicos para objetos - Blog Locaweb – Notícias sobre tecnologia, programação e muito mais.

 
 
 

Exercícios calistênicos para objetos


24 de junho de 2009 em Tecnologia.

Calistenia é uma forma de atividade que consiste em uma variedade de exercícios físicos feitos
sem equipamentos ou pesos que têm por objetivo aumentar a força e a exibilidade usando o peso
do próprio corpo como resistência.

Crianças praticando Calistenia em 1943

Jeff Bay, desenvolvedor de sistemas da ThoughtWorks, escreveu um artigo muito interessante no


livro “The ThoughtWorks Antology” entitulado “Object Calisthenics” onde ele propõe um
exercício “calistênico” para melhorar o design de software e ajudar a internalizar princípios de bom
design de programação orientada a objetos.

O exercício consiste em escrever um programa pequeno, de umas 1.000 linhas, seguindo 9 regras
bem rígidas:

1. Use apenas um nível de identação por método. O objetivo aqui é garantir que cada método
faça apenas uma coisa. Assim facilitamos a leitura e facilidade de manutenção do código.
Exemplo:

class Board {
...
String board() {
StringBuffer buf = new StringBuffer();
for(int i = 0; i < 10; i++) {
for(int j = 0; j < 10; j++)
buf.append(data[i][j]);
buf.append("\n" );
http://blog.locaweb.com.br/artigos/tecnologia/exercicios-calistenicos-para-objetos/ 1/10
03/05/2019 Exercícios calistênicos para objetos - Blog Locaweb – Notícias sobre tecnologia, programação e muito mais.

}
return buf.toString();
}
}
Class Board {
...
String board() {
StringBuffer buf = new StringBuffer();
collectRows(buf);
Return buf.toString();
}
Void collectRows(StringBuffer buf) {
For(int I = 0; I < 10; i++)
collectRow(buf, i);
}
Void collectRow(StringBuffer buf, int row) {
For(int I = 0; I < 10; i++)
Buf.append(data[row][i]);
buf.append("\n" );
}
}

2. Não use else. Aqui iremos evitar aquelas construções de vários ifs e elses um dentro do
outro, que também dificultam bastante a leitura do código. Exemplo:

public static void endMe() {


if (status == DONE) {
doSomething();
} else {
}
}

public static void endMe() {


if (status == DONE) {
doSomething();
return;
}
}

Outro exemplo:

public static Node head() {


if (isAdvancing()) { return first; }
else { return last; }
}
public static Node head() {
return isAdvancing() ? first : last;
}

3. Crie objetos para tipos primitivos e strings. Se um determinado método espara um ano como
parâmetro, crie um objeto chamado ano. Um int por si só é apenas um escalar sem

http://blog.locaweb.com.br/artigos/tecnologia/exercicios-calistenicos-para-objetos/ 2/10
03/05/2019 Exercícios calistênicos para objetos - Blog Locaweb – Notícias sobre tecnologia, programação e muito mais.

significado. Um objeto, mesmo que seja bem pequeno, irá dar ao compilador e ao
programador mais informação sobre o valor e por quê ele está sendo usado.
4. Use apenas um ponto por linha. Com muitos pontos na mesma linha às vezes fica difícil saber
que objeto é responsável por qual atividade. Pense da seguinte forma: você pode brincar com
seus brincados, com os brinquedos que você faz, com os brinquedos que deram para você.
Contudo, você nunca deve brincar com os brinquedos do seu brinquedo. Exemplo:

class Board {
...

class Piece {
...
String representation;
}
class Location {
...
Piece current;
}
String boardRepresentation() {
StringBuffer buf = new StringBuffer();
for(Location l : squares())
buf.append(l.current.representation.substring(0, 1));
return buf.toString();
}
}

class Board {
...

class Piece {
...
private String representation;
String character() {
return representation.substring(0, 1);
}
void addTo(StringBuffer buf) {
buf.append(character());
}
}
class Location {
...
private Piece current;
void addTo(StringBuffer buf) {
current.addTo(buf);
}
}

String boardRepresentation() {
StringBuffer buf = new StringBuffer();
for(Location l : squares())
l.addTo(buf);
return buf.toString();
}
}

http://blog.locaweb.com.br/artigos/tecnologia/exercicios-calistenicos-para-objetos/ 3/10
03/05/2019 Exercícios calistênicos para objetos - Blog Locaweb – Notícias sobre tecnologia, programação e muito mais.

Note que, apesar de os detalhes da implementação carem mais difusos e dar a impressão de
que é mais difícil ler esse código, você acaba de criar um método com um nome claro para
transformar uma peça em um caracter. Os nomes dos métodos devem servir como comentários,
o que facilita a leitura e a manutenção do código.

5. Não abrevie. É muito tentador abreviar nomes de classes, objetos e variáveis. Resista à
tentação. Abreviações dificultam o entendimento do código. Procure manter os nomes com
apenas uma ou duas palavras, e evite nomes que duplicam contexto. Por exemplo, na classe
Order o método de envio não precisa se chamar shipOrder(). Chamando o método apenas
de ship(), você terá chamadas como order.ship(), mais fáceis de ler do que
order.orderShip().
6. Mantenha todas as entidades pequenas.
pequenas Isso significa que nenhuma classe pode ter mais do
que 50 linhas. Classes como mais de 50 linhas muito provavelmente fazem mais do que uma
coisa, o que as deixa mais difíceis de ler e reutilizar.
7. Não use classes com mais de duas variáveis instanciadas. A maioria das classes deveria ser
responsável por manipular uma instância de uma variável, no máximo duas. Adicionar mais
instâncias de uma variável a uma classe diminui a coesão da classe. Programando com essa
regra em mente você irá perceber que existem dois tipos de classes, as que mantém o estado
de uma instância de uma variável e as que coordenam duas variáveis separadas. Procure não
misturar as duas responsabilidades na mesma classe. Exemplo:

String first;
String middle;
String last;
}

Esse código pode ser decomposto nas classes abaixo:

class Name {
Surname family;
GivenNames given;
}

class Surname {
String family;
}

class GivenNames {
List names;
}

Decompor um conjunto de atributos numa hierarquia de objetos que colaboram entre si nos
conduz a um modelo de objetos mais efetivo. No código acima separamos o Surname,
frequentemente usado para busca de nomes, dos GivenNames, que foi transformado em uma
lista de strings para acomodar pessoas com nomes compostos ou com mais nomes que só
primeiro nome, nome do meio e último nome.

8. Não use coleções de primeira-classe. A aplicação dessa regra é simples: qualquer classe que
contenha uma coleção não deve conter outras variáveis. Cada coleção pertencerá à sua
http://blog.locaweb.com.br/artigos/tecnologia/exercicios-calistenicos-para-objetos/ 4/10
03/05/2019 Exercícios calistênicos para objetos - Blog Locaweb – Notícias sobre tecnologia, programação e muito mais.

própria classe, assim os comportamentos relacionados a essa coleção terão um lugar. Uma
coleção é uma variável primitiva muito útil. Tem vários comportamentos mas poucas dicas
semânticas para facilitar a manutenção do código.
9. Não use Getters/Setters/Properties. A última frase da regra anterior leva quase que
diretamente à essa última regra. Se os seus objetos estão encapsulando o conjunto
apropriado de instâncias de variáveis mas seu design ainda parece estranho, é hora de
examinar mais algumas violações diretas ao encapsulamento. O comportamento não irá
seguir a instância de variável se puder simplesmente perguntar pelo valor no lugar atual. Essa
regra é às vezes enunciada como “Diga, não pergunte”.

Oito dessas nove regras são formas de visualizar e implementar o Santo Graal da programação
orientada a objetos, o encapsulamento de dados. Além disso, uma das regras direciona para uso
apropriado do polimor smo (não usar else e minimizar lógica condicional) e outra é uma
estratégia de nomenclatura que força uma nomeação de forma concisa e clara.

Lembre-se que isso é apenas um exercício. É provável que você se depare com situações em que
uma regra contradiz a outra, ou mesmo que você se depare com pedaços de códigos que
parecerão estranhos. Contudo, experimente escrever umas 1.000 linhas de código usando todas
essas regras. Você se verá quebrando velhos hábitos. E ao reler esse código ou passar para outro
programador o ler, verá quão mais fácil é sua leitura e manutenção.

O autor termina o texto dizendo que apesar de algumas pessoas acharem que essas regras seriam
impossíveis de se aplicar num projeto real, antes de escrever esse artigo ele tinha acabado de
trabalhar num sistema com mais de 100.000 linhas de código nesse estilo. Todos os
programadores envolvidos nesse projeto perceberam quão mais fácil é trabalhar em
desenvolvimento quando se abraça a simplicidade extrema.

Por Joaquim Torres     

VOCÊ TAMBÉM PODE GOSTAR

http://blog.locaweb.com.br/artigos/tecnologia/exercicios-calistenicos-para-objetos/ 5/10

Вам также может понравиться