Должен сказать, что "хороший" Java-дизайн почти одинаково ужасен. Я никогда не видел столько дублирования кода, нелепых многоуровневых уровней абстракции (но почти никогда абстракций, которые на самом деле имели бы смысл в данной ситуации), как при взгляде на Java-код.
Есть много хороших возможностей С++, для которых у Java нет эквивалента. Особенности, которые делают возможным более чистый, надежный и элегантный дизайн.
Программисты на Си++ должны кодировать так же, как и программисты на Си++. По двум очень хорошим причинам:
Раз уж вы упоминаете интерфейсы в качестве примера функции, которую программисты C++ должны эмулировать, есть две важные контрапункты:
IIterator
, мы можем просто определить, как "итератор" должен вести себя и написать класс, который снабжает членов одним и тем же именем. Пока он "выглядит" как итератор, его можно использовать в качестве итератора. Трюки метапрограммирования шаблонов даже позволяют адаптировать существующие классы для "доработки" их для поддержки концепции, для которой они не были предназначены. Например, необработанные указатели (взятые из C) работают как идеально корректные итераторы, несмотря на отсутствие нескольких членов typedef
. И даже не будучи классами в первую очередь.Конечно, у С++ тоже много недостатков. Но это не просто "нижняя Ява". Это другой язык. Нет необходимости для C++-программистов эмулировать особенности Java.
Как я читал в книге Thinking in java
Java книги редко являются хорошими источниками информации о языке Си++. ;)
.Это весьма субъективный вопрос, но, если позволите поделиться своим мнением, то нет, Си/Си++ программисты не должны думать как "Java-программисты", а Java-программисты не должны думать как "Си/Си++-программисты"; каждый язык делает одно дело лучше, а другие вещи в своем роде. Однако и тот и другой должны думать как "программисты" и как "Объектно-ориентированные программисты".
Объектно-ориентированный анализ заставляет воспринимать мир как совокупность объектов и их методов, классов, которые их группируют, их общих интерфейсов и так далее. Ваш язык может отличаться описанием этих конструкций, но в конце концов, цель одна и та же. Как только вы понимаете, ЧТО вы будете реализовывать и выбирать язык, вы начинаете думать о том, КАК его реализовать, это то же самое, что сказать вам, чтобы вы выбирали между мышлением как "Java-программист", "C/C++-программист" или "C#-программист".
Интерфейсы C++ просты: это просто классы со всеми чистыми виртуальными методами, включая чистыми виртуальным деструктором по умолчанию. (Спасибо itowlson за исправление.)
.Это вроде как субъективно, но:
если бы Си++ программисты могли, то они бы код и думать как Java-программист?
Нет. Они должны кодировать и думать как Си++-программисты. В Си++ много идиом и техник, которых нет в Java (и наоборот). Следует использовать идиомы и шаблоны мышления, соответствующие языку, а не пытаться писать Java (или Pascal, или Fortran) с синтаксисом языка Си++.
(Это не значит, конечно, не заимствовать уловки из других языков...!)
.Вы смотрите на это с точки зрения Java-ориентированности. Рассмотрим, например, что Java не поддерживает стиль "RAII", который хорошо поддерживается С++. Языки разные, и поддерживают разные стили по-разному.
.Наверное, самое главное различие между С++ и Java заключается в том, что на Java есть сборщик мусора, а на С++ - нет. Это означает, что в C++, всякий раз, когда вы создаёте объект на куче, вы должны знать, как вы сможете убрать его позже. В Java вы всегда можете безопасно вернуть объект, зная, что сборщик мусора разберется с его удалением.
Итак, если вы кодируете C++ так же, как вы кодируете Java, у вас будет много утечек.
.Существует множество Java-функций, которые сложно воспроизвести программисту на Си++. Интерфейсов и внутренних классов среди них нет, но в Java компилятор заставляет не иметь код в интерфейсах, в то время как в Си++ программист просто вынужден писать классы без кода. Во внутренних классах Java есть секретное встроенное поле parent.this
, в то время как во вложенном классе Си++ нужно выполнить набор текста и сделать этот член явным. И в C++, и в C++ скорее больше DIY, чем Java.
Так что это зависит от того, что вы думаете об этой возможности. Если Вы думаете, что особенность Java интерфейса в том, что "я могу использовать полиморфные интерфейсы в моем дизайне", то это тривиально в Си++. Если Вы думаете, что особенность интерфейса Java в том, что "невозможно определить тела методов в интерфейсах", то на Си++ этого нет.
Если Вы хотите точно воспроизвести особенности Java и "думать как Java-программист", то правильнее всего программировать на Java...
.Я не могу сразу ничего придумать, поэтому я отвечу фирме "НЕТ" и осмелюсь в интернете предоставить примеры счетчиков.
Основываясь на моей интерпретации редакции 20:33:27, мы ищем то, что
Жесткий парлей, что...
Некоторые возможные места для поиска примеров счетчиков: Юнит-тестирование Synchronization
C++ имеет одну мощную концепцию (классы + множественное наследование) для достижения набора целей. Java имеет две менее мощные концепции (классы + единичное наследование и интерфейсы + множественное наследование); если Вы их объедините, то сможете делать некоторые вещи, которые может сделать С++, но не все (например, интерфейсы с реализациями по умолчанию). Поэтому говорить о том, что Java "более сложная" в этом отношении звучит для меня немного странно.
Лучший вопрос: является ли дополнительная мощность, которую дает C++, хорошей вещью или нет?
.