如何简化状态依赖 getter,最好是以 SOLID 方式?
How would one simplify a state dependent getter, preferrably in a SOLID manner?
我有一个使用类型的 Angular 组件,在一种情况下获取一个数据而在另一种情况下获取另一个数据的易于阅读的解决方案是什么?
该组件也可以分为两个组件,phone 组件和电子邮件组件,但大多数逻辑虽然很小,但会重复。
var getContactInfo, hasContactInfo;
if(type === 'email') {
getContactInfo = function (profile) { return profile.getEmail()};
hasContactInfo = function (profile) { return profile.hasEmail()};
} else if(scope.type === 'phone') {
getContactInfo = function (profile) { return profile.getPhone()};
hasContactInfo = function (profile) { return profile.hasPhone()};
}
我可能会根据类型使用对象映射方法:
const buildContactInfo = (getContactInfo, hasContactInfo) => ({ getContactInfo, hasContactInfo });
const contactInfoByType = {
email: buildContactInfo((profile) => profile.getEmail(), (profile) => profile.hasEmail()),
phone: buildContactInfo((profile) => profile.getPhone(), (profile) => profile.hasPhone())
};
然后,调用时:
const contactInfo = contactInfoByType[type];
if (!contactInfo) {
throw new Error(`No contact info matched type '${type}'`);
} else {
contactInfo.hasContactInfo(profile);
contactInfo.getContactInfo(profile);
}
我有一个使用类型的 Angular 组件,在一种情况下获取一个数据而在另一种情况下获取另一个数据的易于阅读的解决方案是什么?
该组件也可以分为两个组件,phone 组件和电子邮件组件,但大多数逻辑虽然很小,但会重复。
var getContactInfo, hasContactInfo;
if(type === 'email') {
getContactInfo = function (profile) { return profile.getEmail()};
hasContactInfo = function (profile) { return profile.hasEmail()};
} else if(scope.type === 'phone') {
getContactInfo = function (profile) { return profile.getPhone()};
hasContactInfo = function (profile) { return profile.hasPhone()};
}
我可能会根据类型使用对象映射方法:
const buildContactInfo = (getContactInfo, hasContactInfo) => ({ getContactInfo, hasContactInfo });
const contactInfoByType = {
email: buildContactInfo((profile) => profile.getEmail(), (profile) => profile.hasEmail()),
phone: buildContactInfo((profile) => profile.getPhone(), (profile) => profile.hasPhone())
};
然后,调用时:
const contactInfo = contactInfoByType[type];
if (!contactInfo) {
throw new Error(`No contact info matched type '${type}'`);
} else {
contactInfo.hasContactInfo(profile);
contactInfo.getContactInfo(profile);
}