Однажды я прочитал колонку, где они сравнили 3 модели: модель спагетти, модель Лазанья и модель Равиоли.
В Спагетти модель, весь код взаимосвязан между собой, нет четкой структуры. Это ужасно, и мы, вероятно, все можем согласиться на это.
В модели Lasagna код разделен на разные уровни, и только уровень более высокого уровня может получить доступ к слою более низкого уровня, а не наоборот.
В модели Ravioli модель сгруппирована в более мелкие модули. Каждый модуль предоставляет только то, что должно быть раскрыто, но каждый модуль может получить доступ ко всем другим модулям.
Около 10 лет назад мне показалось, что модель Равиоли лучше, чем модель Лазанья. В конце концов, в Java у вас также есть модули Java, которые могут легко вызвать друг друга (и у меня сложилось впечатление, что между всеми различными модулями Java не существует реальной структуры). Для меня модель Лазаньи казалась результатом не-объектно-ориентированного старого кода, в то время как модель Равиоли казалась более современной, более объектно-ориентированной.
В настоящее время я, как правило, возвращаюсь к модели Лазанья, но с встроенной моделью Ravioli.Это:
- Приложение построено с использованием различных слоев, как и в модели Лазанья
- Но в слоях, код по-прежнему расколото между различными модулями, которые могут получить доступ друг к другу, как в равиоли модель.
Некоторые круговые ссылки могут быть сложными или невозможными для удаления. Пример следующий: Предположим, что у вас есть класс FileWriter в вашем приложении и класс Debug. Класс Debug будет нуждаться в классе FileWriter, так как он должен записывать файлы с отладочной информацией. С другой стороны, класс FileWriter также может использовать класс Debug.
Обратите внимание, что круговая ссылка в этом примере может уже привести к проблемам (класс FileWriter может вызывать класс Debug при записи строки, но класс Debug использует класс FileWriter для записи отладочной информации, результат: переполнение стека) ,
В этом случае проблему можно легко решить, не используя класс FileWriter в классе Debug, но использовать родные iostreams (если вы разрабатываете на C++). В других случаях проблему можно решить гораздо сложнее.
Подозрение подтверждено! – mclark1129