Программист на C++ моделирует функции Java? [закрытый]

5
задан Jichao 23 December 2009 в 20:33
поделиться

9 ответов

Должен сказать, что "хороший" Java-дизайн почти одинаково ужасен. Я никогда не видел столько дублирования кода, нелепых многоуровневых уровней абстракции (но почти никогда абстракций, которые на самом деле имели бы смысл в данной ситуации), как при взгляде на Java-код.

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

Программисты на Си++ должны кодировать так же, как и программисты на Си++. По двум очень хорошим причинам:

  • Они должны уважать слабости и недостатки языка. Пытаться притвориться, что ты на мусорном языке, когда ты не являешься рецептом катастрофы. А пытаться реализовать GC-подобную семантику поверх такого языка, как C++, наверное, еще хуже.
  • И не менее важно, что они должны использовать все сильные стороны языка. Когда можно получить действительно общие классы коллекции с нулевым накладным расходом и сложной реализацией итератора, зачем его выбрасывать? Если у вас есть одна единственная функция сортировки, которая работает для любого контейнера и даже вообще для любой последовательности объектов любого типа, зачем ее выбрасывать?

Раз уж вы упоминаете интерфейсы в качестве примера функции, которую программисты C++ должны эмулировать, есть две важные контрапункты:

  • C++ имеет интерфейсы в виде абстрактных классов. Семантика несколько отличается, но может быть использована для одной и той же цели.
  • C++ не нуждается в интерфейсах так же сильно, как , потому что в нем есть шаблоны и концепции, основанные на уклоне от компиляции. Вместо того, чтобы извлекать каждый итератор из интерфейса IIterator, мы можем просто определить, как "итератор" должен вести себя и написать класс, который снабжает членов одним и тем же именем. Пока он "выглядит" как итератор, его можно использовать в качестве итератора. Трюки метапрограммирования шаблонов даже позволяют адаптировать существующие классы для "доработки" их для поддержки концепции, для которой они не были предназначены. Например, необработанные указатели (взятые из C) работают как идеально корректные итераторы, несмотря на отсутствие нескольких членов typedef. И даже не будучи классами в первую очередь.

Конечно, у С++ тоже много недостатков. Но это не просто "нижняя Ява". Это другой язык. Нет необходимости для C++-программистов эмулировать особенности Java.

Как я читал в книге Thinking in java

Java книги редко являются хорошими источниками информации о языке Си++. ;)

.
11
ответ дан 18 December 2019 в 05:11
поделиться

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

Объектно-ориентированный анализ заставляет воспринимать мир как совокупность объектов и их методов, классов, которые их группируют, их общих интерфейсов и так далее. Ваш язык может отличаться описанием этих конструкций, но в конце концов, цель одна и та же. Как только вы понимаете, ЧТО вы будете реализовывать и выбирать язык, вы начинаете думать о том, КАК его реализовать, это то же самое, что сказать вам, чтобы вы выбирали между мышлением как "Java-программист", "C/C++-программист" или "C#-программист".

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

Интерфейсы C++ просты: это просто классы со всеми чистыми виртуальными методами, включая чистыми виртуальным деструктором по умолчанию. (Спасибо itowlson за исправление.)

.
17
ответ дан 18 December 2019 в 05:11
поделиться

Это вроде как субъективно, но:

если бы Си++ программисты могли, то они бы код и думать как Java-программист?

Нет. Они должны кодировать и думать как Си++-программисты. В Си++ много идиом и техник, которых нет в Java (и наоборот). Следует использовать идиомы и шаблоны мышления, соответствующие языку, а не пытаться писать Java (или Pascal, или Fortran) с синтаксисом языка Си++.

(Это не значит, конечно, не заимствовать уловки из других языков...!)

.
34
ответ дан 18 December 2019 в 05:11
поделиться

Вы смотрите на это с точки зрения Java-ориентированности. Рассмотрим, например, что Java не поддерживает стиль "RAII", который хорошо поддерживается С++. Языки разные, и поддерживают разные стили по-разному.

.
14
ответ дан 18 December 2019 в 05:11
поделиться

Наверное, самое главное различие между С++ и Java заключается в том, что на Java есть сборщик мусора, а на С++ - нет. Это означает, что в C++, всякий раз, когда вы создаёте объект на куче, вы должны знать, как вы сможете убрать его позже. В Java вы всегда можете безопасно вернуть объект, зная, что сборщик мусора разберется с его удалением.

Итак, если вы кодируете C++ так же, как вы кодируете Java, у вас будет много утечек.

.
2
ответ дан 18 December 2019 в 05:11
поделиться

Существует множество Java-функций, которые сложно воспроизвести программисту на Си++. Интерфейсов и внутренних классов среди них нет, но в Java компилятор заставляет не иметь код в интерфейсах, в то время как в Си++ программист просто вынужден писать классы без кода. Во внутренних классах Java есть секретное встроенное поле parent.this, в то время как во вложенном классе Си++ нужно выполнить набор текста и сделать этот член явным. И в C++, и в C++ скорее больше DIY, чем Java.

Так что это зависит от того, что вы думаете об этой возможности. Если Вы думаете, что особенность Java интерфейса в том, что "я могу использовать полиморфные интерфейсы в моем дизайне", то это тривиально в Си++. Если Вы думаете, что особенность интерфейса Java в том, что "невозможно определить тела методов в интерфейсах", то на Си++ этого нет.

Если Вы хотите точно воспроизвести особенности Java и "думать как Java-программист", то правильнее всего программировать на Java...

.
1
ответ дан 18 December 2019 в 05:11
поделиться

Я не могу сразу ничего придумать, поэтому я отвечу фирме "НЕТ" и осмелюсь в интернете предоставить примеры счетчиков.

Основываясь на моей интерпретации редакции 20:33:27, мы ищем то, что

  • (Хорошо) программисты C++ еще не делали
  • . ... что поддерживается популярными реализациями
  • ... и подходит для проблемных областей, где С++ является подходящим выбором языка

Жесткий парлей, что...

Некоторые возможные места для поиска примеров счетчиков: Юнит-тестирование Synchronization

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

C++ имеет одну мощную концепцию (классы + множественное наследование) для достижения набора целей. Java имеет две менее мощные концепции (классы + единичное наследование и интерфейсы + множественное наследование); если Вы их объедините, то сможете делать некоторые вещи, которые может сделать С++, но не все (например, интерфейсы с реализациями по умолчанию). Поэтому говорить о том, что Java "более сложная" в этом отношении звучит для меня немного странно.

Лучший вопрос: является ли дополнительная мощность, которую дает C++, хорошей вещью или нет?

.
2
ответ дан 18 December 2019 в 05:11
поделиться
Другие вопросы по тегам:

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