Минимизируйте область видимости переменной
От: igna Россия  
Дата: 29.10.08 11:47
Оценка: +2 :))
Совет минимизировать область видимости переменной общеизвестен. Минимальная область видимости это область видимости неименованной переменной, тем не менее часто избегают писать так:

    if (DoSomethingUseful(
        variable1.Method1(variable1A, variable1B),
        variable2.Method2(variable2A, variable2B),
        variable3.Method3(variable3A, variable3B)
    )) {
        . . .
    }


и пишут так:

    var par1 = variable1.Method1(variable1A, variable1B);
    var par2 = variable2.Method2(variable2A, variable2B);
    var par3 = variable3.Method3(variable3A, variable3B);
    if (DoSomethingUseful(par1, par2, par3)) {
        . . .
    }
Re: Минимизируйте область видимости переменной
От: Aikin Беларусь kavaleu.ru
Дата: 29.10.08 11:50
Оценка:
Здравствуйте, igna, Вы писали:

I>Совет минимизировать область видимости переменной общеизвестен. Минимальная область видимости это область видимости неименованной переменной, тем не менее часто избегают писать так:


I>
I>    if (DoSomethingUseful(
I>        variable1.Method1(variable1A, variable1B),
I>        variable2.Method2(variable2A, variable2B),
I>        variable3.Method3(variable3A, variable3B)
I>    )) {
I>        . . .
I>    }

I>


I>и пишут так:


I>
I>    var par1 = variable1.Method1(variable1A, variable1B);
I>    var par2 = variable2.Method2(variable2A, variable2B);
I>    var par3 = variable3.Method3(variable3A, variable3B);
I>    if (DoSomethingUseful(par1, par2, par3)) {
I>        . . .
I>    }
I>

А если так:
    var customer = variable1.Method1(variable1A, variable1B);
    var totalPrice = variable2.Method2(variable2A, variable2B);
    var discount = variable3.Method3(variable3A, variable3B);
    if (DoSomethingUseful(customer, totalPrice, discount)) 
    {
        . . .
    }

?
Re: Минимизируйте область видимости переменной
От: samius Япония http://sams-tricks.blogspot.com
Дата: 29.10.08 11:51
Оценка:
Здравствуйте, igna, Вы писали:

I>Совет минимизировать область видимости переменной общеизвестен. Минимальная область видимости это область видимости неименованной переменной, тем не менее часто избегают писать так:


I>
I>    if (DoSomethingUseful(
I>        variable1.Method1(variable1A, variable1B),
I>        variable2.Method2(variable2A, variable2B),
I>        variable3.Method3(variable3A, variable3B)
I>    )) {
I>        . . .
I>    }

I>


I>и пишут так:


I>
I>


В первом случае не разумно говорить об области видимгсти переменных, так как переменных собственно нет )))
Re[2]: Минимизируйте область видимости переменной
От: igna Россия  
Дата: 29.10.08 11:57
Оценка:
Здравствуйте, Aikin, Вы писали:

A>А если так:

A>
A>    var customer = variable1.Method1(variable1A, variable1B);
A>    var totalPrice = variable2.Method2(variable2A, variable2B);
A>    var discount = variable3.Method3(variable3A, variable3B);
A>    if (DoSomethingUseful(customer, totalPrice, discount)) 
A>    {
A>        . . .
A>    }
A>


Это то же, что и мой второй вариант. Разумеется, вместо par1, par2 и par3 будут использованы более информативные имена, как впрочем и вместо variable1, Method1 и так далее. Так, в твоем примере Method1 будет скорее всего называться как-нибудь со словом Customer в имени, так что дополнительное именование переменной ничего не даст.
Re[3]: Минимизируйте область видимости переменной
От: Aikin Беларусь kavaleu.ru
Дата: 29.10.08 12:02
Оценка:
Здравствуйте, igna, Вы писали:

I>Это то же, что и мой второй вариант. Разумеется, вместо par1, par2 и par3 будут использованы более информативные имена, как впрочем и вместо variable1, Method1 и так далее.

Ну так надо было бы так и написать, а не вводить людей в заблуждения

I>Так, в твоем примере Method1 будет скорее всего называться как-нибудь со словом Customer в имени, так что дополнительное именование переменной ничего не даст.

Прошу переписать пример чтобы быделенное действительно имело место
Re[4]: Минимизируйте область видимости переменной
От: igna Россия  
Дата: 29.10.08 12:11
Оценка:
Здравствуйте, Aikin, Вы писали:

