如何根据洁净原则处理按钮水龙头?

问题描述:

我有以下的,看似简单的代码处理按钮水龙头iOS应用程序:如何根据洁净原则处理按钮水龙头?

- (IBAction)tapKeypadButton:(UIButton *)sender { 
    NSString *buttonLabel = sender.titleLabel.text; 

    if ([buttonLabel isEqualToString:@"<"]) { 
     [self _tapBackButton]; 
    } else { 
     [self _tapDigitButton:buttonLabel]; 
    } 
} 

要由罗伯特C.马丁完全遵循清洁守则原则,我需要在同一个ButtonTapFactory什么线?

+2

你试图遵循什么原则?你为什么认为你需要一个'ButtonTapFactory'? – 2012-04-25 15:24:03

你有两种类型的按钮,具有不同的行为(后退按钮和数字按钮)。为了使这段代码干净,每种类型都应该有两个动作。类型不应该由按钮内部的文本内容决定,而应该通过语义上有意义的方式来确定。 (即子类)。 此外,一个动作方法应该只包含对另一个执行实际逻辑的方法的调用。其他一切都是不可测试的。在代码:

- (IBAction) tapBackButton:(id) sender 
{ 
    [self _tapBackButton:sender]; 
} 

- (IBAction) tapDigitButton:(id) sender 
{ 
    [self _tapDigitButton:sender]; 
} 

这种方式,您可以有单元测试调用你的方法,而你的UI代码干扰。另请注意,我从拨打_tapDigitButton的电话中删除了该标签。该数字不应该从标签中解析出来,而应该以更加语义稳定的方式传递,例如使用tag属性。