Максимизация читабельности кода в методах с побочными эффектами? - PullRequest
3 голосов
/ 03 ноября 2011

Я работаю с методом, который вызывает побочные эффекты на переданный опорный параметр. Одной из моих основных проблем в отношении кода является удобочитаемость, и я считаю, что это потенциальная причина для путаницы.

Взять например:

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 ]

7 голосов
/ 03 ноября 2011

Если это побочный эффект only , я бы назвал метод, к которому он принадлежит: внутри SimplePOCO, так что метод и изменяемые им данные инкапсулированы вместе:

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

Также имя метода должно указывать на то, что в результате вызова ожидается изменение, т.е. UpdateSimplePropertyRandomly().

1 голос
/ 03 ноября 2011

Я бы пошел с:

public static void Method1(SimplePOCO simplePOCO) 

Если вы возвращаете объект, я думаю, он выглядит так, как будто он создает новый экземпляр. Для меня void предполагает, что метод работает по моей ссылке, которую я передаю.

0 голосов
/ 03 ноября 2011

Почему вы не можете создавать методы против SimplePOCO? Тогда вы получите

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