Недавно я разговаривал с коллегой, который упомянул, что его компания работает над добавлением шаблона проектирования MVC в качестве расширения PHP.
Он объяснил, что они написали C-код для добавления Controllers, Models and Views
в языковые конструкции для повышения производительности.
Теперь я знаю, что MVC - это шаблон архитектурного проектирования, который широко используется в веб-приложениях, но мне все еще приходится сталкиваться с языками, которые имеют языковую конструкцию для контроллеров, например.
ИМХО интеграция шаблонов проектирования в язык может подчеркнуть важность хорошего ОО-дизайна.
Итак, почему наиболее часто используемые шаблоны проектирования (MVC, Factory, Strategy и т. Д.) Не добавляются в языковые конструкции?
Если вопрос звучит слишком широко, вы можете ограничить вопрос только PHP.
Редактировать:
Я не имею в виду, что при разработке проекта нужно использовать шаблон проектирования. На самом деле я продвигаю методологию, чтобы она была простой, пока она работает.
Ответы:
Шаблоны будут добавлены к конструкции языка все время. Вы когда-нибудь слышали о шаблоне дизайна вызова подпрограммы ? Нет? И я нет. Это потому, что вызовы подпрограмм, которые были образцом проектирования в начале 1950-х годов, были добавлены к языкам практически мгновенно. В настоящее время они даже присутствуют в наборах команд машинного кода процессоров.
А как насчет For Loop Design Pattern? В то время как шаблон дизайна Loop ? Переключатель Design Pattern? Object Design Pattern? Class Design Pattern? Все они были добавлены в некоторые языки.
источник
Wheeler jump
илиModified Wheeler jump
.TI-83 Plus
базовом языке привело к тому же шаблону, когда я учился программировать в 2001 году.Некоторые из них. Например, итераторы являются языковой функцией во многих языках и их стандартными библиотеками (привет, foreach и yield return). Обозреватель также часто присутствует в виде событий (не в PHP - вы сами должны управлять подпиской на обратный вызов). Команда является основной функцией в WPF.
Многие другие не получат поддержки от языка (и сделают язык более громоздким) - как бы вы упростили Контроллеры, если бы могли разрабатывать для них функцию языка? Как классы, они получают выгоду от всей инфраструктуры, уже существующей для поддержки классов - вы можете создавать их экземпляры, передавать их и, например, тестировать их как любой другой объект.
Единственный компонент MVC, который IMO мог бы извлечь пользу из некоторой языковой поддержки, - это View (с некоторым официальным механизмом шаблонов) - и он уже поддерживается в PHP - вы можете динамически создавать и загружать PHP-скрипты (которые часто какая-то предварительная обработка используется в качестве шаблонов).
То же самое относится и к фабричному методу - как бы вы упростили это, если бы у вас была какая-либо языковая функция, которую вы хотели? Одной из особенностей, которой нет в некоторых языках (таких как C ++), является возможность конструировать объект из этого имени типа, но большинство языков более высокого уровня могут это делать (и даже нет необходимости создавать полезные фабричные методы). Кроме этого, все, что вам нужно, это уметь создавать метод, который создает и возвращает объект и объект.
источник
Некоторые шаблоны проектирования действительно добавляются как языковые конструкции - они просто не идентифицируются как таковые, потому что люди начинают рассматривать их как «синтаксис», как только они встроены. Обработка исключений в Java - хороший пример - многие люди явно закодировали бы что-то подобное как шаблон дизайна, если он не был частью основного синтаксиса.
Но чтобы сосредоточиться на вопросе - есть много причин, по которым вы не захотите добавлять слишком много шаблонов проектирования в язык:
Кроме того, если вы используете достаточно мощный язык с возможностями метапрограммирования (например, Lisp), становится довольно просто расширить язык самостоятельно для реализации любого шаблона проектирования. Вам не нужны никакие шаблоны на основном языке, если вы легко можете добавить свой собственный с 5-строчным макросом.
источник
Большинство из этих шаблонов могут быть реализованы на большинстве языков программирования без специальной языковой поддержки. Возьмите, например, MVC в Java:
Принимая во внимание все эти параметры, нет никакого смысла в прямом расширении языка. И есть ряд «минусов»:
источник
Они есть.
Функции были шаблоном проектирования в ассемблерном коде до того, как они стали языковой конструкцией в C.
Виртуальные функции были шаблоном проектирования в C до того, как они стали конструкцией langiage в C ++.
Тем не менее, есть компромисс. Если шаблон предполагает создание стандартного кода (даже нескольких ключевых слов), это указывает на то, что это будет полезной языковой функцией. Но если шаблон прост и понятен, например. C "for (int i = 0; i <10; i ++)", все равно полезно писать его одинаково, но он не намного длиннее, чем "для i = 0-10", и имеет значительное преимущество в том, что он очевидно, как изменить его, чтобы сделать немного другой цикл.
источник
Прочитайте книгу «Банда четырех», и станет ясно, что:
источник
Потому что шаблоны проектирования реализованы на отлично с пользовательским кодом. Его пример произошел только потому, что это PHP - но если вам действительно нужна производительность, вы просто работаете на другом языке или получаете HipHop или что-то в этом роде.
Языковые функции сложны как для определения, так и для реализации, и нецелесообразно создавать их с единственной целью: «Текущие идиомы - X». Вы бы просто сохранили какой-либо значимый пользовательский код, и ни за что.
источник
Эх, устаревший вопрос, но я не согласен со многими ответами в зависимости от того, где вы установили «Шаблоны проектирования» на наборе семантики, включая принятый.
В смысле книги GoF Design Patterns я бы сказал, что это зависит. Например, MVC (на самом деле не шаблон GoF, а соответствующий этому шаблону) совершенно неуместно выражать в качестве языковых конструкций для массового потребления (хотя это может иметь смысл для конкретного проекта PHP). В качестве архитектурного паттерна существуют постоянные вариации на тему и множество совершенно законных интерпретаций для разных обстоятельств (хотя многие уходят так далеко от MVC, что, вероятно, больше не следует называть это MVC). Например, в Интернете барьер http делает его несколько неловким в зависимости от того, пытаетесь ли вы включить клиентскую сторону (без сомнения, болезненно) в уравнение и что вы рассматриваете как «представление» с более соответственно строго на стороне сервера.
Итератор, с другой стороны, является весьма общей концепцией, которая может быть применена самым разнообразным образом к широкому кругу конструкций.
Там, где следует провести черту о том, принадлежит ли что-то в базовом языковом дизайне, даже в IMO для языка, специфичного для веб-сервера, - это точка, в которой что-то пересекает линию, облегчая выполнение неисчислимого количества вещей. проще, чем делать слишком конкретную, но широко реализованную вещь, например, шаблон архитектуры для вас.
источник