这些字符串数组用于分类传入提要/消息是驱动程序提要还是团队提要。
private static final String[] DRIVER_FEED_TYPES = {
"SEBASTIAN_VETTEL", "LEWIS_HAMILTON", "CHARLES_LECLERC", "MAX_VERSTAPPEN",
};
private static final String[] TEAM_FEED_TYPES = {
"FERRARI", "MERCEDES", "SAUBER", "REDBULL"
};
此方法通过传入消息获取提要的类型,并通过arrayContains
方法确定相应的类型。
private boolean isFeedEnabled(FormulaOneMessage formulaOneMessage) {
String feedType = formulaOneMessage.getFeedType();
if (Helper.arrayContains(DRIVER_FEED_TYPES, feedType)) {
return isDriverFeedEnabled();
} else if (Helper.arrayContains(TEAM_FEED_TYPES, feedType)) {
return isTeamFeedEnabled();
} else {
return false;
}
}
arrayContains
方法基本上是通过Object
数组查看对象是否存在。
public static boolean arrayContains(Object[] list, Object item) {
for (Object s : list) {
if (s.equals(item)){
return true;
}
}
return false;
}
所面临的挑战是如何管理类中越来越多的字符串数组类型。我应该把它做成地图、溪流还是灯笼?
另外,随着我继续添加更多的FEED_TYPES
,if else语句也会增加。我应该继续使用它们吗?
总的来说,我希望改进这段代码的可维护性,看到未来提要类型的数量将继续增长。
发布于 2018-09-11 07:43:05
当有意义时,应该使用Sets而不是数组和Enum。我会把它写成:
enum FeedClass {
TEAM, DRIVER, OTHER;
private static final Set<String> DRIVER_FEED_TYPES = new HashSet<>(Arrays.asList(
"SEBASTIAN_VETTEL", "LEWIS_HAMILTON", "CHARLES_LECLERC", "MAX_VERSTAPPEN"));
private static final Set<String> TEAM_FEED_TYPES = new HashSet<>(Arrays.asList(
"FERRARI", "MERCEDES", "SAUBER", "REDBULL"
));
public FeedClass fromType(String feedType) {
if (DRIVER_FEED_TYPES.contains(feedType)) {
return DRIVER;
} else if (TEAM_FEED_TYPES.contains(feedType)) {
return TEAM;
} else {
return OTHER;
}
}
}
private boolean isFeedEnabled(FormulaOneMessage formulaOneMessage) {
FeedType feedType = FeedClass.fromType(formulaOneMessage.getFeedType());
switch (feedType.getClazz()) {
case DRIVER:
return isDriverFeedEnabled();
case TEAM:
return isTeamFeedEnabled();
default:
return false;
}
}
驱动程序名称并不是真正需要硬编码的东西,您可能希望将其移到数据库或外部文件(S)。除非将if/switch
和isTeamFeedEnabled
移动到enum中,否则不能真正避免isFeedEnabled()
中的isDriverFeedEnabled
,在代码中可能不可能干净地这样做。
https://codereview.stackexchange.com/questions/203544
复制相似问题