В настоящее время я работаю над проектом, который включает создание слоя абстракции. Цель проекта — поддержка нескольких реализаций серверного программного обеспечения в случае, если мне может понадобиться перейти на него. Список функций, которые нужно абстрагировать, довольно длинный, поэтому я хочу рассмотреть довольно безболезненный способ сделать это.
Другие приложения смогут взаимодействовать с моим проектом и совершать вызовы, которые в конечном итоге сведутся к передаче на сервер, который я использую.
Вот в чем проблема. У меня не так много опыта в этой области, и я действительно не знаю, как сделать так, чтобы это не превратилось в бутерброд смерти. Вот цепочка примерно того, как это должно выглядеть (и чего я пытаюсь достичь).
/*
Software that is dependent on mine
|
Public API layer (called by other software)
|
Abstraction between API and my own internal code (this is the issue)
|
Internal code (this gets replaced per-implementation, as in, each implementation needs its own layer of this, so it's a different package of entirely different classes for each implementation)
|
The software I'm actually using to write this (which is called by the internal code)
*/
Слой абстракции (очевидно, тот, что в самом центре) — это то, что я изо всех сил пытаюсь собрать.
Теперь я застрял только на одном глупом аспекте. Как я могу сделать уровень абстракции чем-то, что не является серией
public void someMethod() {
if(Implementation.getCurrentImplementation() == Implementation.TYPE1) {
// whatever we need to do for this specific implementation
else {
throw new NotImplementedException();
}
}
(простите псевдокод; также представьте ту же ситуацию, но для переключателя/кейса, поскольку это, вероятно, лучше, чем цепочка if для каждого метода) для каждого метода в каждом классе уровня абстракции.
Это кажется очень элементарным, но я не могу придумать логического решения для решения этой проблемы. Если я не ясно объяснил свою точку зрения, пожалуйста, объясните, что мне нужно уточнить. Может, я неправильно обо всем этом думаю?