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

A>А зачем?


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

L>Это самоцель? Зачем без переменной? В чем преимущество? Пока вроде только недостатки были найдены.


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

L>>Это самоцель? Зачем без переменной? В чем преимущество? Пока вроде только недостатки были найдены.


I>Ответил здесь
Автор: igna
Дата: 29.10.08
.


Ну так вот и ответь, зачем.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re: Возможно лучшее форматирование
От: igna Россия  
Дата: 29.10.08 15:29
Оценка:
Возможно лучше форматировать так:

    if (
        DoSomethingUseful(
            variable1.Method1(variable1A, variable1B),
            variable2.Method2(variable2A, variable2B),
            variable3.Method3(variable3A, variable3B)
        )
    ) {
        . . .
    }
Re: Минимизируйте область видимости переменной
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.10.08 15:57
Оценка: +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>


Это удобно при отладке. Ты видишь промежуточные значения без захода в функции.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Минимизируйте область видимости переменной
От: fmiracle  
Дата: 29.10.08 17:58
Оценка: +1
Здравствуйте, igna, Вы писали:

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


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

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

Так вот. Методика говорит — "не заводите переменных без надобности". Другая методика говорит — "код должен быть самодокументируемым".
Тут есть противоречие, ибо выделение переменной (скажем, в случае твоего примера) повышает самодокументируемость, но вводит ненужную перемернную.
Как понять — какой методике следовать? Это решает здравый смысл.

И объяснить тебе этого полностью с покрытием каждого варианта и частного случая я не могу.
Потому что если бы мог, то фиг бы я тебе это объяснил. Я в таком случае бы написал программу, которая преобразует поганый код в отличный, и заныкал бы ее себе . После чего разбогател бы, эксплуатируя толпы индусов и превращая их ХреноКод (tm) в Мега Шедевры (tm) и демонстрируя оные на выставках.
Re[10]: Минимизируйте область видимости переменной
От: igna Россия  
Дата: 30.10.08 06:05
Оценка:
Здравствуйте, fmiracle, Вы писали:

F>Тут есть противоречие, ибо выделение переменной (скажем, в случае твоего примера) повышает самодокументируемость, но вводит ненужную перемернную.


Последнее всегда верно (к сожалению), а вот с самодокументируемостью дело обстоит так далеко не всегда. Какая самодокументируемость повышается, если результат возвращаемый методом CreateTransglucator() помещается в переменную transglucator? И когда видишь, что один и тот же человек пишет

    if (DoSomethingUseful(transglucatorFactory.CreateTransglucator())) {
        . . .
    }


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

    Transglucator transglucator = transglucatorFactory.CreateTransglucator();
    Glucatransor glucatransor = glucatransorFactory.CreateGlucatransor();
    AnotherShit anotherShit = anotherShitFactory.CreateAnotherShit();
    if (DoSomethingUseful(transglucator, glucatransor, anotherShit)) {
        . . .
    }


вместо

    if (
        DoSomethingUseful(
            transglucatorFactory.CreateTransglucator(),
            glucatransorFactory.CreateGlucatransor(),
            anotherShitFactory.CreateAnotherShit()
        )
    ) {
        . . . 
    }


, то думаешь, что его пугает синтаксис со вложенными скобками. А программа нисколько не становится понятнее, от того что в ней слово transglucator упоминается четыре раза вместо одного.
Re[2]: Минимизируйте область видимости переменной
От: igna Россия  
Дата: 30.10.08 06:13
Оценка:
Здравствуйте, VladD2, Вы писали:

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


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

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


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

    if (DoSomethingUseful(variable1.Method1(variable1A, variable1B)) {
        . . .
    }


А как только появляются длинные списки параметров, появляются и промежуточные переменные, лишь бы всунуть соответствующие круглые скобки в одну строку. Хотя честно говоря непонятно, чем круглые скобки "хуже" фигурных.
Re[10]: Минимизируйте область видимости переменной
От: igna Россия  
Дата: 30.10.08 06:27
Оценка:
Здравствуйте, 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)) {
            . . .
        }
        . . .
    }


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

А ведь все было так просто:

    if (
        DoSomethingUseful(
            variable1.Method1(variable1A, variable1B),
            variable2.Method2(variable2A, variable2B),
            variable3.Method3(variable3A, variable3B)
        )
    ) {
        . . .
        if (
            DoSomethingUseful(
                variable1.Method1(variable1A, variable1B),
                variable2.Method2(variable2A, variable2B),
                variable3.Method3(variable3A, variable3B)
            )
        ) {
            . . .
        }
        . . .
    }
Re[4]: Минимизируйте область видимости переменной
От: igna Россия  
Дата: 30.10.08 06:30
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>Я вот что имел ввиду:


