Re[3]: Минимизируйте область видимости переменной
От: Lloyd Россия  
Дата: 30.10.08 07:49
Оценка:
Здравствуйте, igna, Вы писали:

VD>>Это удобно при отладке. Ты видишь промежуточные значения без захода в функции.


I>Вот такое тоже удобно при отладке:


I>
I>    var par1 = variable1.Method1(variable1A, variable1B);
I>    if (DoSomethingUseful(par1)) {
I>        . . .
I>    }
I>


I>Но чаще пишут все же:


Чаще как раз пишут с заведением промежуточных переменных.
В общем, кури Рефакторинг Фаулера. Там есть объяснения многого из того, как делать не стоит. Про временные переменные там вроде тоже было. Только не помню, за них или против.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[3]: Минимизируйте область видимости переменной
От: Lloyd Россия  
Дата: 30.10.08 07:50
Оценка:
Здравствуйте, igna, Вы писали:

I>IMHO это лучше, чем без внешних фигурных скобок,


ИМХО, только хуже.

I>но внутри блока if переменные все же видны.


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

L>В общем, кури Рефакторинг Фаулера. Там есть объяснения многого из того, как делать не стоит. Про временные переменные там вроде тоже было. Только не помню, за них или против.


Он написал, что "за", только если они являются поясняющими, но сам использует их редко.
Re[4]: Минимизируйте область видимости переменной
От: igna Россия  
Дата: 30.10.08 08:07
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Ну и замечательно. Удобно же.


Ну да, как удобны грабли. В смысле, всегда есть на что наступить.
Re: Минимизируйте область видимости переменной
От: Tilir Россия http://tilir.livejournal.com
Дата: 30.10.08 09:05
Оценка: -1
Здравствуйте, 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>



Хм... А я почему-то всегда стараюсь чтобы в условиях циклов и условных операторов не было (по возможности) вызовов функций. То есть этот участок я бы переписал как

  {
    int par1 = var1.m1(v1a, v1b);
    int par2 = var2.m1(v2a, v2b);
    int par3 = var3.m1(v3a, v3b);
    bool boSomethingUsefulOk = DoSomethingUseful(par1, par2, par3);
    if (boSomethingUsefulOk){
      // ...
    }
  }


И мне кажется любому читающему так гораздо понятней -- мы вводим дополнительную сущность, которая имеет смысл "всё ли в порядке". Представьте что пройдёт какое-то время и вам придётся в if заходить если DoSomethingUseful и при это DoSomethingUseful2. Тогда ваш вариант предполагает следующее расширение:

if (DoSomethingUseful(par1, par2, par3) && DoSomethingUseful2(par1, par2, par3)) {


а мой вариант остаётся читабельным:

bool boSomethingUsefulOk = DoSomethingUseful(par1, par2, par3);
bool boSomethingUseful2Ok = DoSomethingUseful2(par1, par2, par3);
if (boSomethingUsefulOk && boSomethingUseful2Ok) {
...
}


не говоря уже о том, что вариант с внесением всего что можно в скобки условия порождает такие варианты как

for (int i = 0; i != lstrlenA(str); ++i){
  //...
}


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

Короче общая идея такая: фанатизм с ограничением области видимости ни к чему хорошему не приводит. Область должна быть наивозможно узкой, но не уже, чем требует здравый смысл, удобность чтения и формирование процедурной абстракции.
Re[5]: Минимизируйте область видимости переменной
От: Lloyd Россия  
Дата: 30.10.08 09:14
Оценка:
Здравствуйте, igna, Вы писали:

L>>Ну и замечательно. Удобно же.


I>Ну да, как удобны грабли. В смысле, всегда есть на что наступить.


В реале, если давать осмысленные имена, не возникает такой проблемы.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[13]: Минимизируйте область видимости переменной
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.10.08 09:28
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, samius, Вы писали:


S>>Это просто? За такое дублирование отстреливают. ExtractMethod!!!


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>        var par1a = callSomeFunctionWithALongName1();
I>        var par2a = callSomeFunctionWithALongName2();
I>        var par3a = callSomeFunctionWithALongName3();
I>        if (DoSomethingUseful(par1a, par2a, par3a)) {
I>            . . .
I>        }
I>        . . .
I>    }
I>


