我想知道命名函数是否是一个很好的实践,因为它的主要逻辑是“进行”+ "functionName“。
如果有支票,我会用这个名字(如果-S,试捕,等等)。在函数开始的时候,我想把主逻辑分离成单独的功能。
private void function() {
if(someCondition1) {
throw Error1;
}
if(someCondition2) {
throw Error2;
}
try {
proceedFunction(); // <-- Name of the function here
} catch(Exception e) {
// Error handling
}
}
private void proceedFunction() {
// Main logic
}发布于 2020-11-13 14:25:29
你所谓的proceedFunction的内容实际上是由function描述的。您在proceedFunction之外所做的(但仍在function中)是一些初步验证。
现在,你会这样想:
myFunction = method body + [proceedMyFunction]我建议重新设计你的思维方式,所以这个名称(“功能”)更接近于描述正在执行的实际功能,即:
myFunction = [validateMyFunction] + method body换句话说,您的代码应该如下所示:
private void Foo()
{
ValidateFoo();
// do the Foo work here
}
private void ValidateFoo()
{
if (x == 5)
throw new Exception("x is 5!");
}现在,Foo和ValidateFoo都恰当地描述了它们的方法体中正在发生的事情。
您需要将验证与实际工作分开吗?这是有关联的。
如果这两个部分都是琐碎的和短小的,那么可能没有必要将它们实际分开。
如果任何一个部分都不是琐碎的,那么拆分它们可以显著提高可读性。在需要的时候,它也明显地增加了可重用性。
发布于 2020-11-13 14:31:22
虽然这是相对主观和固执己见的,并且可能是这样结束的,但我将尝试回答,不是直接的是或否,而是一个更一般的标准。
当您发现自己在讨论命名约定时,您需要问的第一个问题是“谁将阅读此代码”。试着超越目前正在阅读代码的人以及谁可能需要理解代码。
至于您的具体问题--我不太熟悉方法对命名为DoX和ProceedDoX的风格,从我的经验来看,它们的含义对我来说并不直观,但是特定的语言或域可能正在使用它们。
我不能随手想到这方面的具体命名模式,但我看到了DoX与DoXNoChecks、DoXInternal或DoXImpl匹配的对,它们各有优缺点。
发布于 2020-11-13 14:26:42
作为代码的读者,我希望有一个具有特定名称的函数来完成名称所建议的事情。我会惊讶地发现,这个函数只验证是否可以调用实际的函数。
它也很容易出错,因为执行这项工作的实际函数可以从其他地方调用,不会执行验证。
通过分解大型功能来清理它们是一种很好的做法,但是分解那些有意义的部分是好的做法。在您的示例中,对someCondition1和someCondition2的检查更适合提取到单独的函数中。
private void doWork() {
checkCondition1(...);
checkCondition2(...);
try {
// handle actual doWork logic
} catch(Exception e) {
// Error handling
}
}
private void checkCondition1(...) {
// perform checks
}
private void checkCondition2(...) {
// perform checks
}https://softwareengineering.stackexchange.com/questions/418946
复制相似问题