我需要找到最佳的解决方案(主要是在复杂性/速度上,而不是可读性或RAM分配方面),以在条件为真时执行不同操作(例如函数调用)的自定义序列。如果错误,则必须停止该序列。这是一个解决方案作为示例:
/*This function starts when"condition = true", and
must stop running when"condition = false"*/
public void sequence(){
//Every function has a duration lower than a milisecond
function_a();
if( condition = false ) return;
function_b();
/*--------------------------------
same pattern * 20 (approximation)
---------------------------------*/
if( condition = false ) return;
function_z();
//END of the sequence
}
比上一个更具可读性的另一个示例:
public void sequence_switch(){
int currentStep = 0;
do{
switch(currentStep){
case 0:
function_a();
break;
case 1:
function_b();
break;
/*--------------------------------
same pattern * 20 (approximation)
---------------------------------*/
case 2:
function_z();
break;
}
currentStep ++;
}while( condition = true );
}
我一直在考虑异常,但是在某些情况下,它们会使程序变慢,也许不是这样吗?
更多信息:在大多数情况下(95%),该序列必须在执行前5个操作时停止,或者达到结束。 (想象一下机械臂必须在不同点移动物体,如果它没有正确抓住物体,它将很快掉落,因此不应执行以下所有操作)
条件为假时立即停止序列是至关重要的。
编辑:欢迎其他解决方案,但真正的答案是在效率方面进行比较。
此循环的理想情况是游戏中的宏:条件可能是"握住钥匙",并且如果您没有在正确的时间使用这个复杂的宏,则想取消它(不这样做)。希望程序继续执行此顺序,则要恢复对鼠标/键盘的完全控制)。但是,如果一切顺利,除非有极少数情况,否则您将一直坚持到最后。
如果使用java8,则可以将函数添加到列表中,并使用循环调用它们。
您写了" ..必须在执行前5个操作时停止",我们在这里谈论多线程吗?
@JoakimDanielson我们可以谈论多线程,因为继续执行序列所需的"条件"在此" sequence()"函数中不会改变。它的更新实际上将来自另一个线程/进程。
您是否考虑过在此"其他线程"中设置变量而不是将变量发送到您的第一个线程(我们在此讨论的那个线程)。然后可能会发生Interrupt异常,您只需要在外部捕获即可。
@LucA每个函数返回什么?如果不涉及多线程,则可以执行return function_a() && function_b() && function_c()....并使每个函数返回布尔值true或false。
@ vivek_23没有一个函数必须返回任何内容,主要的一点是能够启动此序列并停止它。
@Alfe我考虑了例外,我在问题中写了它。我想对速度进行一些比较,因为异常可能非常慢(大约5毫秒)。但是您是对的,使用异常是停止序列的另一种解决方案。问题是,哪种效率更高?
@LucA您说过It is CRUCIAL to stop the sequence as soon as the condition is false.,那么您如何知道何时停止?我看到您在第一次尝试中做了if( condition = false )。
@ vivek_23序列中的"检查"位于一些非常快速的操作之后:"每个函数的持续时间都小于毫秒"。即使在游戏中,这也不是问题。但是我知道你要去哪里,有异常会随时检测到情况。问题在于:在什么条件下,if列表(示例1)将比异常更快地停止序列?但是,如果我们不必停止序列,这些速度会慢多少?我的问题的重点是要在这些想法之间找到平衡。
您的第一个解决方案具有完美的性能,不可能做得更好。
也许不完整,但是有效的答案。 谢谢。
如果您愿意牺牲可读性,那么总会有提升性能的空间。 在这种情况下,您可以内联函数代码,而不是调用它们。 (顺便说一下,这表明了整个问题的责任。)