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
addTrackpara umaAlbumclasse, 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 aTrackdeva 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
addTrackestiver 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
noparâmetro precise ser alterado deintparalongporque existem mais deMAX_INTtrilhas (ou por qualquer motivo); entãoTracko método e o método precisam ser alterados, enquanto se o método foraddTrack(Track track)apenas oTrackseria alterado.
Todos os quatro argumentos estão realmente conectados entre si, e alguns deles são consequências de outros.
Qual abordagem é melhor?