У меня есть блок входящих данных (скажем, это объект 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
, я не могу придумать, как правильно подать результат одного экстрактора на вход для других экстракторов.
Есть ли общий тип для такой ситуации?