Я пытаюсь изучить GRASP, и я нашел это объяснение ( здесь на странице 3 ) о низком соединении, и я был очень удивлен, когда обнаружил следующее:
Рассмотрим метод
addTrack
дляAlbum
класса, два возможных метода:
addTrack( Track t )
и
addTrack( int no, String title, double duration )
Какой метод уменьшает сцепление? Второй делает, так как класс, использующий класс Album, не должен знать класс Track. В общем случае параметры методов должны использовать базовые типы (int, char ...) и классы из пакетов java. *.
Я склонен не соглашаться с этим; Я считаю, addTrack(Track t)
что лучше, чем addTrack(int no, String title, double duration)
по разным причинам:
Для метода всегда лучше использовать как можно меньше параметров (согласно «Чистому коду» дяди Боба ни один или один предпочтительно, 2 в некоторых случаях и 3 в особых случаях; более 3 требуют рефакторинга - это, конечно, рекомендации, а не правила Холли) ,
Если
addTrack
это метод интерфейса, а требованияTrack
должны иметь больше информации (скажем, год или жанр), то интерфейс необходимо изменить, чтобы метод поддерживал другой параметр.Инкапсуляция нарушена; если
addTrack
в интерфейсе, то он не должен знать внутренностиTrack
.Это на самом деле более связано вторым способом, со многими параметрами. Предположим, что
no
параметр необходимо изменить сint
на,long
потому что есть больше, чемMAX_INT
дорожки (или по любой причине); тогдаTrack
нужно изменить и метод, и метод, в то время как если бы метод был измененaddTrack(Track track)
только наTrack
.
Все 4 аргумента на самом деле связаны друг с другом, и некоторые из них являются следствием других.
Какой подход лучше?