Неправильно ли использовать фигурные скобки для переменной области видимости? - PullRequest
19 голосов
/ 06 июля 2010

Я иногда использую фигурные скобки, чтобы изолировать блок кода, чтобы избежать ошибочного использования переменной позже.Например, когда я помещаю несколько SqlCommand в один и тот же метод, я часто копирую-вставляю блоки кода, заканчивая смешиванием имен и выполняя дважды некоторые команды.Добавление фигурных скобок помогает избежать этой ситуации, потому что использование неправильного SqlCommand в неправильном месте приведет к ошибке.Вот иллюстрация:

Collection<string> existingCategories = new Collection<string>();

// Here a beginning of a block
{
    SqlCommand getCategories = new SqlCommand("select Title from Movie.Category where SourceId = @sourceId", sqlConnection, sqlTransaction);
    getCategories.Parameters.AddWithValue("@sourceId", sourceId);
    using (SqlDataReader categoriesReader = getCategories.ExecuteReader(System.Data.CommandBehavior.SingleResult))
    {
        while (categoriesReader.Read())
        {
            existingCategories.Add(categoriesReader["Title"].ToString());
        }
    }
}

if (!existingCategories.Contains(newCategory))
{
    SqlCommand addCategory = new SqlCommand("insert into Movie.Category (SourceId, Title) values (@sourceId, @title)", sqlConnection, sqlTransaction);

    // Now try to make a mistake and write/copy-paste getCategories instead of addCategory. It will not compile.
    addCategory.Parameters.AddWithValue("@sourceId", sourceId);
    addCategory.Parameters.AddWithValue("@title", newCategory);
    addCategory.ExecuteNonQuery();
}

Теперь StyleCop отображает предупреждение каждый раз, когда блок следует за пустой строкой.С другой стороны, отсутствие пустой строки усложнит понимание кода.

// Something like:
Collection<string> existingCategories = new Collection<string>();
{
    // Code here
}

// can be understood as (is it easy to notice that semicolon is missing?):
Collection<string> existingCategories = new Collection<string>()
{
    // Code here
}

Итак,

  1. Есть ли что-то не так при использовании фигурных скобок для создания блоков кода только для целей переменной области видимости?

  2. Если все в порядке, как сделать его более читабельным, не нарушая правил StyleCop?

Ответы [ 5 ]

22 голосов
/ 06 июля 2010

Нет ничего плохого само по себе с блокировкой кода, но вы должны подумать, почему вы это делаете.

Если вы копируете и вставляете код, вы, вероятно, находитесь в ситуации, когда вам следует рефакторизовать код и создавать функции, которые вы вызываете повторно, а не выполнять похожие, но разные блоки кода повторно.

13 голосов
/ 06 июля 2010

Используйте оператор using вместо пустых фигурных скобок.

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

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

7 голосов
/ 07 июля 2010

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

Показательный пример - однажды я наткнулся на библиотеку профилирования, которая использовала объекты Profile для временных отрезков кода. Они работали, измеряя время от их создания до уничтожения, и, следовательно, работали лучше всего, создаваясь в стеке, а затем уничтожались, когда выходили за рамки, таким образом измеряя время, проведенное в этой конкретной области. Если вы хотите рассчитать время для чего-то, что по своей сути не имеет собственной области видимости, то, возможно, лучше всего добавить дополнительные фигурные скобки для определения этой области.

Что касается читабельности, я могу понять, почему StyleCop это не нравится, но любой, кто имеет какой-либо опыт работы с C / C ++ / Java / C # / ..., знает, что пара скобок определяет область видимости, и это должно быть достаточно очевидно вот что ты пытаешься сделать.

5 голосов
/ 06 июля 2010

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

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

3 голосов
/ 06 июля 2010

Я должен был бы сказать, что если бы я работал над этим кодом после вас, я бы немного разочаровался при использовании области действияНа самом деле это не обычная практика.

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

...