gpt4 book ai didi

iphone - 我想使用多态性对我的难闻代码进行重构。这是一个删除 'if' 语句的问题

转载 作者:行者123 更新时间:2023-11-28 23:04:57 24 4
gpt4 key购买 nike

我是一名 iOS 应用开发者。在删除代码中的难闻气味时,我遇到了一些重构问题。是这样的。

我的项目使用了 XML 数据,

<resource>
<item type='textbox' ... />
<item type='checkbox' ... />
<item type='selectbox' ... />
</resource>

我通过这段代码使用它。

Item *item = nil;
for (Element *itemElement in resourceChilds)
{
...
if ([[itemElement valueForAttributeNamed:@"type"] isEqualToString:@"textbox"])
{
item = [[Textbox alloc] initWithProperty:itemAttributes];
...
}
else if ([[itemElement valueForAttributeNamed:@"type"] isEqualToString:@"checkbox"])
{
item = [[Checkbox alloc] initWithProperty:itemAttributes];
...
}
else if ([[itemElement valueForAttributeNamed:@"type"] isEqualToString:@"selectbox"])
{
item = [[Selectbox alloc] initWithProperty:itemAttributes];
...
}
...
}

'Item' 类是 'Textbox'、'Checkbox' 和 'Selectbox' 类的父类(super class)。

'itemAttributes' 对象是 NSDictionary 的一个实例。

正如您在上面通过“initWithProperty:itemAttributes”看到的,我已经将“type”属性值赋给了一个“Item”实例。我认为可以在“Item”实例中使用此信息将其专门用于文本框或复选框或选择框。

有什么方法可以删除这些“if”语句并对其进行重构吗?欢迎任何建议。非常感谢您为此付出宝贵的时间。

谢谢,

马可

最佳答案

@anticyclope 的建议很有帮助。您不一定需要摆脱 ifs,但可以使代码更简单。以下是您应该做的一些事情:

  1. 将 for 循环中的代码提取到它自己的方法中,类似于 itemForItemElement:

  2. 创建一个 itemClassForItemElementType: 方法。该方法将大大简化itemForItemElement:的实现,但仍然使用ifs。

  3. 可选择更新 itemClassForItemElementType: 以使用 NSDictionary 返回类。这不是必需的,但如果您希望映射是动态的,那么您可能会这样做,假设您在外部文件中创建一个映射。在这里,您将使用@anticyclope 链接中建议的代码。

如果您在多个地方复制逻辑,则应避免使用 if 链,但如果您只执行一次,则情况还不错。

确保对所有这些更改进行单元测试。

关于iphone - 我想使用多态性对我的难闻代码进行重构。这是一个删除 'if' 语句的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9493938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com