Сколько информации необходимо скрыть при рефакторинге кода? - PullRequest
1 голос
/ 19 июня 2009

Сколько информации необходимо скрыть? У меня есть стандартный код перед удалением записи, она выглядит так:

    public override void OrderProcessing_Delete(Dictionary<string, object> pkColumns)
    {
        var c = Connect();


        using (var cmd = new NpgsqlCommand("SELECT COUNT(*) FROM orders WHERE order_id = :_order_id", c)
            { Parameters = { {"_order_id", pkColumns["order_id"]} } } )
        {
            var count = (long)cmd.ExecuteScalar();

            // deletion's boilerplate code...
            if (count == 0) throw new RecordNotFoundException();
            else if (count > 1) throw new DatabaseStructureChangedException();
            // ...boiler plate code
        }



        // deleting of table(s) goes here...
    }

ПРИМЕЧАНИЕ: стандартный код генерируется кодом, включая «using (var cmd = new NpgsqlCommand (...)»

Но я серьезно думаю о рефакторинге кода котельной плиты, я хотел более краткий код. Вот как я представляю себе рефакторинг кода (лучше с помощью метода расширения (не единственная причина;))

    using (var cmd = new NpgsqlCommand("SELECT COUNT(*) FROM orders WHERE order_id = :_order_id", c)
        { Parameters = { {"_order_id", pkColumns["order_id"]} } } )
    {
              cmd.VerifyDeletion(); // [EDIT: was ExecuteWithVerification before]
    }

Я хотел, чтобы исполняемый код и шаблонный код входили в метод расширения.

Для моего кода выше требуется ли рефакторинг кода / скрытие информации? Моя операция рефакторинга выглядит слишком непрозрачной?

Ответы [ 4 ]

2 голосов
/ 19 июня 2009

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

Программист, идущий за вами и просматривающий ваш код, просто взглянет на определение метода расширения, чтобы выяснить, что он делает, и теперь он знает, что этот код определен в одном месте, поэтому вероятность его появления отсутствует. отличается от места к месту.

1 голос
/ 19 июня 2009

Попробуйте, если нужно, но я чувствую, что дело не в краткости, а в том, хотите ли вы принудительно вести себя каждый раз или большую часть времени. И, соответственно, если условие проверки изменяется, оно может измениться по всем направлениям.

По сути, сокращение небольшого фрагмента кода, не обязательно делает вещи более краткими; это всего лишь еще одна абстракция, которую разработчик должен понять и понять.

Как разработчик, я бы понятия не имел, что означает "ExecuteWithVerify". Что именно мы проверяем? Я должен был бы искать это и помнить это. Но с помощью стандартного кода я могу посмотреть на код и точно понять, что происходит.

И, НЕ сводя его к отдельному методу, я также могу настроить код таблички котла для случаев, когда необходимо генерировать исключения для различных условий.

0 голосов
/ 21 ноября 2009

«Новый» оператор внутри класса (за исключением конструктора) следует избегать любой ценой. Это то, что вам нужно для рефакторинга здесь.

0 голосов
/ 19 июня 2009

Это не сокрытие информации, когда вы извлекаете или реорганизуете свой код. Это только скрытие информации, когда вы начинаете ограничивать доступ к определению вашего расширения после рефакторинга.

...