[Этюд]Балансировка вызовов функций.
От: dotneter  
Дата: 21.02.11 12:11
Оценка: 2 (1)
Было ли?
x
.Open()
.Open()
.Close()
.Open()
.Close()
.Close();

На этапе компиляции проверить равенство количества вызовов Open и Close.
via reddit
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Talk is cheap. Show me the code.
Re: [Этюд]Балансировка вызовов функций.
От: Sinix  
Дата: 21.02.11 12:18
Оценка:
Здравствуйте, dotneter, Вы писали:

D>На этапе компиляции проверить равенство количества вызовов Open и Close.

D>via reddit
Как-то так (студии под рукой нет)
public static ICloseable<T> Open<T>(this T value) {}
public static T Close<T>(this ICloseable<T> value) {}

?
Re: [Этюд]Балансировка вызовов функций.
От: Пельмешко Россия blog
Дата: 21.02.11 14:21
Оценка:
Здравствуйте, dotneter, Вы писали:

D>Было ли?

D>
D>x
D>.Open()
D>.Open()
D>.Close()
D>.Open()
D>.Close()
D>.Close();

D>

D>На этапе компиляции проверить равенство количества вызовов Open и Close.
D>via reddit

А слева от x ну вот совсем ничего нету (например, присвоения) или я зря голову уже час ломаю?
Re[2]: [Этюд]Балансировка вызовов функций.
От: dotneter  
Дата: 21.02.11 14:51
Оценка:
Здравствуйте, Sinix, Вы писали:

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


D>>На этапе компиляции проверить равенство количества вызовов Open и Close.

D>>via reddit
S>Как-то так (студии под рукой нет)
S>
S>public static ICloseable<T> Open<T>(this T value) {}
S>public static T Close<T>(this ICloseable<T> value) {}
S>

S>?
Что то похожее.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Talk is cheap. Show me the code.
Re[2]: [Этюд]Балансировка вызовов функций.
От: dotneter  
Дата: 21.02.11 14:51
Оценка:
Здравствуйте, Пельмешко, Вы писали:

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


D>>Было ли?

D>>
D>>x
D>>.Open()
D>>.Open()
D>>.Close()
D>>.Open()
D>>.Close()
D>>.Close();

D>>

D>>На этапе компиляции проверить равенство количества вызовов Open и Close.
D>>via reddit

П>А слева от x ну вот совсем ничего нету (например, присвоения) или я зря голову уже час ломаю?

В смысле A y = x? Пусть будет если нужно, но вообще не обязательно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Talk is cheap. Show me the code.
Re[3]: [Этюд]Балансировка вызовов функций.
От: Пельмешко Россия blog
Дата: 21.02.11 14:55
Оценка:
Здравствуйте, dotneter, Вы писали:

D>но вообще не обязательно.


ёпрст, тогда ты взорвал моё мозг!
Re[2]: [Этюд]Балансировка вызовов функций.
От: mike_rs Россия  
Дата: 21.02.11 15:01
Оценка:
Здравствуйте, Sinix, Вы писали:

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


D>>На этапе компиляции проверить равенство количества вызовов Open и Close.

D>>via reddit
S>Как-то так (студии под рукой нет)
S>
S>public static ICloseable<T> Open<T>(this T value) {}
S>public static T Close<T>(this ICloseable<T> value) {}
S>

S>?

а можно на пальцах, как это защитит от open без close ?
Re[4]: [Этюд]Балансировка вызовов функций.
От: dotneter  
Дата: 21.02.11 15:03
Оценка:
Здравствуйте, Пельмешко, Вы писали:

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


D>>но вообще не обязательно.


П>ёпрст, тогда ты взорвал моё мозг!

Вообще, суть в балансировке, как она будет достигнута не столь важно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Talk is cheap. Show me the code.
Re[5]: [Этюд]Балансировка вызовов функций.
От: Пельмешко Россия blog
Дата: 21.02.11 15:39
Оценка: +1
Здравствуйте, dotneter, Вы писали:

D>Здравствуйте, Пельмешко, Вы писали:


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


D>>>но вообще не обязательно.


П>>ёпрст, тогда ты взорвал моё мозг!

D>Вообще, суть в балансировке, как она будет достигнута не столь важно.

Я и не могу достигнуть балансировку в случае:
x.Open();
без присваивания.
Re[6]: [Этюд]Балансировка вызовов функций.
От: dotneter  
Дата: 21.02.11 15:50
Оценка:
Здравствуйте, Пельмешко, Вы писали:

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


D>>Здравствуйте, Пельмешко, Вы писали:


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


D>>>>но вообще не обязательно.


П>>>ёпрст, тогда ты взорвал моё мозг!

D>>Вообще, суть в балансировке, как она будет достигнута не столь важно.

П>Я и не могу достигнуть балансировку в случае:

П>
П>x.Open();
П>
без присваивания.

Покажите вариант с присваиванием.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Talk is cheap. Show me the code.
Re[7]: [Этюд]Балансировка вызовов функций.
От: Пельмешко Россия blog
Дата: 21.02.11 16:49
Оценка: +1
Здравствуйте, dotneter, Вы писали:

D>Покажите вариант с присваиванием.


Как-то вот так:
static class Program
{
    public static void Main()
    {
        Bar list = new Bar()
            .Open()
            .Open()
            .Close()
            .Open()
            .Close()
            .Close();
    }
}

class Foo { }
class Foo<_> : Foo where _ : Foo { }
class Bar : Foo<Foo> { }

