Существенная разница, которую вы затрагиваете, я думаю:
группа языков 1. Фактические методы, которые вызываются при вызове, например, object.method1, object.method2, object.method3, могут изменяться в течение всего времени существования объекта.
группа языков 2. Фактические методы, которые вызываются при вызове, например, object.method1, object.method2, object.method3, не могут изменяться в течение всего времени существования объекта.
Языки в группе 1, как правило, имеют динамическую типизацию и не поддерживают интерфейсы, проверенные во время компиляции, а языки в группе 2, как правило, имеют статическую типизацию и поддерживают замкнутые интерфейсы во время компиляции.
Я бы сказал, что все принципы ОО применимы к обоим, но
В группе 1 может потребоваться дополнительное (явное) кодирование для реализации проверок (во время выполнения вместо времени компиляции), чтобы утверждать, что новые объекты создаются со всеми соответствующими методами, подключенными для выполнения контракта интерфейса, как нет проверки соглашения об интерфейсе во время компиляции (если вы хотите сделать код группы 1 более похожим на группу 2)
в группе 2 может потребоваться дополнительное кодирование для моделирования изменений фактического метода, вызванного для вызова метода, с использованием дополнительных флагов состояния для вызова подметодов, или для обобщения метода или набора методов в ссылке к одному из нескольких объектов, прикрепленных к основному объекту, где каждый из нескольких объектов имеет разные реализации методов (если вы хотите сделать код группы 2 более похожим на код группы 1)
сами ограничения на дизайн в языках группы 2 делают их лучше для более крупных проектов, где простота общения (в отличие от понимания) становится более важной
отсутствие ограничений на дизайн в языках группы 1 облегчает работу с небольшими проектами, где программисту легче проверить, соблюдаются ли различные конструктивные ограничения сразу, просто потому, что код меньше
создание кода из одной группы языков, подобной другой, интересно и заслуживает изучения, но суть языковых различий заключается в том, насколько хорошо они помогают командам разных размеров (- я верю! :))
Существуют и другие различия
может потребоваться больше или меньше усилий для реализации ОО-проекта на одном или другом языке, в зависимости от конкретных принципов.
EDIT
Итак, чтобы ответить на ваш оригинальный вопрос, я рассмотрел
http://c2.com/cgi/wiki?PrinciplesOfObjectOrientedDesign
И
http://www.dofactory.com/patterns/Patterns.aspx
На практике принципы ОО не соблюдаются в системе по разным причинам (и, конечно, по некоторым причинам). Удовлетворительные причины, включенные в тех случаях, когда проблемы производительности перевешивают чисто проблемы качества дизайна, когда культурные преимущества альтернативной структуры / наименования перевешивают чисто проблемы качества дизайна и когда затраты на дополнительную работу по реализации функции, не являющейся стандартным способом для конкретного языка, перевешивают преимущества чистый дизайн.
Более грубые шаблоны, такие как Абстрактная фабрика, Строитель, Метод фабрики, Прототип, Адаптер, Стратегия, Командная цепочка, Мост, Прокси, Наблюдатель, Посетитель и даже MVC / MMVM, имеют тенденцию меньше использоваться в небольших системах, потому что количество количество сообщений о коде меньше, поэтому выгода от создания таких структур не так велика.
Более мелкозернистые шаблоны, такие как State, Command, Factory Method, Composite, Decorator, Facade, Flyweight, Memento, Template, возможно, более распространены в коде группы 1, но часто несколько шаблонов проектирования применяются не к объекту как таковому, а к различные части объекта, тогда как в группе 2 шаблоны кода обычно присутствуют по одному шаблону на объект.
ИМХО, в большинстве языков группы 1 имеет смысл думать о всех глобальных данных и функциях как о некоем объекте "Приложение". Я знаю, что мы стираем грани между процедурным и ОО-программированием, но этот вид кода определенно крякает как объект «приложения» во многих случаях! :)
Некоторые очень мелкозернистые шаблоны проектирования, такие как Iterator, как правило, встроены в языки группы 1.