Хотя простота понимания и в некоторой степени заменяемые компоненты, безусловно, являются вескими причинами, не менее важная причина (и, вероятно, причина, по которой слои были изобретены в первую очередь) связана с точки зрения обслуживания программного обеспечения. Суть в том, что зависимости могут привести к поломке.
Например, предположим, что A зависит от B. Так как от A ничего не зависит, разработчики могут свободно менять A на свой контент, не беспокоясь о том, что они могут сломать что-либо, кроме A. Однако, если разработчик хочет изменить B, тогда любое изменение сделанное в B может потенциально сломать A. Это было частой проблемой в первые компьютерные дни (например, структурированная разработка), когда разработчики исправляли ошибку в одной части программы, и это приводило к ошибкам в явно не связанных частях программы в других местах. Все из-за зависимостей.
Чтобы продолжить пример, теперь предположим, что A зависит от B, а B зависит от A. IOW, круговая зависимость. Теперь, когда бы ни вносилось изменение, оно могло бы сломать другой модуль. Изменение B может все еще сломать A, но теперь изменение A может также сломать B.
Итак, в вашем первоначальном вопросе, если вы работаете в небольшой команде для небольшого проекта, то все это в значительной степени излишне, потому что вы можете свободно менять модули по своему усмотрению. Однако, если вы работаете над масштабным проектом, если все модули зависят от других, то каждый раз, когда требуется изменение, он может потенциально сломать другие модули. В большом проекте знание всех воздействий может быть трудно определить, поэтому вы, скорее всего, пропустите некоторые воздействия.
Это ухудшается в большом проекте, где есть много разработчиков (например, те, кто работает только на уровне A, некоторый уровень B и некоторый уровень C). Поскольку становится вероятным, что каждое изменение должно быть рассмотрено / обсуждено с участниками на других уровнях, чтобы убедиться, что ваши изменения не нарушаются и не заставляют переделывать то, над чем они работают. Если ваши изменения навязывают изменения другим, то вы должны убедить их, что они должны внести изменения, потому что они не захотят брать на себя больше работы только потому, что у вас есть этот замечательный новый способ работы в вашем модуле. IOW, бюрократический кошмар.
Но если вы ограничиваете зависимости от A, зависит от B, B зависит от C, тогда только люди уровня C должны координировать свои изменения в обеих командах. Слой B должен координировать изменения только с командой уровня A, а команда уровня A может делать все, что захочет, потому что их код не влияет на уровень B или C. Поэтому в идеале вы должны спроектировать свои слои так, чтобы уровень C изменился очень немного, слой B несколько меняется, а слой A выполняет большинство изменений.