Совет минимизировать область видимости переменной общеизвестен. Минимальная область видимости это область видимости неименованной переменной, тем не менее часто избегают писать так:
Здравствуйте, igna, Вы писали:
I>Совет минимизировать область видимости переменной общеизвестен. Минимальная область видимости это область видимости неименованной переменной, тем не менее часто избегают писать так:
I>
Здравствуйте, igna, Вы писали:
I>Совет минимизировать область видимости переменной общеизвестен. Минимальная область видимости это область видимости неименованной переменной, тем не менее часто избегают писать так:
I>
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 в имени, так что дополнительное именование переменной ничего не даст.
Здравствуйте, igna, Вы писали:
I>Это то же, что и мой второй вариант. Разумеется, вместо par1, par2 и par3 будут использованы более информативные имена, как впрочем и вместо variable1, Method1 и так далее.
Ну так надо было бы так и написать, а не вводить людей в заблуждения
I>Так, в твоем примере Method1 будет скорее всего называться как-нибудь со словом Customer в имени, так что дополнительное именование переменной ничего не даст.
Прошу переписать пример чтобы быделенное действительно имело место
Здравствуйте, 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.
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
Здравствуйте, igna, Вы писали:
I>На мой взгляд указание того, что URI является base address ничего не дает
Это дело привычки. Если ты привык к синтаксису 1 то вполне нормально. Мне же было сложно определить какой класс мы создаем (т.е. понадобилось искать, а не "кинуть взгляд" и понять). I>зато объявление переменной заставляет смотреть, не используется ли она где-нибудь внутри using.
Так уж и заставляет
В общем, я за первый вариант.
Самое главное в любом подходе -- постоянство. Сами по себе оба подхода хороши (все зависит от привычек), но ни в коем случае не стоит их смешивать (часть вызовов так/часть так).
Здравствуйте, igna, Вы писали:
I>Совет минимизировать область видимости переменной общеизвестен. Минимальная область видимости это область видимости неименованной переменной, тем не менее часто избегают писать так:
Речь о шарпе? Тогда никакой разницы нет. Переменная становится доступной для сборщика мусора сразу после последнего использования.
Здравствуйте, 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)) {
. . .
}
Здравствуйте, Lloyd, Вы писали:
L>Речь о шарпе? Тогда никакой разницы нет. Переменная становится доступной для сборщика мусора сразу после последнего использования.
Речь об области видимости, а не о времени жизни. То есть думаем о человеке, читающем программу.
Здравствуйте, igna, Вы писали:
L>>Речь о шарпе? Тогда никакой разницы нет. Переменная становится доступной для сборщика мусора сразу после последнего использования.
I>Речь об области видимости, а не о времени жизни. То есть думаем о человеке, читающем программу.
И в качестве средства заботы о человеке предлагаете инлайнить переменные?
Вы уверены, что читающий будет вам за это благодарен?
Здравствуйте, 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()
{
// 1int a = f2(f1(), f1());
// 2int b = f1();
int c = f2(b, b);
assert(a != c);
}
Здравствуйте, igna, Вы писали:
I>Затем же, зачем рекомендуют минимизировать область видимости переменной.
Приведенный тобой пример это не минимизация области видимости переменной, которая имеет смыл только если переменная необходима. Ты решаешь вопрос — заводить переменную вообще или нет.
Что тут можно сказать. Самое главное вообще в жизни, и особенно более в программировании это здравый смысл. Придерживаться поведения, диктуемого здравым смыслом, а не фанатически следовать какой-то одной методике, подхваченной где-то.
Так вот. Методика говорит — "не заводите переменных без надобности". Другая методика говорит — "код должен быть самодокументируемым".
Тут есть противоречие, ибо выделение переменной (скажем, в случае твоего примера) повышает самодокументируемость, но вводит ненужную перемернную.
Как понять — какой методике следовать? Это решает здравый смысл.
И объяснить тебе этого полностью с покрытием каждого варианта и частного случая я не могу.
Потому что если бы мог, то фиг бы я тебе это объяснил. Я в таком случае бы написал программу, которая преобразует поганый код в отличный, и заныкал бы ее себе . После чего разбогател бы, эксплуатируя толпы индусов и превращая их ХреноКод (tm) в Мега Шедевры (tm) и демонстрируя оные на выставках.
Re[10]: Минимизируйте область видимости переменной
Здравствуйте, fmiracle, Вы писали:
F>Тут есть противоречие, ибо выделение переменной (скажем, в случае твоего примера) повышает самодокументируемость, но вводит ненужную перемернную.
Последнее всегда верно (к сожалению), а вот с самодокументируемостью дело обстоит так далеко не всегда. Какая самодокументируемость повышается, если результат возвращаемый методом CreateTransglucator() помещается в переменную transglucator? И когда видишь, что один и тот же человек пишет
if (DoSomethingUseful(transglucatorFactory.CreateTransglucator())) {
. . .
}
, то думаешь, что его пугает синтаксис со вложенными скобками. А программа нисколько не становится понятнее, от того что в ней слово transglucator упоминается четыре раза вместо одного.
Здравствуйте, VladD2, Вы писали:
VD>Это удобно при отладке. Ты видишь промежуточные значения без захода в функции.
Вот такое тоже удобно при отладке:
var par1 = variable1.Method1(variable1A, variable1B);
if (DoSomethingUseful(par1)) {
. . .
}
Но чаще пишут все же:
if (DoSomethingUseful(variable1.Method1(variable1A, variable1B)) {
. . .
}
А как только появляются длинные списки параметров, появляются и промежуточные переменные, лишь бы всунуть соответствующие круглые скобки в одну строку. Хотя честно говоря непонятно, чем круглые скобки "хуже" фигурных.
Re[10]: Минимизируйте область видимости переменной
Здравствуйте, Lloyd, Вы писали:
L>Ну так вот и ответь, зачем.
Это просто, она мешается. Например возникает необходимость добавить еще один вызов DoSomethingUseful внутри брока if:
var par1 = variable1.Method1(variable1A, variable1B);
var par2 = variable2.Method2(variable2A, variable2B);
var par3 = variable3.Method3(variable3A, variable3B);
if (DoSomethingUseful(par1, par2, par3)) {
. . .
var par1a = variable1.Method1(variable1A, variable1B);
var par2a = variable2.Method2(variable2A, variable2B);
var par3a = variable3.Method3(variable3A, variable3B);
if (DoSomethingUseful(par1a, par2a, par3)) {
. . .
}
. . .
}
Компилируем, запускаем программу, некоторое время работаем с ней. Вроде все нормально, но что-то не так. Через пару часов обнаруживаем, что во втором вызове по ошибке использован параметр первого.
I>, то думаешь, что его пугает синтаксис со вложенными скобками. А программа нисколько не становится понятнее, от того что в ней слово transglucator упоминается четыре раза вместо одного.
Фабрика трансглюкаторов что-то умеет создавать кроме трансглюкаторов?
Re[11]: Минимизируйте область видимости переменной
Здравствуйте, igna, Вы писали:
I>Здравствуйте, Lloyd, Вы писали:
L>>Ну так вот и ответь, зачем.
I>Это просто, она мешается. Например возникает необходимость добавить еще один вызов DoSomethingUseful внутри брока if:
...
I>А ведь все было так просто:
I>
Здравствуйте, samius, Вы писали:
S>Здравствуйте, igna, Вы писали:
I>>А ведь все было так просто:
[]
S>Это просто? За такое дублирование отстреливают. ExtractMethod!!!
А чтобы не плодить 6 параметров, можно обойтись лямбдой
Re[12]: Минимизируйте область видимости переменной
По поводу твоих придирок: Даже в книгах, за которые авторы деньги получают, в примерах весьма нередко можно найти какие-либо не относящиеся к рассматриваемому вопросу недочеты. Уж для упрощения ли или от авторской лени ... А я и вовсе не пытаюсь ничего продавать, так что не обессудь, мои примеры для людей обладающих способностью мыслить абстрактно.
Здравствуйте, igna, Вы писали:
L>>Ну так вот и ответь, зачем.
I>Это просто, она мешается. Например возникает необходимость добавить еще один вызов DoSomethingUseful внутри брока if:
Бредовый какой-то аргумент. Давай нормальные имена и ничего не будет мешаться.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[11]: Минимизируйте область видимости переменной
Здравствуйте, igna, Вы писали:
I>Компилируем, запускаем программу, некоторое время работаем с ней. Вроде все нормально, но что-то не так. Через пару часов обнаруживаем, что во втором вызове по ошибке использован параметр первого. I>А ведь все было так просто: igna, ты сам себе придумываешь проблемы, а потом их с успехом решаешь.
P.S. Я еще раз настоятельно прошу писать примеры с осмысленными именами! Потому как совсем не видно как будет выглядеть код написанный по твоему подходу. Вполне возможно вопросы отпадут сами собой.
Здравствуйте, igna, Вы писали:
VD>>Это удобно при отладке. Ты видишь промежуточные значения без захода в функции.
I>Вот такое тоже удобно при отладке:
I>
I> var par1 = variable1.Method1(variable1A, variable1B);
I> if (DoSomethingUseful(par1)) {
I> . . .
I> }
I>
I>Но чаще пишут все же:
Чаще как раз пишут с заведением промежуточных переменных.
В общем, кури Рефакторинг Фаулера. Там есть объяснения многого из того, как делать не стоит. Про временные переменные там вроде тоже было. Только не помню, за них или против.
Здравствуйте, Lloyd, Вы писали:
L>В общем, кури Рефакторинг Фаулера. Там есть объяснения многого из того, как делать не стоит. Про временные переменные там вроде тоже было. Только не помню, за них или против.
Он написал, что "за", только если они являются поясняющими, но сам использует их редко.
Здравствуйте, 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)) {
не говоря уже о том, что вариант с внесением всего что можно в скобки условия порождает такие варианты как
for (int i = 0; i != lstrlenA(str); ++i){
//...
}
тогда как очевидно, что длину строки нужно вычислять вне цикла (если строка не изменяется внутри) или явным образом пересчитывать внутри, если изменяется.
Короче общая идея такая: фанатизм с ограничением области видимости ни к чему хорошему не приводит. Область должна быть наивозможно узкой, но не уже, чем требует здравый смысл, удобность чтения и формирование процедурной абстракции.
Здравствуйте, 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>По поводу твоих придирок: Даже в книгах, за которые авторы деньги получают, в примерах весьма нередко можно найти какие-либо не относящиеся к рассматриваемому вопросу недочеты. Уж для упрощения ли или от авторской лени ... А я и вовсе не пытаюсь ничего продавать, так что не обессудь, мои примеры для людей обладающих способностью мыслить абстрактно.
У меня есть замечательная привычка в таких сравнениях писать константу до (чтобы не нарваться на присваивание):
int iSomethingUsefulResult = DoSomethingUseful(par1, par2, par3);
if (0 == iSomethingUsefulResult){
// ...
}
}
Но делать такое в случае булевских переменных мне кажется избыточно. Аналогично в случае указателей. И там и там вобщемт всего два логических варианта -- TRUE/FALSE, либо NULL/NOT NULL и в обоих случаях if (pString) и соответственно if (!boFailed) вполне читабельны. Впрочем дело вкуса и ничего религиозного -- при соответствующих code guidelines я был бы согласен легко перестроится на явное сравнение.
Здравствуйте, 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);
И область видимости минимизируется, и отлаживать удобно.
Здравствуйте, igna, Вы писали:
I>Какая самодокументируемость повышается, если результат возвращаемый методом CreateTransglucator() помещается в переменную transglucator?
А если в переменную redTransglukator?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
Здравствуйте, AndrewVK, Вы писали:
I>>Какая самодокументируемость повышается, если результат возвращаемый методом CreateTransglucator() помещается в переменную transglucator?
AVK>А если в переменную redTransglukator?
Если вызовом CreateTransglucator(RED), то хрен редьки не слаще.