Шаблон проектирования для извлечения возможно взаимозависимых полей из исходных данных - PullRequest
0 голосов
/ 06 мая 2019

У меня есть блок входящих данных (скажем, это объект JSON), и мне нужно извлечь некоторые поля, используя эти необработанные данные.Например, в псевдокоде:

int user_id_field = data['user_id'] as int;
string user_name_field = data['user_name'] as string;

Однако некоторые поля являются более сложными и фактически зависят от других полей.Например, следуя приведенному выше фрагменту кода:

// async operation
UserProfile user_profile = await db.get_user_profile(user_id_field);

string user_locale_field = user_profile.get_locale();
int user_age_field = user_profile.get_age();

Я попытался модульно проектировать, поместив логику извлечения для каждого поля в свой собственный класс, чтобы я мог сделать что-то вроде:

interface Extractor<T> {
    public static async T extract(JSON data);
}

class UserIdExtractor extends Extractor<int> { ... }
...

fields = await all (
    UserIdExtractor::extract(data),
    UserNameExtractor::extract(data),
    UserLocaleExtractor::extract(data),
    UserAgeExtractor::extract(data),
);

Однако это приведет к повторному вычислению профиля пользователя как в UserLocaleExtractor, так и в UserAgeExtractor.Даже если я добавлю дополнительный UserProfileExtractor, я не могу придумать, как правильно подать результат одного экстрактора на вход для других экстракторов.

Есть ли общий тип для такой ситуации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...