Professional Documents
Culture Documents
ArqDesignSoftware_BOOK.indb 47
12/11/2011 14:48:36
escrever todo o cdigo da aplicao dependente de uma deciso antecipada. Apesar disso, grande parte dos desenvolvedores opta por sempre utilizar ArrayList
desde o incio sem critrio algum.
Considere um DAO de funcionrios que pode listar o nome de todos que
trabalham em determinado turno, devolvendo um ArrayList com os nomes:
public class FuncionarioDao {
public ArrayList<String> buscaPorTurno(Turno turno) { ... }
}
12/11/2011 14:48:36
Receber precisamente ArrayList como argumento tem pouca utilidade; raramente necessitamos que uma coleo seja to especfica assim. Receber aqui um
List provavelmente baste para o nosso mtodo, e permite que o cdigo invocador
passe outras colees como argumento. Podemos ir alm e receber Collection
49
ArqDesignSoftware_BOOK.indb 49
12/11/2011 14:48:36
ou, ainda, Iterable, caso nossa necessidade seja apenas percorrer os elementos. A
escolha de Iterable, neste caso, permitiria o maior desacoplamento possvel, mas
limitaria o uso dentro do mtodo; no seria possvel, por exemplo, acessar a quantidade de elementos que essa coleo possui, nem os elementos de maneira aleatria
atravs de um ndice. Devemos procurar um balano entre o desacoplamento e a
necessidade do nosso cdigo. Esta a ideia do Princpio de Segregao de Interfaces:
clientes no devem ser forados a depender de interfaces que no usam.1
O desenvolvedor deve ter em mente que acoplar uma classe, que possui menos chances de alteraes em sua estrutura, com outra menos estvel pode ser
perigoso.2 Considere a interface List, que possui muitas razes para no mudar,
afinal, ela implementada por vrias outras classes; se sofresse alteraes, todas
as classes que a implementam teriam que ser alteradas tambm. Consideramos,
ento, que ela altamente estvel, o que significa que ela raramente obrigar uma
mudana nas classes que a utilizam (Figura 3.1).
Uma implementao de lista, MeuProprioArrayList, feita pelo desenvolvedor provavelmente mais instvel que a interface List, j que as foras que a im50
ArqDesignSoftware_BOOK.indb 50
12/11/2011 14:48:37
digo. Caso contrrio, esse mtodo poderia, e deveria, receber uma referncia a
InputStream, ficando mais flexvel e podendo receber os mais diferentes tipos de
streams, como argumento, que provavelmente no foram previamente imaginados.
Utilize sempre o tipo menos especfico possvel.
Repare que, muitas vezes, classes abstratas trabalham como interfaces, no
sentido conceitual de orientao a objetos.3 Classes abstratas possuem a vantagem
de se poder adicionar-lhes um novo mtodo no abstrato, sem quebrar o cdigo
51
ArqDesignSoftware_BOOK.indb 51
12/11/2011 14:48:38
Pode ser fcil enxergar as vantagens do uso das interfaces, mas bem mais
difcil comear a utiliz-las extensivamente no seu prprio domnio. O uso exagerado de reflection para invocar mtodos dependendo de algumas condies pode
ser muitas vezes substitudo por interfaces. Assim, a deciso de qual mtodo invocar deixada para a invocao virtual de mtodo que o polimorfismo promove,
52
ArqDesignSoftware_BOOK.indb 52
12/11/2011 14:48:38
Apesar de simples, existem seis possibilidades diferentes de execuo do mtodo, alm de ele misturar diversos comportamentos que no possuem relao,
isto , responsabilidades diferentes para uma nica classe: impostos, estoques,
transferncias e e-mails.
Tal comportamento pode ser composto por diversas partes menores e, para
tanto, refatoraes pequenas podem ser executadas. A mais simples seria a extrao de quatro mtodos, uma soluo que simplifica o cdigo atual, mas no
aumenta sua coeso.
53
ArqDesignSoftware_BOOK.indb 53
12/11/2011 14:48:38