A>Прошу переписать пример чтобы быделенное действительно имело место


        using (var serviceHost = new ServiceHost(
            typeof(MinimalistSelfHostedWebService),
            new Uri("http://localhost:8000/MinimalistSelfHostedWebService")
        )) {
            . . .
        }


        var baseAddress = new Uri("http://localhost:8000/MinimalistSelfHostedWebService");
        using (var serviceHost = new ServiceHost(typeof(MinimalistSelfHostedWebService), baseAddress)) {
            . . .
        }


На мой взгляд указание того, что URI является base address ничего не дает, зато объявление переменной заставляет смотреть, не используется ли она где-нибудь внутри using.
Re: Минимизируйте область видимости переменной
От: prVovik Россия  
Дата: 29.10.08 12:13
Оценка: +6
Здравствуйте, igna, Вы писали:

I>и пишут так:


I>
I>    var par1 = variable1.Method1(variable1A, variable1B);
I>    var par2 = variable2.Method2(variable2A, variable2B);
I>    var par3 = variable3.Method3(variable3A, variable3B);
I>    if (DoSomethingUseful(par1, par2, par3)) {
I>        . . .
I>    }
I>


Вариантов несколько:
1) Повысить читабельность, так как имя переменной несет в себе смысл. Ибо из одного только вызова бывает непонятно, что возвращается. Ну представь: variable1.Method1(variable1A / 1.46 > object1.GetSomething() ? variable1A : variable1A * this.GetPar(), variable1B)

2) Удобство отладки. В отладчике можно глянуть, какие параметры передаются в DoSomethingUseful
лэт ми спик фром май харт
Re[5]: Минимизируйте область видимости переменной
От: Aikin Беларусь kavaleu.ru
Дата: 29.10.08 12:17
Оценка: +1
Здравствуйте, igna, Вы писали:

I>На мой взгляд указание того, что URI является base address ничего не дает

Это дело привычки. Если ты привык к синтаксису 1 то вполне нормально. Мне же было сложно определить какой класс мы создаем (т.е. понадобилось искать, а не "кинуть взгляд" и понять).
I>зато объявление переменной заставляет смотреть, не используется ли она где-нибудь внутри using.
Так уж и заставляет

В общем, я за первый вариант.



Самое главное в любом подходе -- постоянство. Сами по себе оба подхода хороши (все зависит от привычек), но ни в коем случае не стоит их смешивать (часть вызовов так/часть так).


СУВ, Aikin
Re: Минимизируйте область видимости переменной
От: Lloyd Россия  
Дата: 29.10.08 12:41
Оценка:
Здравствуйте, igna, Вы писали:

I>Совет минимизировать область видимости переменной общеизвестен. Минимальная область видимости это область видимости неименованной переменной, тем не менее часто избегают писать так:


Речь о шарпе? Тогда никакой разницы нет. Переменная становится доступной для сборщика мусора сразу после последнего использования.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re: Минимизируйте область видимости переменной
От: Юрий Жмеренецкий ICQ 380412032
Дата: 29.10.08 13:05
Оценка: +2
Здравствуйте, igna, Вы писали:

I>Совет минимизировать область видимости переменной общеизвестен. Минимальная область видимости это область видимости неименованной переменной, тем не менее часто избегают писать так:

...

Некоторая разница все же может быть:

* Порядок вычисления аргументов функции может быть не определен (зависит от языка, в С++ есть кое-какие грабли).

* Эквивалентность(точнее ее возможность) зависит от побочных эффектов функций:

    if (DoSomethingUseful(
        variable1.Method1(variable1A, variable1B),
        variable2.Method2(variable2A, variable2B),
        variable2.Method2(variable2A, variable2B)
    )) {
        . . .
    }
 
    var par1 = variable1.Method1(variable1A, variable1B);
    var par2 = variable2.Method2(variable2A, variable2B);
    if (DoSomethingUseful(par1, par2, par2)) {
        . . .
    }
Re[2]: Минимизируйте область видимости переменной
От: igna Россия  
Дата: 29.10.08 14:01
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Речь о шарпе? Тогда никакой разницы нет. Переменная становится доступной для сборщика мусора сразу после последнего использования.


Речь об области видимости, а не о времени жизни. То есть думаем о человеке, читающем программу.
Re[2]: Минимизируйте область видимости переменной
От: igna Россия  
Дата: 29.10.08 14:06
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>    var par1 = variable1.Method1(variable1A, variable1B);
ЮЖ>    var par2 = variable2.Method2(variable2A, variable2B);
ЮЖ>    if (DoSomethingUseful(par1, par2, par2)) {
ЮЖ>        . . .
ЮЖ>    }


