Когда ранее? В C++ templates существуют не так долго, как вирутальные методы?Мальчик-Одуванчик wrote: В случае когда тип известен на этапе компиляции то как раз заменяется реализация, которая ранее могла быть исполнена через виртуальные функции произвольных классов.
языки программирования
-
- Уже с Приветом
- Posts: 9195
- Joined: 04 Mar 2011 03:04
- Location: SFBA
Re: языки программирования
... and even then it's rare that you'll be going there...
-
- Уже с Приветом
- Posts: 15526
- Joined: 27 Sep 2007 22:53
Re: языки программирования
до 2003 года многие компиляторы поддерживали параметризацию достаточно криво
Это с технической точки зрения.
Реально же до Александреску (2001 год) на метопрограммировании никто особенно внимания не акцентировал
Более популярным было обьектно-ориентированное программирование в стиле Буча и банды заточенное под
динамический полиморфизм.
Это с технической точки зрения.
Реально же до Александреску (2001 год) на метопрограммировании никто особенно внимания не акцентировал
Более популярным было обьектно-ориентированное программирование в стиле Буча и банды заточенное под
динамический полиморфизм.
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: языки программирования
Так а несложно выложить простенький код с примером применения специализации по отношению к шаблону strategy? Этп ведь наверное не больше 10 строк кода?Мальчик-Одуванчик wrote:до 2003 года многие компиляторы поддерживали параметризацию достаточно криво
Это с технической точки зрения.
Реально же до Александреску (2001 год) на метопрограммировании никто особенно внимания не акцентировал
Более популярным было обьектно-ориентированное программирование в стиле Буча и банды заточенное под
динамический полиморфизм.
In vino Veritas!
-
- Уже с Приветом
- Posts: 9035
- Joined: 25 Oct 2011 19:02
- Location: SVO->ORD->SFO
Re: языки программирования
В идеализированном мире после преодоления порога, все остальное должно пониматься налету. А "запутанный" синтаксис можно сгенерировать на любом языке. Было бы желание.crypto5 wrote:Для запутаного синтаксиса нужно тратить больше тактов мозга на чтение чужого кода?dotcom wrote:Порог вхождения = сложный язык. Если вошел, то "запутанный" синтаксис не должен быть проблемой.
-
- Уже с Приветом
- Posts: 9195
- Joined: 04 Mar 2011 03:04
- Location: SFBA
Re: языки программирования
Ну, если Александреску не акцентировал, но в MFC уже тимплейты (CArray, CMap, ...) были аж до того, как примеры STL мало-мальски компиллировались, тады я... всё равно не верю!
Реально же и виртуальные методы и тимплейты две замечательных вещи, но противопоставление одних другим довольно сомнительное. Тут только о нашей информированности о техниках программирования и возможности использования в данном контексте речь должна идти.
Реально же и виртуальные методы и тимплейты две замечательных вещи, но противопоставление одних другим довольно сомнительное. Тут только о нашей информированности о техниках программирования и возможности использования в данном контексте речь должна идти.
... and even then it's rare that you'll be going there...
-
- Уже с Приветом
- Posts: 3836
- Joined: 13 Sep 2007 10:06
Re: языки программирования
Контейнеры в МФЦ это ад и треш До сих пор содрогаюсь от CMapStringToString и прочих.
-
- Уже с Приветом
- Posts: 15526
- Joined: 27 Sep 2007 22:53
Re: языки программирования
typedef char (&MyStrategy)[1];crypto5 wrote: Так а несложно выложить простенький код с примером применения специализации по отношению к шаблону strategy? Этп ведь наверное не больше 10 строк кода?
template <typename > class Strategy {};
template <> class Strategy <MyStrategy>{
public:
void use() { cout << "MyStrategy" << endl;}
};
template <typename T> class Context {
T strategy_;
public:
void usestrategy() {strategy_.use();}
};
-
- Уже с Приветом
- Posts: 13683
- Joined: 16 Jan 2001 10:01
Re: языки программирования
А по мне так главная проблема - последствия низкоуровневости, когда базовые вещи (управление памятью например) можно сделать 1024 разными способами.nightmare2 wrote: Реальная проблема C++ в том, что он слишком низкоуровневый с запутанным синтаксисом.
Это создаёт сложности в интеграции.
Например - решили использовать DOM в проекте.
В Java: Погуглил "Java DOM Implementation", пошарил в JavaDoc, выбрал что удобнее (Dom4j, JDom, etc.) включил jar - поехали.
В C++: погуглил, вроде что-то нашёл, да принципы управления памятью несовместимы с остальным проектом. Пишем адаптер. Потом отлаживаем его, особенно в многопоточной среде. Потом оказывается что этот доморощенный адаптер не работает в определённых условиях... А так хотелось просто использовать DOM, а не рефлексировать...
При этом в Java есть куча стандартизированных de jure или de facto интерфейсов, в которых реализации можно подменять не затрагивая кода.
-
- Уже с Приветом
- Posts: 9195
- Joined: 04 Mar 2011 03:04
- Location: SFBA
Re: языки программирования
Так в этом паттерне смысл в том, что можно контексту динамически подсунуть новую стратегию. Так получается вызов одного и того же. Код пинать не будем.
Мальчик-Одуванчик wrote:crypto5 wrote: Так а несложно выложить простенький код с примером применения специализации по отношению к шаблону strategy? Этп ведь наверное не больше 10 строк кода?Code: Select all
typedef char (&MyStrategy)[1]; template <typename > class Strategy {}; template <> class Strategy <MyStrategy>{ public: void use() { cout << "MyStrategy" << endl;} }; template <typename T> class Context { T strategy_; public: void usestrategy() {strategy_.use();} }
... and even then it's rare that you'll be going there...
-
- Уже с Приветом
- Posts: 15526
- Joined: 27 Sep 2007 22:53
Re: языки программирования
смысл в том чтобы настроить поведение в зависимости от тех или иных условий.Medium-rare wrote:Так в этом паттерне смысл в том, что можно динамически подсунуть новую стратегию. Так получается вызов одного и того же.
а вот когда - зависит от самой задачи и собственно определяет тип полиморфизма.
У того же Александреску полно примеров когда это лучше делать статически. Взять, хотябы его пример с оболочкой над указателем (smart pointer), где несколько вариантов поведения (strategy) задаются статически инстанцированием типа конкретными параметрами.
Last edited by Мальчик-Одуванчик on 21 Nov 2012 05:56, edited 1 time in total.
-
- Уже с Приветом
- Posts: 9195
- Joined: 04 Mar 2011 03:04
- Location: SFBA
Re: языки программирования
Ну у меня в State Machine что-то подобное используется. Не буду же создавать множестов объектов StateMachine параметризованных для каждого возможного State. Каждый State имеет свой virtual State* Handle(). Похэндлил, и отдал новый State.
... and even then it's rare that you'll be going there...
-
- Уже с Приветом
- Posts: 15526
- Joined: 27 Sep 2007 22:53
Re: языки программирования
Если не ошибаюсь, то в примере описанном в книге Абрахамсона и Гуртового именно так и делается при создании DSL описывающего данную предметную область.Medium-rare wrote:. Не буду же создавать множестов объектов StateMachine параметризованных для каждого возможного State. .
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: языки программирования
Мне кажется что в вашем примере templates и специализация иррелевантны, всего этого можно достичь и без templates, например код на джаве:Мальчик-Одуванчик wrote:typedef char (&MyStrategy)[1];crypto5 wrote: Так а несложно выложить простенький код с примером применения специализации по отношению к шаблону strategy? Этп ведь наверное не больше 10 строк кода?
template <typename > class Strategy {};
template <> class Strategy <MyStrategy>{
public:
void use() { cout << "MyStrategy" << endl;}
};
template <typename T> class Context {
T strategy_;
public:
void usestrategy() {strategy_.use();}
};
Code: Select all
class StrategyImpl1 {
public static void m() {System.out.println("Impl1");};
}
class StrategyImpl2 {
public static void m() {System.out.println("Impl2");};
}
class Strategy extends StrategyImpl1 {};
class Context {
Strategy strategy;
void run() {strategy.m();};
}
In vino Veritas!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: языки программирования
А в чем в данном случае сакральный смысл использовать static в сигнатуре метода? Думаю, что компилятор Джавы тоже удивится и сделает замечание, что доступ к статистическому методу должен идти не через референс, а через имя класса.crypto5 wrote: выбирая от чего отнаследовать Strategy вы тем самым делаете байндинг на нужную стратегию, и все без тимплейтов и специализаций, но и без виртуальных методов.
-
- Уже с Приветом
- Posts: 9195
- Joined: 04 Mar 2011 03:04
- Location: SFBA
Re: языки программирования
StateMachine для чего-то, какой-то системы или подсистемы, по определению должна быть одна. У неё один текущий State.Мальчик-Одуванчик wrote:Если не ошибаюсь, то в примере описанном в книге Абрахамсона и Гуртового именно так и делается при создании DSL описывающего данную предметную область.Medium-rare wrote:. Не буду же создавать множестов объектов StateMachine параметризованных для каждого возможного State. .
... and even then it's rare that you'll be going there...
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: языки программирования
Сакральный смысл в гарантированном избавлении от виртуальных методов как это дано в задаче, компилер думаю не выругается, но это и не принципиально, workaroundов целая тележка, метод можно вызывать и у класса, я просто мимикрировал код Мальчика Одуванчика.Интеррапт wrote:А в чем в данном случае сакральный смысл использовать static в сигнатуре метода? Думаю, что компилятор Джавы тоже удивится и сделает замечание, что доступ к статистическому методу должен идти не через референс, а через имя класса.crypto5 wrote: выбирая от чего отнаследовать Strategy вы тем самым делаете байндинг на нужную стратегию, и все без тимплейтов и специализаций, но и без виртуальных методов.
In vino Veritas!
-
- Уже с Приветом
- Posts: 15526
- Joined: 27 Sep 2007 22:53
Re: языки программирования
В примере я много чего опустил, но даже из него видно что функции-члены специализации параметризованного типа не статические. Собственно можно задать различные специализацииcrypto5 wrote:Мне кажется что в вашем примере templates и специализация иррелевантны, всего этого можно достичь и без templates,
выбирая от чего отнаследовать Strategy вы тем самым делаете байндинг на нужную стратегию, и все без тимплейтов и специализаций, но и без виртуальных методов.
template<> class Strategy <Strategy_1> {
int i;
public:
void use() { ++i; ....}
}
понятно что функция в этом случае статической быть уже не может.
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: языки программирования
Ну это только потому что в джаве нету нестатических невиртуальных функций. Мой код можно переписать один в один на Ц++ опустив статик и добится того же результата что и у вас опять же без шаблонов и специализации.Мальчик-Одуванчик wrote:В примере я много чего опустил, но даже из него видно что функции-члены специализации параметризованного типа не статические. Собственно можно задать различные специализацииcrypto5 wrote:Мне кажется что в вашем примере templates и специализация иррелевантны, всего этого можно достичь и без templates,
выбирая от чего отнаследовать Strategy вы тем самым делаете байндинг на нужную стратегию, и все без тимплейтов и специализаций, но и без виртуальных методов.
template<> class Strategy <Strategy_1> {
int i;
public:
void use() { ++i; ....}
}
понятно что функция в этом случае статической быть уже не может.
In vino Veritas!
-
- Уже с Приветом
- Posts: 15526
- Joined: 27 Sep 2007 22:53
Re: языки программирования
Думаю сакральный смысл как раз в том что статический полиморфизм в Java определен только для статических методов. Во всех остальных случаях имеет место динамический полиморфизм.Интеррапт wrote:А в чем в данном случае сакральный смысл использовать static в сигнатуре метода? Думаю, что компилятор Джавы тоже удивится и сделает замечание, что доступ к статистическому методу должен идти не через референс, а через имя класса.crypto5 wrote: выбирая от чего отнаследовать Strategy вы тем самым делаете байндинг на нужную стратегию, и все без тимплейтов и специализаций, но и без виртуальных методов.
Но собственно речь не сколько об этом а об убирании лишней косвенности в виде наследования
-
- Уже с Приветом
- Posts: 15526
- Joined: 27 Sep 2007 22:53
Re: языки программирования
Конечно можно но речь изначально шла не об этом.crypto5 wrote:Ну это только потому что в джаве нету нестатических невиртуальных функций. Мой код можно переписать один в один на Ц++ опустив статик и добится того же результата что и у вас опять же без шаблонов и специализации.Мальчик-Одуванчик wrote:В примере я много чего опустил, но даже из него видно что функции-члены специализации параметризованного типа не статические. Собственно можно задать различные специализацииcrypto5 wrote:Мне кажется что в вашем примере templates и специализация иррелевантны, всего этого можно достичь и без templates,
выбирая от чего отнаследовать Strategy вы тем самым делаете байндинг на нужную стратегию, и все без тимплейтов и специализаций, но и без виртуальных методов.
template<> class Strategy <Strategy_1> {
int i;
public:
void use() { ++i; ....}
}
понятно что функция в этом случае статической быть уже не может.
А что касается "нестатических невиртуальных функций" -а разве любой метод обычного класса не является таковым в отсутствии наследования от него?
А вот чего определенно нет в Java так это статического полиморфизма который позволяет плюсам написания кода в парадигме функционального программирования.
Last edited by Мальчик-Одуванчик on 21 Nov 2012 07:33, edited 1 time in total.
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: языки программирования
О, в предыдущем посте вы предлагали убрать косвенность в виде виртуальных методов, а сейчас меняете правила. От наследования тоже элементарно можно избавится заменив его на агрегацию, это кажется называется cake pattern.Мальчик-Одуванчик wrote:Думаю сакральный смысл как раз в том что статический полиморфизм в Java определен только для статических методов. Во всех остальных случаях имеет место динамический полиморфизм.Интеррапт wrote:А в чем в данном случае сакральный смысл использовать static в сигнатуре метода? Думаю, что компилятор Джавы тоже удивится и сделает замечание, что доступ к статистическому методу должен идти не через референс, а через имя класса.crypto5 wrote: выбирая от чего отнаследовать Strategy вы тем самым делаете байндинг на нужную стратегию, и все без тимплейтов и специализаций, но и без виртуальных методов.
Но собственно речь не сколько об этом а об убирании лишней косвенности в виде наследования
In vino Veritas!
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: языки программирования
А о чем?Мальчик-Одуванчик wrote:Конечно можно но речь изначально шла не об этом.crypto5 wrote:Ну это только потому что в джаве нету нестатических невиртуальных функций. Мой код можно переписать один в один на Ц++ опустив статик и добится того же результата что и у вас опять же без шаблонов и специализации.Мальчик-Одуванчик wrote:В примере я много чего опустил, но даже из него видно что функции-члены специализации параметризованного типа не статические. Собственно можно задать различные специализацииcrypto5 wrote:Мне кажется что в вашем примере templates и специализация иррелевантны, всего этого можно достичь и без templates,
выбирая от чего отнаследовать Strategy вы тем самым делаете байндинг на нужную стратегию, и все без тимплейтов и специализаций, но и без виртуальных методов.
template<> class Strategy <Strategy_1> {
int i;
public:
void use() { ++i; ....}
}
понятно что функция в этом случае статической быть уже не может.
In vino Veritas!
-
- Уже с Приветом
- Posts: 15526
- Joined: 27 Sep 2007 22:53
Re: языки программирования
Убирается наследование - исчезают виртуальные методы. Они же не сами по себе.crypto5 wrote:О, в предыдущем посте вы предлагали убрать косвенность в виде виртуальных методов, а сейчас меняете правила. От наследования тоже элементарно можно избавится заменив его на агрегацию, это кажется называется cake pattern.Мальчик-Одуванчик wrote:Думаю сакральный смысл как раз в том что статический полиморфизм в Java определен только для статических методов. Во всех остальных случаях имеет место динамический полиморфизм.Интеррапт wrote:А в чем в данном случае сакральный смысл использовать static в сигнатуре метода? Думаю, что компилятор Джавы тоже удивится и сделает замечание, что доступ к статистическому методу должен идти не через референс, а через имя класса.crypto5 wrote: выбирая от чего отнаследовать Strategy вы тем самым делаете байндинг на нужную стратегию, и все без тимплейтов и специализаций, но и без виртуальных методов.
Но собственно речь не сколько об этом а об убирании лишней косвенности в виде наследования
Собственно сам уровень косвенности - базовый класс с виртуальной функцией и наследники с ее имплементацией
Именно это и имел ввиду говоря "А как по мне шаблоны удобнее чтобы убрать лишний уровень косвенности, который раньше имплементировался через виртуальные методы"
А Вы что подумали?
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: языки программирования
Я вот прочитал статью про специализацию шаблонов и у меня в голове очевидности не осталось по этому вопросу, поэтому я ее точно не выбираю ))Мальчик-Одуванчик wrote:Убирается наследование - исчезают виртуальные методы. Они же не сами по себе.crypto5 wrote:О, в предыдущем посте вы предлагали убрать косвенность в виде виртуальных методов, а сейчас меняете правила. От наследования тоже элементарно можно избавится заменив его на агрегацию, это кажется называется cake pattern.Мальчик-Одуванчик wrote:Думаю сакральный смысл как раз в том что статический полиморфизм в Java определен только для статических методов. Во всех остальных случаях имеет место динамический полиморфизм.Интеррапт wrote:А в чем в данном случае сакральный смысл использовать static в сигнатуре метода? Думаю, что компилятор Джавы тоже удивится и сделает замечание, что доступ к статистическому методу должен идти не через референс, а через имя класса.crypto5 wrote: выбирая от чего отнаследовать Strategy вы тем самым делаете байндинг на нужную стратегию, и все без тимплейтов и специализаций, но и без виртуальных методов.
Но собственно речь не сколько об этом а об убирании лишней косвенности в виде наследования
Собственно сам уровень косвенности - базовый класс с виртуальной функцией и наследники с ее имплементацией
Именно это и имел ввиду говоря "А как по мне шаблоны удобнее чтобы убрать лишний уровень косвенности, который раньше имплементировался через виртуальные методы"
А Вы что подумали?
А подумал я в точности то что вы написали - что нужно избавится от виртуальных методов.
In vino Veritas!
-
- Уже с Приветом
- Posts: 15526
- Joined: 27 Sep 2007 22:53
Re: языки программирования
Извиняюсь за косноязычие - когда речь зашла именно про паттерн стратегия то лишним уровнем косвенности в этом случак как раз и будет связка базовый класс стратегии с виртуальной функцией и производный с ее конкретной реализацией.crypto5 wrote:Я вот прочитал статью про специализацию шаблонов и у меня в голове очевидности не осталось по этому вопросу, поэтому я ее точно не выбираю ))
А подумал я в точности то что вы написали - что нужно избавится от виртуальных методов.
В определенных случаях эту связку можно заменить специализацией параметризованного класса.
В более общем случае речь о уместности замены динамического полиморфизма который в плюсах реализуется в помощью виртуальных функций-членов на статический, использующий параметризацию