Каков наилучший метод создания масштабируемого (расширяемого), ремонтопригодного и слабо связанного программного обеспечения?

StackOverflow https://stackoverflow.com/questions/3888095

Вопрос

Я поиграл с концепцией "модуля", которую реализуют некоторые фреймворки mvc, и это кажется хорошим решением, а также с TDD, но я думаю, что должно быть что-то большее, например, шаблон проектирования, который я пропустил (я знаю только несколько), который позволит мне создавать приложения, которые могут расти (в коде) без ограничений.

Есть какие-нибудь мысли?

Редактировать :Еще одной хорошей особенностью модулей является то, что они могут быть построены таким образом, чтобы не зависеть от приложений, поэтому их можно использовать повторно.

Это было полезно?

Решение

В книге "Факты и ошибки программной инженерии" Роберт Л.Гласс говорит:

Факт 15.Повторное использование в малом - это хорошо решаемая проблема.

Факт 16.Повторное использование в целом остается по большей части нерешенной проблемой.

Факт 17.Повторное использование в целом лучше всего работает в семействах связанных систем.

Другими словами, вы можете повторно использовать модули, но только между приложениями, которые работают очень похоже.Попытка сделать модули настолько универсальными, чтобы вы могли повторно использовать их в Любой применение - это слишком сложно.В конечном итоге вы создаете модули, которые настолько настраиваемы, что они чрезмерно сложны в использовании и содержат много кода для обработки сценариев, которые бесполезны для данного приложения.

Вам было бы лучше написать пользовательский модуль для каждого приложения, который делает именно то, что нужно каждому приложению, и не более.Это особенно важно для такого языка, как PHP, где код загружается при каждом запросе, поэтому объем кода оказывает значительное влияние на производительность.

Повторное использование более мелкозернистой функциональности отличается.Использование, скажем, ведения журнала, в разных приложениях достаточно схоже, независимо от того, насколько приложения отличаются друг от друга.Вот почему большинство фреймворков действительно хорошо справляются с классами общего назначения в стиле сервиса.


Повторный комментарий от @A_Var:

Вы можете сделать класс многоразовым, если заранее знаете диапазон возможных функциональных возможностей и, следовательно, части, которые должны быть расширяемыми.Это относительно просто для простого класса, который одинаково используется в каждом приложении.Я упомянул пример ведения журнала.Это то, что называется Стеклом повторное использование в малом.

Но мы не говорим о простых классах.Если вы попытаетесь сделать то же самое со сложным модулем (подумайте о нескольких классах для обработки нескольких экранов, форм, разной схемы базы данных и т.д.), Слишком сложно написать код, который был бы достаточно общим, чтобы охватить все конкретные потребности каждого приложения.В конечном итоге вам понадобится Еще кода в общем модуле, чем общий код, который вам понадобился бы для написания отдельных модулей для каждого приложения.

Кроме того, тестирование становится очень дорогостоящим, поскольку любое изменение, которое вы вносите в базовый модуль, требует повторного тестирования ВСЕ приложения, которые используют и расширяют его.

В конце концов, написание нового модуля для каждого приложения требует меньше усилий, и вы можете добиться максимальной эффективности, используя повторно используемые компоненты, которые являются более мелкозернистыми.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top