Фантазии на тему повторного использования в ООП...
От: richyape  
Дата: 23.01.12 02:09
Оценка:
...Или умный copy/past.

Предположим, что имеется следующая структура классов:

public class X
{
    public void Method() {}
    public void AnotherMethod() {}
}

public class Y
{
    public void Method() {}
    public void AnotherMethod() {}
}

public class B
{
    private X x;

    public B(X x) { this.x = x; }

    public void Method() { x.Method(); }
    public void AnotherMethod() {}
}

public class C
{
    private Y y;

    public C(Y y) { this.y = y; }

    public void Method() { y.Method(); }
    public void AnotherMethod() {}
}

public class A
{
    private B b;
    private C c;

    private string name;
    private string anotherName;
    private int count;
    private int anotherCount;

    public A(B b, C c, string name, string anotherName, int count, int anotherCount)
    {
        this.b = b;
        this.c = c;
        this.name = name;
        this.anotherName = anotherName;
        this.count = count;
        this.anotherCount = anotherCount;
    }

    public void ImportantMethod()
    {
        b.Method();

        this.name = "Some message...";
        this.count = 1234;

        c.Method();
    }

    public void AnotherImportantMethod()
    {
        b.AnotherMethod();

        this.anotherName = "Some another message...";
        this.anotherCount = 1357;

        c.AnotherMethod();
    }
}


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

Тулза в новых исходниках создаст следующее:

public class A
{
    private string name;
    private int count;

    public A(..., string name, int count)
    {
        ...
        this.name = name;
        this.count = count;
    }

    public void ImportantMethod()
    {
        ...

        this.name = "Some message...";
        this.count = 1234;

        ...
    }
}


Далее для каждого ипользуемого в методе класса тулза предложит на выбор:
1. Создать интерфейс по этому классу
2. Cоздать используемый класс вместе с используемыми методами

public class BServer // Первый вариант
{
    void Method();
}

public class C // Второй вариант
{
    public C(...) { ... }

    public void Method() { ... }
}

public class A
{
    private BServer b;
    private C c;

    private string name;
    private int count;

    public A(BServer b, C c, string name, int count)
    {
        this.b = b;
        this.c = c;
        this.name = name;
        this.count = count;
    }

    public void ImportantMethod()
    {
        b.Method();

        this.name = "Some message...";
        this.count = 1234;

        c.Method();
    }
}


Может быть и третий вариант в виде абстрактного класса с частичной реализацией. Тогда тулза будет предлагать выбор для каждого метода в зависимых классах.

И так далее по рекурсии...

Соответственно, если после этого мы укажем тулзе, что хотим повторно использовать метод AnotherImportantMethod из класса A, она проделает всю ту же работу, только для новых исходников будет использовать уже ранее скопированные. Т.е. в данном примере мы получим практически первоначальные классы A, B, C и так далее зависимые:

public class BServer
{
    void Method();
    void AnotherMethod();
}

public class C
{
    public C(...) { ... }

    public void Method() { ... }
    public void AnotherMethod() {}
}

public class A
{
    private BServer b;
    private C c;

    private string name;
    private string anotherName;
    private int count;
    private int anotherCount;

    public A(BServer b, C c, string name, string anotherName, int count, int anotherCount)
    {
        this.b = b;
        this.c = c;
        this.name = name;
        this.anotherName = anotherName;
        this.count = count;
        this.anotherCount = anotherCount;
    }

    public void ImportantMethod()
    {
        b.Method();

        this.name = "Some message...";
        this.count = 1234;

        c.Method();
    }

    public void AnotherImportantMethod()
    {
        b.AnotherMethod();

        this.anotherName = "Some another message...";
        this.anotherCount = 1357;

        c.AnotherMethod();
    }
}


Найдет ли подобная тулза применение?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.