I>ошибкоустойчивее использовать


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


А так:
    Func<bool> doSomething = () =>
       DoSomethingUseful(
            variable1.Method1(variable1A, variable1B),
            variable2.Method2(variable2A, variable2B),
            variable3.Method3(variable3A, variable3B)

    if (doSomething())
    {
        . . .
        if (doSomething())
        {
            . . .
        }
        . . .
    }


I>По поводу твоих придирок: Даже в книгах, за которые авторы деньги получают, в примерах весьма нередко можно найти какие-либо не относящиеся к рассматриваемому вопросу недочеты. Уж для упрощения ли или от авторской лени ... А я и вовсе не пытаюсь ничего продавать, так что не обессудь, мои примеры для людей обладающих способностью мыслить абстрактно.


Ну тогда извини
Re[2]: Минимизируйте область видимости переменной
От: igna Россия  
Дата: 30.10.08 10:45
Оценка:
Здравствуйте, Tilir, Вы писали:

T>    bool boSomethingUsefulOk = DoSomethingUseful(par1, par2, par3);
T>    if (boSomethingUsefulOk){
T>      // ...
T>    }
T>  }


А так не пробовал?:

    bool boSomethingUsefulOk = DoSomethingUseful(par1, par2, par3);
    if (boSomethingUsefulOk == true){
      // ...
    }
  }
Re[3]: Минимизируйте область видимости переменной
От: Tilir Россия http://tilir.livejournal.com
Дата: 30.10.08 11:05
Оценка:
Здравствуйте, igna, Вы писали:

I>А так не пробовал?:


I>
I>    bool boSomethingUsefulOk = DoSomethingUseful(par1, par2, par3);
I>    if (boSomethingUsefulOk == true){
I>      // ...
I>    }
I>  }
I>


У меня есть замечательная привычка в таких сравнениях писать константу до (чтобы не нарваться на присваивание):

    int iSomethingUsefulResult = DoSomethingUseful(par1, par2, par3);
    if (0 == iSomethingUsefulResult){
      // ...
    }
  }


Но делать такое в случае булевских переменных мне кажется избыточно. Аналогично в случае указателей. И там и там вобщемт всего два логических варианта -- TRUE/FALSE, либо NULL/NOT NULL и в обоих случаях if (pString) и соответственно if (!boFailed) вполне читабельны. Впрочем дело вкуса и ничего религиозного -- при соответствующих code guidelines я был бы согласен легко перестроится на явное сравнение.
Re: Минимизируйте область видимости переменной
От: Andrei F.  
Дата: 30.10.08 14:26
Оценка:
Здравствуйте, igna, Вы писали:

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 par1 = variable1.Method1(variable1A, variable1B);
  {
    var par2 = variable2.Method2(variable2A, variable2B);
    var par3 = variable3.Method3(variable3A, variable3B);
    if (DoSomethingUseful(par1, par2, par3)) {
        . . .
    }
  }
  
  DoSomethingAnotherUseful(par1);

И область видимости минимизируется, и отлаживать удобно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[2]: Минимизируйте область видимости переменной
От: igna Россия  
Дата: 30.10.08 16:04
Оценка:
Здравствуйте, Andrei F., Вы писали:

AF>А я пишу так:

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

AF>И область видимости минимизируется, и отлаживать удобно.

Я тоже так пишу, если par2 и par3 используются в теле блока if.
Re[11]: Минимизируйте область видимости переменной
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.10.08 22:39
Оценка:
Здравствуйте, igna, Вы писали:

I>Какая самодокументируемость повышается, если результат возвращаемый методом CreateTransglucator() помещается в переменную transglucator?


А если в переменную redTransglukator?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[12]: Минимизируйте область видимости переменной
От: igna Россия  
Дата: 31.10.08 08:46
Оценка:
Здравствуйте, AndrewVK, Вы писали:

I>>Какая самодокументируемость повышается, если результат возвращаемый методом CreateTransglucator() помещается в переменную transglucator?


AVK>А если в переменную redTransglukator?


Если вызовом CreateTransglucator(RED), то хрен редьки не слаще.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.