У нас есть шаблоны разработки в C++, как мы имеем в Java?

Поскольку у нас есть столько шаблонов разработки в Java, как мудрый делают у нас есть любой в C++. Или мы можем использовать тот же вид шаблонов в C++.

9
задан Daniel Sloof 31 January 2010 в 13:19
поделиться

11 ответов

Оригинальная книга о шаблонах дизайна (Design Patterns: Элементы многоразового объектно-ориентированного программного обеспечения Банда четырех) предшествует Java. Примеры в ней приведены на C++ и Smalltalk.

Шаблоны дизайна применимы ко многим объектно-ориентированным языкам программирования; возможно, просто в Java они обычно настолько вездесущие, что нужны для решения чего-то нетривиального.

Однако, некоторые шаблоны дизайна решаются с помощью особенностей языка (вам не нужно явно реализовывать шаблон-обозреватель на C#, например). Другие даже не применимы к Java, так как им нужно множественное наследование классов.

28
ответ дан 4 December 2019 в 05:53
поделиться

Шаблоны дизайна находятся на всех языках. Пытался найти несколько у меня, но теперь не может добраться до них прямо сейчас. Я считаю, что один, в частности, был из серии «начала головы». Принимает сложный вопрос обучения и делает его легким чтением, что в свою очередь делает для лучшего сохранения. Кроме того, там есть тонна книг, но как указанный пример показывает, некоторые лучше других. Шаблоны дизайна могут быть сложными!

2
ответ дан 4 December 2019 в 05:53
поделиться

Я не хочу изучать цель C.

Тогда забудьте о написании кода для запуска на OS X.

-121--1906188-

При использовании C++ 0x может потребоваться использование фигурных скобок (также используйте синтаксис нового стиля для каждой пары):

std::map<int, char> example = { {1,'a'}, {2, 'b'}, {3, 'c'} };

Эти скобки для построения пар не имеют смысла. В качестве альтернативы можно полностью назвать каждую пару или использовать make_pair (как в C++ 98)

std::map<int, char> example = {
    std::make_pair(1,'a'),
    std::make_pair(2, 'b'),
    std::make_pair(3, 'c')
};

Для создания этих экземпляров во время компиляции: нет. Все контейнеры STL инкапсулируют полностью управление памятью во время выполнения.

Я полагаю, что у вас была бы только карта времени компиляции с библиотеками, такими как метапрограммирование boost (не 100% уверен, если это полностью правильно, и не изучил, для чего это может быть полезно):

using namespace boost::mpl;
map<
    pair<integral_c<int, 1>, integral_c<char, 'a'> >,
    pair<integral_c<int, 2>, integral_c<char, 'b'> >,
    pair<integral_c<int, 3>, integral_c<char, 'c'> >
> compile_time_map;
-121--1189211-

Этот вопрос весьма забавен, поскольку Design Узоров берут начало в C++. Книга GoF (Gamma, Johnson, Helm, Vlissides) в Введение :

Цель этой книги - записать опыт проектирования объектно-ориентированного программного обеспечения как шаблоны проектирования . Каждый образец конструкции систематически называет, объясняет и оценивает важную и повторяющуюся конструкцию в объектно-ориентированных системах. Наша цель заключается в том, чтобы отразить опыт проектирования в форме, которую люди могут эффективно использовать. С этой целью мы задокументировали некоторые из наиболее важных узоров дизайна и представили их в виде каталога.

и далее в Что такое дизайн-шаблон :

Хотя дизайн-шаблоны описывают объектно-ориентированные конструкции, они основаны на практических решениях, которые были реализованы в основных объектно-ориентированных языках программирования, таких как Smalltalk и C++, а не процедурных языках (Pascal, C, Ada) или более динамических объектно-ориентированных языках (CLOS Мы выбрали Smalltalk и C++ по прагматическим причинам: наш повседневный опыт был на этих языках, и они становятся все более популярными.

Кроме того, Дизайнерские Узоры подвергаются критике на том основании, что они просто идиомы, прославленные, чтобы скрыть факт. Критики (извините, нет источников) говорят, что DP просто восполняют отсутствие прямой языковой поддержки. Это точно правильно, по крайней мере в определенной степени: посмотрите, как встроенная поддержка Scala для Singleton устраняет публичную статику getInstance () , или вспомните, что Visitor просто имитирует двойную отправку.

Я думаю, что понятие DP как идиомы реализации так же полезно, как и обычная интерпретация (capital D esign). Во-первых, мы должны признать, что различные языки требуют различных подходов, и позиция high-brow DP, безусловно, не помогает. Во-вторых, общий словарь методов реализации, специфичный для каждого языка, так же важен, как и, возможно, перекрестный словарь подходов к проектированию.

3
ответ дан 4 December 2019 в 05:53
поделиться

Как уже упоминалось, исходная книга о рисунках дизайна использует C ++ и некоторые SmallTalk для образцов кода. Сказав это, код, использованный в этой книге, сегодня не считается хорошим C ++, поэтому я был бы осторожен о применении «классических» шаблонов дизайна в C ++.

2
ответ дан 4 December 2019 в 05:53
поделиться

Многие узоры Java непосредственно применимы к C++ и практически к каждому языку. Конечно, есть узоры, которые элегантны, чтобы писать на одном языке, но не на другом.

-121--3206231-

узоры дизайна в значительной степени являются языковыми агностическими, хотя они будут вписываться в одни парадигмы программирования, а не в другие. В этом отношении многие узоры в Java будут очень хорошо работать с C++.

Между тем, богатая (и скрученная, некоторые могли бы сказать!) шаблонная система C++ позволяет очень интересное внедрение стандартов узоров, см., например, Modern C++ Design от Alexandrescu и его очень интересный дизайн на основе политики.

-121--3206224-

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

1
ответ дан 4 December 2019 в 05:53
поделиться

Я бы сказал, что паттерн обычно вписывается в одну или несколько парадигм программирования, поэтому он не ограничен одним языком. Некоторые говорят, что паттерны являются признаком отсутствия возможностей в парадигме/языке, или способом обойти проблемы языка/парадигмы.

1
ответ дан 4 December 2019 в 05:53
поделиться

Если вас интересуют ошибки форматирования, я бы использовал TrimEnd, а не Replace. Замена позволит передать незамеченные ошибки форматирования.

var num = decimal.Parse( value.TrimEnd( new char[] { '%', ' ' } ) ) / 100M;

Это гарантирует, что значение должно быть некоторым десятичным числом, за которым следует любое число знаков мест и процента, т.е. оно должно, по крайней мере, начинаться со значения в правильном формате. Чтобы точнее было разделить «»% «», не удаляя пустые записи, убедитесь, что есть только два результата, а второй пуст. Первым должно быть преобразуемое значение.

var pieces = value.Split( '%' );
if (pieces.Length > 2  || !string.IsNullOrEmpty(pieces[1]))
{ 
    ... some error handling ... 
}
var num = decimal.Parse( pieces[0] ) / 100M;

Использование Replace позволит Вам успешно и неправильно провести анализ IMO, например:

  • % 1,5
  • 1% .5
  • 1.% 5

в дополнение к 1,5%

-121--1316217-

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

-121--3206230-

узоры проектирования являются языковыми агностическими. Специфичные для языка узоры называются идиомами - это решения повторяющихся проблем на определённом языке.

Для C++ существуют хорошие книги, такие как Effective C++ , которые знакомят вас с основными книгами. Викибук Другие идиомы C++ также стоит посмотреть.

7
ответ дан 4 December 2019 в 05:53
поделиться

узоры проектирования являются концептуальными, что означает, что они не связаны с лангами.

Эту же идею можно использовать на C++.

-121--3206222-

Оригинальная книга о узорах дизайна ( Узоры дизайна: элементы многократно используемого объектно-ориентированного программного обеспечения группы четырех) предшествует Java. Примеры в них представлены в C++ и Smalltalk.

узоры проектирования применимы ко многим объектно-ориентированным языкам программирования; может быть, просто в Java они обычно настолько вездесущие, что нужны для решения всего нетривиального.

Однако некоторые узоры проектирования решаются языковыми функциями (например, не требуется явно реализовывать Образец Observer в C #). Другие не применимы даже к Java, так как им необходимо наследование нескольких классов.

-121--3206221-

Многие узоры Java непосредственно применимы к C++ и практически к каждому языку. Конечно, есть узоры, которые элегантны, чтобы писать на одном языке, но не на другом.

0
ответ дан 4 December 2019 в 05:53
поделиться

Шаблоны дизайна являются концептуальными, это означает, что он не связан с Langauges.

Вы можете использовать ту же идею на C ++.

16
ответ дан 4 December 2019 в 05:53
поделиться

Вместо (x.isupper () или x.islower ()) можно использовать x.isalpha () . Метод isalpha () может возвращать значение True для '_' (я не помню, имеет ли это значение или нет), но тогда вы просто замените '_' на '_' , чтобы не причинить вреда. (Спасибо, что указали на это, KennyTM.)

Язык -121--3038726-

C++ не определяет реализации полиморфизма, даже vtable . Это зависит от составителей.
Одной из возможных реализаций является реализация, упомянутая Винсентом Робертом .

-121--3787355-

узоры дизайна в значительной степени являются языковыми агностическими, хотя они будут вписываться в одни парадигмы программирования, а не в другие. В этом отношении многие узоры в Java будут очень хорошо работать с C++.

Между тем, богатая (и скрученная, некоторые могли бы сказать!) шаблонная система C++ позволяет очень интересное внедрение стандартов узоров, см., например, Modern C++ Design от Alexandrescu и его очень интересный дизайн на основе политики.

3
ответ дан 4 December 2019 в 05:53
поделиться

Обратитесь к документации библиотеки boost, там они реализовали многие шаблоны проектирования, такие как Java.

0
ответ дан 4 December 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: