Хотя Sjoerd и JB выставляют правильные баллы, в зависимости от того, как вы используете SearchCommand, я бы привел следующий аргумент для второго примера. Если операции, которые вы определяете в первом примере, не влияют на поведение UserSearchCommand, то, определив getFirstName () и т. Д., Вы на самом деле просто дублируете код, что может привести к проблемам с удобством обслуживания, например, что если позже вы добавите середину имя для класса пользователя? Тогда вам нужно не только добавить его к пользователю, но также и метод доступа в UserSearchCommand. Если что-то для пользователя изменило бы поведение поиска, то это могло бы быть допустимым аргументом, чтобы вызывающий пользователь имел доступ к пользователю через команду поиска, но этого также можно достичь с помощью механизма, такого как PropertyListeners.
Как вы указали, первый пример - это смешение информации и, на мой взгляд, кажется нелогичным с точки зрения ООП. Если речь идет об ограничении доступа к некоторым свойствам для Пользователя, то это может быть вопрос изменения модификаторов доступа или создания интерфейса, который раскрывает то, что вы считаете безопасным, и класса реализации, который предоставляет соответствующие свойства пакета / защищенных свойств. Если ваш UserSearchCommand не является неправильным, я ожидал бы, что он выполнит операции, включающие поиск пользователей, а затем сделает их доступными как единое целое (а не отдельные свойства пользователя). То есть команда поиска должна выполнять операции, связанные с поиском, а пользователь должен содержать информацию о пользователе.
Конечно, это стилистический вопрос, но я бы отдал свой голос за ваш второй пример.