Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 这是一种糟糕的编程风格吗?_Ios_Objective C - Fatal编程技术网

Ios 这是一种糟糕的编程风格吗?

Ios 这是一种糟糕的编程风格吗?,ios,objective-c,Ios,Objective C,要检查标签是否包含英语或德语的特定字符串,我使用以下代码检查它是否包含,如果包含,我更新图像: - (void)checkIfInstructionContainsString{ if ([stepLabelTop.text containsString: @"left"] || [stepLabelTop.text containsString:@"Links"]) { navigationInstructionImage.image = [UIImage imageN

要检查标签是否包含英语或德语的特定字符串,我使用以下代码检查它是否包含,如果包含,我更新图像:

- (void)checkIfInstructionContainsString{
    if ([stepLabelTop.text containsString: @"left"] || [stepLabelTop.text containsString:@"Links"]) {
        navigationInstructionImage.image = [UIImage imageNamed:@"turn_left"];
    }
if ([stepLabelTop.text containsString: @"right"] || [stepLabelTop.text containsString:@"Rechts"]) {
        navigationInstructionImage.image = [UIImage imageNamed:@"turn_right.png"];
    }
if ([stepLabelTop.text containsString: @"up"] || [stepLabelTop.text containsString:@"Hoch"]) {
        navigationInstructionImage.image = [UIImage imageNamed:@"up.png"];
    }
...
}
updateInfo方法中,我在最后调用它

   [self checkIfInstructionContainsString];

为什么这么糟糕?直接将其写入更新信息方法是否更好?

将逻辑提取到单独的方法中并不一定是坏的编程风格(通常这甚至被认为是好的编程风格)

但是,您发布的代码可能会出现其他问题:

  • i18n:(UI)标签用于显示内容。这意味着它们是(或至少应该是)本地化的。现在,假设您添加了一个法语翻译。你得在支票上加上法语单词
  • 多个逻辑分支/执行顺序:考虑如果文本是
    @“左上”
    ;-)会发生什么情况
  • 字符串很昂贵:这有点技术性,但使用字符串并不是最便宜的。在性能方面,检查int或enum要便宜得多
我假设在
updateInformations
方法中有某种模型对象。如果所述模型对象包含有关步骤的信息(例如枚举),则可以使用如下代码:

/->模型使用的枚举的定义
typedef NS_ENUM(NSInteger,MyStep){
我走了,
没错,
迈步前进,
迈步
};
//您的“UpdateInformation”方法
-(作废)更新信息{
MyModel*模型=/*…*/;
// ...
self.navigationInstructionImage.image=[self-imageForStep:model.step];
// ...
}
-(UIImage*)imageForStep:(MyStep)步骤{
开关(步骤){
case MyStepLeft:return[UIImage ImageName:@“左转”];
case MyStepRight:return[UIImage ImageName:@“turn_right.png”];
case mystepp:return[UIImage ImageName:@“up.png”];
case MyStepDown:return[UIImage ImageName:@“down.png”];
默认值:返回零;
}
}


注意:这只是我的方法。当然还有其他方法可以达到同样的效果,也被认为是很好的编程风格。

有很多方法可以使这种方式更干净、更好。但这里有两个快速解决的问题:

  • 基于UI元素进行决策几乎总是一种糟糕的做法

  • 您可以将其作为提取逻辑的函数:

  • 然后像这样称呼它:

        navigationInstructionImage.image = [UIImage imageNamed: [self imageForInstruction:stepLabelTop.text]]; // <- Here you should NOT pass `stepLabelTop.text`. Instead, try to send the corresponding data model.
    

    navigationInstructionImage.image=[UIImage ImageName:[self-imageForInstruction:stepLabelTop.text]];//如果在步骤标签中找到“right”或“up”,是否确实要将图像设置为“turn_left”?它只是用来显示一些代码的。。更新..我更愿意使用额外的方法来检查标签文本。但是,根据您的需要,我可能会编写一个映射函数,将标签映射到图像名称。它将返回图像名称,然后您将图像设置在外部。好吧,您还可以决定一个UI元素,您只获取函数外部的值,而不是内部的值。不幸的是,我不知道模型的名称。我对此补充了一点意见。
    
        navigationInstructionImage.image = [UIImage imageNamed: [self imageForInstruction:stepLabelTop.text]]; // <- Here you should NOT pass `stepLabelTop.text`. Instead, try to send the corresponding data model.