Да, спасибо, я понял. Просто не упустил случая показать, как написал бы в этом случае сам.
Re[11]: Минимизируйте область видимости переменной
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.10.08 06:58
Оценка:
Здравствуйте, igna, Вы писали:

I>
I>    Transglucator transglucator = transglucatorFactory.CreateTransglucator();
I>    Glucatransor glucatransor = glucatransorFactory.CreateGlucatransor();
I>    AnotherShit anotherShit = anotherShitFactory.CreateAnotherShit();
I>    if (DoSomethingUseful(transglucator, glucatransor, anotherShit)) {
I>        . . .
I>    }
I>


I>, то думаешь, что его пугает синтаксис со вложенными скобками. А программа нисколько не становится понятнее, от того что в ней слово transglucator упоминается четыре раза вместо одного.


Фабрика трансглюкаторов что-то умеет создавать кроме трансглюкаторов?
Re[11]: Минимизируйте область видимости переменной
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.10.08 07:00
Оценка:
Здравствуйте, igna, Вы писали:

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


L>>Ну так вот и ответь, зачем.


I>Это просто, она мешается. Например возникает необходимость добавить еще один вызов DoSomethingUseful внутри брока if:

...

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>                variable1.Method1(variable1A, variable1B),
I>                variable2.Method2(variable2A, variable2B),
I>                variable3.Method3(variable3A, variable3B)
I>            )
I>        ) {
I>            . . .
I>        }
I>        . . .
I>    }
I>

Это просто? За такое дублирование отстреливают. ExtractMethod!!!
Re: Минимизируйте область видимости переменной
От: yumi  
Дата: 30.10.08 07:10
Оценка:
Я в прошлом проекте видел как люди делают так:
    {
        var par1 = variable1.Method1(variable1A, variable1B);
        var par2 = variable2.Method2(variable2A, variable2B);
        var par3 = variable3.Method3(variable3A, variable3B);
        if (DoSomethingUseful(par1, par2, par3)) {
            . . .
        }
    }
Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
Re[12]: Минимизируйте область видимости переменной
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.10.08 07:13
Оценка:
Здравствуйте, samius, Вы писали:

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


I>>А ведь все было так просто:

[]

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


А чтобы не плодить 6 параметров, можно обойтись лямбдой
Re[12]: Минимизируйте область видимости переменной
От: igna Россия  
Дата: 30.10.08 07:15
Оценка:
Здравствуйте, samius, Вы писали:

S>Фабрика трансглюкаторов что-то умеет создавать кроме трансглюкаторов?


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

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


Ты опять придираешься. Речь не о том, а о том, что вместо например:

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


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

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


По поводу твоих придирок: Даже в книгах, за которые авторы деньги получают, в примерах весьма нередко можно найти какие-либо не относящиеся к рассматриваемому вопросу недочеты. Уж для упрощения ли или от авторской лени ... А я и вовсе не пытаюсь ничего продавать, так что не обессудь, мои примеры для людей обладающих способностью мыслить абстрактно.
Re[2]: Минимизируйте область видимости переменной
От: igna Россия  
Дата: 30.10.08 07:29
Оценка:
Здравствуйте, yumi, Вы писали:

Y>Я в прошлом проекте видел как люди делают так:

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


IMHO это лучше, чем без внешних фигурных скобок, но внутри блока if переменные все же видны.
Re[8]: Минимизируйте область видимости переменной
От: igna Россия  
Дата: 30.10.08 07:31
Оценка:
Здравствуйте, Aikin, Вы писали:

A>А зачем?


Ответил здесь
Автор: igna
Дата: 30.10.08
.
Re[11]: Минимизируйте область видимости переменной
От: Lloyd Россия  
Дата: 30.10.08 07:42
Оценка: +2 -1
Здравствуйте, igna, Вы писали:

L>>Ну так вот и ответь, зачем.


I>Это просто, она мешается. Например возникает необходимость добавить еще один вызов DoSomethingUseful внутри брока if:


Бредовый какой-то аргумент. Давай нормальные имена и ничего не будет мешаться.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[11]: Минимизируйте область видимости переменной
От: Aikin Беларусь kavaleu.ru
Дата: 30.10.08 07:43
Оценка: +2
Здравствуйте, igna, Вы писали:

I>Компилируем, запускаем программу, некоторое время работаем с ней. Вроде все нормально, но что-то не так. Через пару часов обнаруживаем, что во втором вызове по ошибке использован параметр первого.

I>А ведь все было так просто:
igna, ты сам себе придумываешь проблемы, а потом их с успехом решаешь.



P.S. Я еще раз настоятельно прошу писать примеры с осмысленными именами! Потому как совсем не видно как будет выглядеть код написанный по твоему подходу. Вполне возможно вопросы отпадут сами собой.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.