Я думаю, что это очень хороший вопрос, поскольку он заставляет нас задуматься о том, как мы структурируем программное обеспечение.Структурирование программного обеспечения необходимо для создания уровня абстракции между кодом и его архитектурой.
В последнее время я пришел к выводу, что горизонтальное наслоение - это удобная техника, но вертикальное разбиение более полезно .Примером горизонтального наслоения может служить классический сценарий DAL-> BAL-> GUI, в то время как вертикальное разбиение делит приложение на функции, которые оно поддерживает.
Модель стека явно присутствуетв модели горизонтального наслоения.Но также при вертикальном разделении вы можете найти модель стека.Что мне особенно нравится в вертикальном разбиении, так это идея о том, что каждый из моих вертикальных срезов может иметь свой собственный горизонтальный стек слоев, идея, которая напоминает шаблоны, которые становятся все более и более популярными, как CQRS.Также могут быть зависимости между вертикальными разделами вашего приложения, опять-таки смоделированные как стек.Но иногда этого недостаточно , и вам нужна более сложная абстракция , чем стек, такой как граф .
Абстрагирование от этогоЯ думаю, что причина, по которой нам нравится думать в стеках , заключается в том, что мы можем видеть вещи на различных уровнях абстракции , помещая / выталкивая вещи в стек по требованию.Другие структуры, такие как Графики , иногда более подходят для описания таких проблем, как зависимости между компонентами, но они более сложны и, следовательно, не так удобны, как стеки.
Это такжепричина, по которой было исключено множественное наследование: граф зависимостей (множественное наследование) понять гораздо сложнее, чем простой стек (одиночное наследование).
Что еще можно смоделировать как стек?Честно говоря, я думаю, что то, что у нас здесь, довольно много, и вы получите очень далеко:
- Иерархии наследования (одиночное наследование)
- горизонтальные, архитектурные слои
- вертикальныеархитектурные слои (композиция элементов)
- простые линейные зависимости (последовательности вызовов, оболочки, фасады)