@galliard

Как избежать глаголов в наименовании классов?

Я всегда считал, и до сих пор считаю, что класс описывает некоторую сущность, поэтому не может иметь в названии глагол. И вот столкнулся с ситуацией, когда мне "необходимо" именовать класс глаголом. Ну то есть не то чтоб прям так уж необходимо, просто иного решения я придумать так и не смог, поэтому решил написать сюда, вдруг кто что дельное предложит.

Суть вот в чем: есть некий класс DTO-классов, описывающих наборы данных для определенного действия в будущем. Например, CreateUserData, ну то есть набор данных для создания юзера. При этом операций над юзером добрый десяток, и для каждой нужен свой определенный набор данных, поэтому обобщать до UserData я не могу. Ну ок, в случае создания я могу назвать его NewUserData, а если нужно редактирование? Или изменение роли? RoleUserData опять же слишком абстрактно, это может быть создание/изменение/удаление роли, и опять придется добавлять глагол для понятности.

И да, формирование данных и собственно действие над ними находится на разных слоях абстракции, поэтому просто передать нужный набор данных в виде аргументов в метод я не могу, нужен именно класс.
  • Вопрос задан
  • 124 просмотра
Решения вопроса 1
Vapaamies
@Vapaamies
Разработчик языка Кантор
В комбинации CreateUserData — «данные о создании пользователя» — Create — не глагол, а причастие. Английский — язык аналитический, грамматические конструкции выражаются порядком слов. Переводите на русский для проверки, и будет вам счастье.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
GavriKos
@GavriKos
Конкретно про ваши примеры:
- UserDataCreator
- UserDataEditor

Добавлять глагол можно еще и вот так:
- UserDataRemoveController, UserDataChangeRoleController
Контроллер не лучший пример, но суть понятна, я дума.
Ответ написан
@heahoh
Full stackoverflow developer
Почему бы и нет, если DTO определяется действием, которое будет выполнять какой-нибудь сервис. Думаю спейс конкретного модуля будет достаточно предметно описывать его применение, например:
namespace Exchange\Github\DTO\Request\User\Create;
namespace Exchange\Github\DTO\Request\User\Role\Change;

и т.п. и использовать алиасы, если уже название конретной DTO вызывает смущение
use Exchange\Github\DTO\Request\User\Create as UserCreateDTO;


бтв, если я правильно понял, вы опускаете само словосочитание DTO из класса, поэтому возникает ощущение не объекта, а действия, которое он выполняет, однако DataTransferObject по прежнему участвует в названии класса и само за себя говорит - это класс передачи данных (с какой-то конкретной реализацией)
Ответ написан
vt4a2h
@vt4a2h
Senior software engineer (C++/Qt/boost)
Я вижу несколько подходов:
1) Просто добавлять суффикс Data. На мой взгляд, не слишком описательно и довольно-таки общо.
2) Название данных + операция. Например UserCreate, UserQuery, UserStatus и т.д. Но это не описывает сущность как класс данных.
3) Комбинированный вариант: название + операция + идентификационный суффикс. Что-то вроде UserCreateData. По-моему, это выглядит наиболее приемлемо.
Ответ написан
@ivorobioff
Software Engineer
Я считаю такое название классов нормальным UserDataForCreate, UserDataForEdit, CarForCrash, CarForDriveDrunk и так далее
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
OS33 Нижний Новгород
от 120 000 до 150 000 руб.
A3 Payment Москва
от 70 000 до 120 000 руб.
Хоум Пицца Екатеринбург
До 50 000 руб.
17 янв. 2019, в 18:21
1000 руб./за проект
17 янв. 2019, в 18:20
500 руб./за проект
17 янв. 2019, в 18:06
5000 руб./за проект