Я бы это кстати записал так:

    var par2 = variable2.Method2(variable2A, variable2B);
    if (DoSomethingUseful(variable1.Method1(variable1A, variable1B), par2, par2)) {
        . . .
    }


Даже если бы не "поместилось" в одной строке:

    var par2 = variable2.Method2(variable2A, variable2B);
    if (DoSomethingUseful(
        variable1.Method1(variable1A, variable1B),
        par2,
        par2
    )) {
        . . .
    }
Re[3]: Минимизируйте область видимости переменной
От: Lloyd Россия  
Дата: 29.10.08 14:23
Оценка: +2
Здравствуйте, igna, Вы писали:

L>>Речь о шарпе? Тогда никакой разницы нет. Переменная становится доступной для сборщика мусора сразу после последнего использования.


I>Речь об области видимости, а не о времени жизни. То есть думаем о человеке, читающем программу.


И в качестве средства заботы о человеке предлагаете инлайнить переменные?
Вы уверены, что читающий будет вам за это благодарен?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[3]: Минимизируйте область видимости переменной
От: Lloyd Россия  
Дата: 29.10.08 14:24
Оценка:
Здравствуйте, igna, Вы писали:

I>Даже если бы не "поместилось" в одной строке:


I>
I>    var par2 = variable2.Method2(variable2A, variable2B);
I>    if (DoSomethingUseful(
I>        variable1.Method1(variable1A, variable1B),
I>        par2,
I>        par2
I>    )) {
I>        . . .
I>    }
I>


Ужас какой!
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[4]: Минимизируйте область видимости переменной
От: igna Россия  
Дата: 29.10.08 14:31
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Ужас какой!


Вариант:

    var par2 = variable2.Method2(variable2A, variable2B);
    if (
        DoSomethingUseful(
            variable1.Method1(variable1A, variable1B),
            par2,
            par2
        )
    ) {
        . . .
    }
Re[5]: Минимизируйте область видимости переменной
От: Lloyd Россия  
Дата: 29.10.08 14:37
Оценка: :)
Здравствуйте, igna, Вы писали:

L>>Ужас какой!


I>Вариант:


I>
I>    var par2 = variable2.Method2(variable2A, variable2B);
I>    if (
I>        DoSomethingUseful(
I>            variable1.Method1(variable1A, variable1B),
I>            par2,
I>            par2
I>        )
I>    ) {
I>        . . .
I>    }
I>


Ты прикалываешься или серьезно?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[6]: Минимизируйте область видимости переменной
От: igna Россия  
Дата: 29.10.08 14:49
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Ты прикалываешься или серьезно?


Я пытаюсь сделать читабельнее обойдясь без введения переменной.

Вот еще вариант:

    var par2 = variable2.Method2(variable2A, variable2B);
    if (DoSomethingUseful(
            variable1.Method1(variable1A, variable1B),
            par2,
            par2)
    ) {
        . . .
    }
Re[3]: Минимизируйте область видимости переменной
От: Юрий Жмеренецкий ICQ 380412032
Дата: 29.10.08 15:03
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Юрий Жмеренецкий, Вы писали:


I>
ЮЖ>>    var par1 = variable1.Method1(variable1A, variable1B);
ЮЖ>>    var par2 = variable2.Method2(variable2A, variable2B);
ЮЖ>>    if (DoSomethingUseful(par1, par2, par2)) {
ЮЖ>>        . . .
ЮЖ>>    }
I>


I>Я бы это кстати записал так:


...

ЮЖ>> ... зависит от побочных эффектов функций

Я вот что имел ввиду:
int i = 0;

int f1() { return ++i; }

int f2(int a, int b) { return a+b; }

void test()
{
  // 1
  int a = f2(f1(), f1());

  // 2
  int b = f1();
  int c = f2(b, b);
    
  assert(a != c);
}
Re[7]: Минимизируйте область видимости переменной
От: Aikin Беларусь kavaleu.ru
Дата: 29.10.08 15:04
Оценка:
Здравствуйте, igna, Вы писали:

I>Я пытаюсь сделать читабельнее обойдясь без введения переменной.

А зачем?
Re[7]: Минимизируйте область видимости переменной
От: Lloyd Россия  
Дата: 29.10.08 15:19
Оценка:
Здравствуйте, igna, Вы писали:

L>>Ты прикалываешься или серьезно?


I>Я пытаюсь сделать читабельнее обойдясь без введения переменной.


Это самоцель? Зачем без переменной? В чем преимущество? Пока вроде только недостатки были найдены.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.