How to prevent the arrowhead anti-pattern

后端 未结 13 1352
南旧
南旧 2020-12-05 06:37

I\'m a bit confused about how to best refactor my code into something more readable.

Consider this piece of code:

var foo = getfoo();
if(foo!=null)
{         


        
13条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-05 06:45

    This is the one case where I'd use goto.

    Your example might not be quite enough to push me over the edge, and multiple returns are better if your method is simple enough. But this pattern can get rather extensive, and you often need some cleanup code at the end. While using most of the other answers here if I can, often the only legible solution is to use goto's.

    (When you do, be sure to put all references to the label inside one block so anyone looking at the code knows both the goto's and the the variables are confined to that part of the code.)

    In Javascript and Java you can do this:

    bigIf:  {
    
        if (!something)      break bigIf;
        if (!somethingelse)  break bigIf;
        if (!otherthing)     break bigIf;
    
        // Conditionally do something...
    }
    // Always do something else...
    return;
    

    Javascript and Java have no goto's, which leads me to believe other people have noticed that in this situation you do need them.

    An exception would work for me too, except for the try/catch mess you force on the calling code. Also, C# puts in a stack trace on the throw, which will slow your code way down, particularly if it usually kicks out on the first check.

提交回复
热议问题