我刚读完了Bob叔叔的清洁代码中的“功能”一章。主要建议是确保功能很短 - 真的简短。他们应该只对每个抽象层次做一件事。这是我正在学习Cocoa的应用程序的一个函数(来自Andy Matuschak的想法)。
- (IBAction)go:(id)sender
{
NSString *output = nil;
if ([[nameInputField stringValue] isEqualToString:@""])
{
output = @"Please enter your name";
}
else
{
NSString *date = [[NSDate date] descriptionWithCalendarFormat:@"%A, %B %d"
timeZone:nil
locale:[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]];
output = [NSString stringWithFormat:@"Hello, %@! Today is %@.", [nameInputField stringValue], date];
}
[responseOutputField setStringValue:output];
}
基本上,此函数从文本字段(nameInputField
)中读取名称并将消息输出到另一个文本字段(responseOutputField
)我想知道a)如果此函数执行“一件事”每个抽象级别和b)如何缩短它。
答案 0 :(得分:4)
我不同意这个功能处于正确的水平。根据当前输入计算输出内容的核心计算应该考虑到另一个函数中。这将使该计算更加可测试(因为您不需要任何文本字段,您可以单独进行单元测试)并且可以重复使用,因为它具有更少的上下文包袱。实际上,该功能是硬连接到特定用途的,因此不可重复使用。
实际上,如何在不实际运行应用程序的情况下对其进行测试?
答案 1 :(得分:2)
它做了两件事。首先,它获取/确定要打印的输出。然后打印出来。你可以分开这些。但我不会。这似乎对我来说太过分了。
答案 2 :(得分:2)
我认为这个功能做了大量工作,不需要进一步细分。
我建议更改函数的名称以更清楚地描述它的作用(即updateResponse)。在查看源代码和查看界面构建器中的NIB时,这将使代码更易于理解。此外,如果您找不到简洁描述该功能的名称,那么您的提示就是违反了“一件事”的目标。
您还会问如何缩短此代码。我认为在这种情况下,您可以使用bindings来使responseOutputField与nameInputField保持同步,而不需要任何代码(取决于您希望事情的确切行为)。