Estou tentando aprender GRASP e achei isso explicado ( aqui na página 3 ) sobre acoplamento baixo e fiquei muito surpreso quando descobri isso:
Considere o método
addTrack
para umaAlbum
classe, dois métodos possíveis são:
addTrack( Track t )
e
addTrack( int no, String title, double duration )
Qual método reduz o acoplamento? O segundo, porque a classe que usa a classe Album não precisa conhecer uma classe Track. Em geral, os parâmetros dos métodos devem usar tipos de base (int, char ...) e classes dos pacotes java. *.
Eu tendem a discordar disso; Eu acredito que addTrack(Track t)
é melhor do que addTrack(int no, String title, double duration)
devido a várias razões:
É sempre melhor para um método o menor número possível de parâmetros (de acordo com o Código Limpo do tio Bob, nenhum ou um de preferência, 2 em alguns casos e 3 em casos especiais; mais de 3 precisam de refatoração - essas são, obviamente, recomendações, não regras de azevinho) .
Se
addTrack
é o método de uma interface, e os requisitos precisam que aTrack
deva ter mais informações (por exemplo, ano ou gênero), então a interface precisa ser alterada e, portanto, o método deve suportar outro parâmetro.O encapsulamento está quebrado; se
addTrack
estiver em uma interface, ele não deve conhecer os elementos internos do arquivoTrack
.Na verdade, é mais acoplado da segunda maneira, com muitos parâmetros. Suponha que o
no
parâmetro precise ser alterado deint
paralong
porque existem mais deMAX_INT
trilhas (ou por qualquer motivo); entãoTrack
o método e o método precisam ser alterados, enquanto se o método foraddTrack(Track track)
apenas oTrack
seria alterado.
Todos os quatro argumentos estão realmente conectados entre si, e alguns deles são consequências de outros.
Qual abordagem é melhor?