在具有副作用的方法中最大化代码可读性?

时间:2011-11-03 18:19:30

标签: c# pass-by-reference readability

我正在使用一种方法,该方法会对传递的参考参数造成副作用。我对代码的主要关注点之一是可读性,这种情况我觉得可能导致混淆。

以例如:

class Program
{
    static void Main(string[] args)
    {
        var simplePOCO = new SimplePOCO();

        // Method 1: causes side effects, but potentially unclear
        Method1(simplePOCO);

        // Method 2: assignment makes intentions clearer, but unnecessary
        simplePOCO = Method2(simplePOCO);

        // Method 3: ref/out makes intentions clearer, but (very?) unnecessary
        Method3(ref simplePOCO);

        // Method 4: avoid the problem altogether
        simplePOCO.SimpleProperty = Method4();
    }

    public static void Method1(SimplePOCO simplePOCO)
    {
        simplePOCO.SimpleProperty = 1;
    }

    public static SimplePOCO Method2(SimplePOCO simplePOCO)
    {
        simplePOCO.SimpleProperty = 1;
        return simplePOCO;
    }

    public static SimplePOCO Method3(ref SimplePOCO simplePOCO)
    {
        simplePOCO.SimpleProperty = 1;
        return simplePOCO;
    }

    public static int Method4()
    {
        return 3;
    }
}

class SimplePOCO
{
    public int SimpleProperty { get; set; }
}

我倾向于使用方法2,但我意识到它只是使用自我分配。方法4看起来也不错,但在这种情况下需要进行一些重构才能实现 - 值得吗?我很好奇是否有人对此有任何强烈的感情。显然,方法的正确命名将有很长的路要走。是否存在解决这一问题的思想流派?还有其他我没想过的风格吗?

3 个答案:

答案 0 :(得分:7)

如果这是唯一的副作用,我会把它属于的方法:在SimplePOCO内,以便将方法和它修改的数据封装在一起:

class SimplePOCO
{
    public int SimpleProperty { get; set; }
    public void Method5()
    {
       SimpleProperty = 3;
    }
}

此外,方法名称应表明由于通话而预期会发生变更,即UpdateSimplePropertyRandomly()

答案 1 :(得分:1)

我会选择:

public static void Method1(SimplePOCO simplePOCO) 

如果你返回对象,我认为它看起来好像在创建一个新实例。对我来说,void表明该方法正在处理我传入的引用。

答案 2 :(得分:0)

为什么你不能创建针对SimplePOCO的方法?然后你会得到

// npn-static
simplePOCO.Method1()
// static
SimplePOCO.Method1(simplePOCO)