static class Extensions {
    public static _ Close<_>(this Foo<_> x) where _ : Foo { return default(_); }
    public static Foo<_> Open<_>(this _ x) where _ : Foo { return null; }
}

placeholder hell!
Re[8]: [Этюд]Балансировка вызовов функций.
От: samius Япония http://sams-tricks.blogspot.com
Дата: 21.02.11 18:26
Оценка:
Здравствуйте, Пельмешко, Вы писали:

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


D>>Покажите вариант с присваиванием.


П>Как-то вот так:

П>[c#]
П> Bar list = new Bar()
П> .Open()
П> .Open()
П> .Close()
П> .Open()
П> .Close()
П> .Close();
П>}
А что если
x.Open().Close().Check();

И сыграть на констрейнтах к Check... ПРавда пока не очень представляю, как именно.
Re: [Этюд]Балансировка вызовов функций.
От: AlexNek  
Дата: 21.02.11 19:09
Оценка:
А можно вообще не вызывать Close() напрямую и не делать его публиком? Тогда будет все автоматом.
using (x.Open())
{
}
Re[3]: [Этюд]Балансировка вызовов функций.
От: Аноним  
Дата: 22.02.11 00:27
Оценка: +1
Здравствуйте, dotneter, Вы писали:

D>>>via reddit


П>>А слева от x ну вот совсем ничего нету (например, присвоения) или я зря голову уже час ломаю?

D>В смысле A y = x? Пусть будет если нужно, но вообще не обязательно.

В оригинальном посте с reddit как раз обязательно. Но было бы любопытно увидеть решение в котором было бы необязательно (сомневаюсь только, что оно есть).
Re[4]: [Этюд]Балансировка вызовов функций.
От: dotneter  
Дата: 22.02.11 06:53
Оценка:
Здравствуйте, Аноним, Вы писали:

Я же написал, что главное в балансировке, как она будет достигнута не столь важно.
x.Open()... это псевдокод показывающий суть а не реализацию.
Можно использовать присвоение, можно return или вызов метода Check.
Talk is cheap. Show me the code.
Re: как-то так
От: Константин Л. Франция  
Дата: 22.02.11 09:04
Оценка:
[]

public class Foo
    {
        public Foo Open() { return this; }
        public Foo Close() { return this; }
    }

    public sealed class Balancer<T> where T : Foo
    {
        int count = 0;
        readonly T Target;

        public Balancer(T target)
        {
            Target = target;
        }

        public Balancer<T> Open()
        {
            Target.Open();
            ++count;
            return this;
        }

        public Balancer<T> Close()
        {
            Target.Close();
            --count;
            return this;
        }

        public bool Check()
        {
            return count == 0;
        }
    }

    public static class BalancerExt
    {
        public static Balancer<T> OpenFirst<T>(this T obj) where T : Foo
        {
            return new Balancer<T>(obj).Open();
        }        
    }

   
   ......

    var ok = new Foo().OpenFirst().Open().Close().Close().Check();
        
    }


в с++ получилось бы еще красивее
Re: [Этюд]Балансировка вызовов функций.
От: Klapaucius  
Дата: 22.02.11 11:29
Оценка:
Здравствуйте, dotneter, Вы писали:

D>На этапе компиляции проверить равенство количества вызовов Open и Close.


public class Box<T>
{
    readonly private T value;

    public Box(T value)
    {
        this.value = value;
    }

    public T Unbox() { return value; }
}

public static class Utils
{
    public static Box<T> Open<T>(this T x)
    {
        return new Box<T>(x);
    }

    public static T Close<T> (this Box<T> box)
    {
        return box.Unbox();
    }
}

class Program
{
    static void Main()
    {
        int i = 1.Open().Open().Close().Open().Close().Close(); //OK
        //int i = 1.Open().Close().Open().Close().Close(); //Error
    }
}
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[2]: как-то так
От: Sinix  
Дата: 22.02.11 11:31
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>в с++ получилось бы еще красивее


Зачем так сложно? Достаточно варианта ув. Пельмешко:
x = x.Open().Open().Close().Open().Close().Close();
Re[2]: [Этюд]Балансировка вызовов функций.
От: samius Япония http://sams-tricks.blogspot.com
Дата: 22.02.11 11:34
Оценка:
Здравствуйте, Klapaucius, Вы писали:

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


D>>На этапе компиляции проверить равенство количества вызовов Open и Close.


K>
K>        int i = 1.Open().Open().Close().Open().Close().Close(); //OK
K>        //int i = 1.Open().Close().Open().Close().Close(); //Error
K>

Однако в условии нет указания по поводу того что Close должен быть обязательно после Open. Нужно лишь проверить равенство числа вызовов.
Re[9]: [Этюд]Балансировка вызовов функций.
От: Klapaucius  
Дата: 22.02.11 11:40
Оценка:
Здравствуйте, samius, Вы писали:
S>А что если
S>x.Open().Close().Check();

S>И сыграть на констрейнтах к Check... ПРавда пока не очень представляю, как именно.


Это примерно то же самое, что и с присваиванием, если считать что Check() — метод типа, к которому принадлежит значение x, констрейнты тут вообще не нужны, да и вообще с Check — не интересно.
А без Check или присваивания, я думаю, не сделать, ведь каждое подвыражение обязано быть корректным само по себе. Вот если бы компилятор выдавал ошибку "значение выражения ничему не присвоено" для всего кроме void, тогда можно было бы и без Check и без присваивания обойтись.
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.