В ожидании ответа на вопрос Я хотел бы обсудить возможный план / детали реализации или вообще даже ответить, насколько сложно будет реализовать следующее и какие инструменты / методы необходимы для этого.:
(выдержка из указанного вопроса):
Предположим, вам необходимо реализовать множество (под) типов коллекций.Одним из аспектов является связанный с хранилищем : список , массив и т. Д., В то время как другой связанный с поведением : упорядочен, удалить только , наблюдаемый (тот, который запускает событие при каждом изменении) и т. Д.
Очевидно (снова), требование отображается непосредственно нахорошо известный шаблон проектирования Decorator , где аспект , связанный с хранением * ( список , массив ), будет украшен несколькими Поведенческий ( упорядоченный , наблюдаемый и т. д.).
Пока что я хотел бы предложить некоторую достаточно короткую реализацию в (Java-подобный)псевдокод, спрашивая, возможно ли реализовать следующее в Java или C # или, если нет, то на любом другом современном языке программирования:
Базовый интерфейс, который должна поддерживать каждая коллекция:
interface Collection {
[mutator]
public void add(object o);
[mutator]
public void remove(object o);
[accessor]
public object get(int i);
}
Хранение Аспект:
Список Реализация:
class List : Collection {
[mutator]
public void add(object o) { ... }
[mutator]
public void remove(object o) { ... }
[accessor]
public object get(int i) { ... }
}
Массив реализация:
class Array : Collection {
[mutator]
public void add(object o) { ... }
[mutator]
public void remove(object o) { ... }
[accessor]
public object get(int i) { ... }
}
Поведенческий аспект:
Потокобезопасный Декоратор:
typename<T> : where T is Collection
class ThreadSafe : Collection {
private T m_source;
private object m_lock = new object();
[mutator]
public void add(object o) {
using (m_lock) {
m_source.add();
}
}
[mutator]
public void remove(object o) { ... }
[accessor]
public object get(int i) { ... }
}
Наблюдаемый Декоратор:
class ChangeEvent {
public Collection Source { get; private set; }
public Method UpdateType { get; private set; }
}
interface Observer {
public notifyChange(ChangeEvent e);
}
typename<T> : where T is Collection
class Observable : Collection {
public Observer Observer { get; set; } // additional property
private T m_source;
[mutator]
public void add(object o) {
if (Observer != null) {
var event = new ChangeEvent() { Source = this, UpdateType = GetCurrentMethod() };
Observer.notifyChange(event);
}
m_source.add(o);
}
[mutator]
public void remove(object o) { ... }
[accessor]
public object get(int i) { ... }
}
Заказано Декоратор:
typename<T> : where T is Collection
class Ordered : Collection {
private T m_source;
[mutator]
public void add(object o) {
int idx = findProperPosition(); // assumed possible using the base Collection interface
...
m_source.add(o);
}
[mutator]
public void remove(object o) { ... }
[accessor]
public object get(int i) { ... }
}
Только для чтения Декоратор:
typename<T> : where T is Collection
class ReadOnly : Collection {
private T m_source;
[mutator]
public void add(object o) { throw IllegalOperationException(...); }
[mutator]
public void remove(object o) { throw IllegalOperationException(...); }
[accessor]
public object get(int i) { return m_source.get(i); }
}
Пока что выше приведен только псевдокод, но цель состоит в том, чтобы позволить клиентскому коду создавать множество видов коллекций, чтобы каждый вид мог объединять ровно один аспект хранилище с любым числом поведения связанных аспектов.Было бы неплохо иметь возможность создавать эти составные типы во время компиляции и супер-удобно, чтобы генерировать их даже во время выполнения.
Вопрос в том, как (считается любой современный язык программирования)?