Чи слід уникати мовних особливостей, які має C ++, але Java не має?


110

Припустимо, я обмежуюсь використовувати C ++ навколишнім середовищем у проекті. Чи добре запобігати використанню деяких мовних функцій, які мають C ++, але у Java немає (наприклад, багаторазове успадкування, перевантаження оператора)?

Я думаю, що причини:

  1. Оскільки Java є новішою, ніж C ++, якщо Java не забезпечує функцію, яка має C ++, це означає, що ця функція не є хорошою, тому ми повинні уникати її використання.
  2. Код C ++ із специфічними функціями C ++ (наприклад, функції друзів, багаторазове успадкування) може підтримуватися або переглядатися лише програмістами C ++, але якщо ми просто запишемо C ++, як Java (без особливості мови C ++), код може підтримуватися або переглядатися обома Програмісти на C ++ та Java.
  3. Вас можуть попросити якийсь день перетворити код на Java
  4. Код без специфічних функцій C ++ зазвичай є більш ретельним
  5. Кожна специфічна мова мови C ++ (наприклад, багаторазове успадкування) повинна мати альтернативи для впровадження в Java. Якщо цього немає, це означає, що модель дизайну або архітектура коду є проблематичною.

Це правда?


7
Якщо ви подивитесь на ваші пропозиції, ви говорите про створення стандарту кодування. Те, що ви створюєте та дотримуєтесь стандарту, насправді є тим, що сприятиме ремонтопридатності.
Брандін

63
Чи повинен Java-код також обмежуватись функціями, які також є мовою C ++? Тож не використовуйте, наприклад, Java volatile, доступ до приватного класу для пакетів, відображення / самоаналіз, нарешті-блоки, перевірені винятки тощо? Весь вид запитання не має особливого сенсу ... C ++ та Java поверхнево схожі, але в кінцевому рахунку дуже різні мови.
гайда

5
Як розвиваються мови, якщо люди не бажають використовувати нові функції? Мета нових функцій - полегшити ваше життя шляхом вирішення загальних проблем. Якщо користувачі не користуються новими функціями, тоді ніхто не мотивує їх реалізувати.
Метью

72
Якщо ви хочете Java, використовуйте Java. Якщо ви використовуєте C ++, використовуйте C ++, а не якусь жахливу, скручену імітацію Java з синтаксисом C ++. Використання C ++, але обмеження себе набором функцій Java дає вам найгірше з обох світів.
Джеррі Труну

11
Ви були б здивовані тим, як швидко різниці будуть вас кусати (і важко ). SomeObject a = previousObject;робить дуже різні речі на Java та C ++. У Java він копіює посилання, тоді як в C ++ він копіює об'єкт. У Java зміни aтакож вплинуть на попередній об'єкт. У C ++ у вас є два окремих об’єкти.
Завод-Муза

Відповіді:


307

Ні. Це жахливо і дуже страшно.

  • Особливості Java не є кращими, ніж функції C ++, особливо у вакуумі.
  • Якщо ваші програмісти не знають, як користуватися функцією, навчайте або наймайте кращих розробників; обмеження ваших розробників найгіршим у вашій команді - це швидкий і простий спосіб втратити своїх хороших розробників.
  • ЯГНІ . Вирішіть свою актуальну проблему сьогодні, а не привид якоїсь майбутньої проблеми.

6
Нещодавно виникло запитання щодо розробників, які переглядали код мовою, якою вони зазвичай не пишуть. Я думаю, що тут застосовується мудрість: хороший розробник помітить безліч основних помилок майже будь-якої мови, але в кожній мові є стільки готчій, що максимальна користь досягається, коли розробники мов роблять огляд. Це навіть справедливо, якщо на вашому C ++ є "Тільки функції Java".
corsiKa

5
+1 Окрім другого пункту. ОП має зайняти час, щоб прочитати про "Кращі практики C ++", щоб вирішити, які функції вони повинні використовувати. Моя остання інформація про C ++ - це те, що функції друзів і багаторазове успадкування вважаються поганими практиками . Такі речі, як шаблони та перевантаження оператора - це хороша практика ІМХО, якщо ви їх розумно використовуєте.
some_coder

4
@some_coder: Це все питання про те, коли і де. Коли я займаюся програмуванням на основі політики, я успадковую від (можливо, декількох) класів політики, щоб розширити структуру мого хост-класу з членами, для яких потрібні класи класів політики. Це просто, як це працює. Крім того, operator<<( ostream &, T const & )зазвичай реалізується через friend. Ось проблема в бланкетних твердженнях про те, що є гарною мовною особливістю, а що поганою: Вони є гарною порадою, крім випадків, коли їх немає ...
DevSolar

142

Тільки тому, що синтаксис схожий на поверхні, не означає, що дві мови сумісні.

1, 4 і 5 - це те саме питання:

Зараз я не прихильник C ++, але сказати "Код без специфічних C ++ звичайно є більш ретельним" - це просто смішно - чи ти справді вважаєш, що у Java все все правильно, і взяли всі хороші функції, ігноруючи всі погані? Ви справді вірите, що існує щось, що є універсальним "поганою" чи "хорошою" ознакою? Якщо є, то чому б ми не мали однієї мови, чисто чистої? І ні, Java, звичайно , не така мова. Чи означає це, що Java та C ++ марні? Звичайно, ні.

Що робити, якщо ваші керівники вирішать, що ви збираєтесь перейти на C #, а не на Java? C # не лише підтримує переважаючі оператори, але і за замовчуванням - якщо ви будете вимагати від людей, наприклад, obj.Equals(obj2)замість них obj == obj2, люди постійно будуть робити помилки. Навіть якщо ви будете дотримуватися лише спільних рис двох мов, є різні очікування , інша культура. Якщо ви робите щось на кшталт if (myField == null)C ++, люди відразу ж побачать, що ви новачок. Якщо ви використовуєте if (null == myField)C #, люди збираються побачити, що ви ще не справжній C # рідний - причини, що розробники C навчилися використовувати "перевернутий" варіант, у C # вже не існує.

Використовуючи вашу логіку, нам слід було б дотримуватися машинного коду чи збірки чи COBOL, тому що навіщо змінюватися на щось на зразок Паскаля, коли він просто додає нові функції, які повинні вивчити ваші програмісти? Чому ми коли-небудь використовувати щось на зразок SQL, якщо у нього навіть немає циклів ? Чому ми коли-небудь використовуватимемо щось інше, ніж SQL, коли у SQL немає циклів, а X робить?

Код C ++, безумовно, не може підтримуватися Java-програмістами. Я не можу зрозуміти, звідки у вас ця ідея - що саме залишається, якщо ви обмежуєте C ++ лише тими функціями, які працюють точно так само, як у Java? Ви навіть не збираєтеся отримувати виклики методів - навіть не функціонувати . Знову ж таки, те, що обидва мови використовують фігурні дужки, не означає, що мови в будь-якому разі взаємозамінні.

Перетворення кодового коду C ++ на Java буде вкрай схильним до помилок, незалежно від того, що ви робите. Просто занадто багато відмінностей. Якщо вам не потрібно переписувати програму іншою мовою, подумайте про розумні способи модуляції всього, щоб ви могли замінити частини, не порушуючи цілі. Зрештою, YAGNI - незалежно від того, чим ви займаєтесь, коштуватиме ваш код "готовим до конвертації на Java". Цей час, швидше за все, краще витратити на додавання або вдосконалення своїх функцій.

Ми використовуємо різні мови, оскільки вони дають нам інший набір інструментів для вирішення проблем. Якщо вам потрібні виконувані файли, які працюють "скрізь", перейдіть з Java. Якщо ви хочете код, який збирається "скрізь", C ++ працює чудово. Якщо ви хочете код, який легко зрозуміти та проаналізувати, перейдіть з LISP або будь-яким іншим. Але я можу вам сказати одне - писати код однією мовою так, ніби ви пишете його іншою - це завжди помилка, і ви будете страждати. Не кажучи вже про те, що коли ви наймаєте хлопця C ++, він збирається запустити другий, який побачить код "сумісний з Java-ish". І ... хлопець на Java збирається зробити те саме. Ви знаєте, навіть "знаючи" і C ++, і Java, я біг би, як пекло :)

Мені довелося попрацювати над (звичайним) кодом С, написаним розробником Pascal, який, здається, думав, як ти. Він використовував #defines, щоб переосмислити C, щоб виглядати і відчувати себе більше як Паскаль у поєднанні з такими речами, як "BEGIN перекладається на {". Результат був досить передбачуваним - код, який не можуть зрозуміти ані розробники C, ані Паскаль, і повний помилок, які були результатом витікаючої "абстракції" Паскаля на вершині C. А Pascal і C майже однакові з сьогоднішньої точки зору. Навіть перехід на C <-> C ++ набагато більша різниця, і це все-таки арахіс на щось на зразок C ++ <-> Java.


9
"Якщо ви хочете код, який легко зрозуміти та проаналізувати, перейдіть з LISP або будь-яким іншим." Я з цим не погодився. Лісп є тривіальним для розбору, але саме через це - тому, що він був створений в той час, коли знання парсерів та принципи, що лежать в основі їх ефективного побудови, були ще в зародковому стані, і тому вони карали і йшли з найбільш смішною спрощеною справою це могло б спрацювати - ви не отримаєте багато синтаксичних переваг сучасних мов. Тож легко розібратися, але зовсім не зрозуміти . Є причина, що люди називають це "Загубленим у зайвих дужках".
Мейсон Уілер

9
@MasonWheeler Це справа смаку - програмісти на C називали це так, а не LISPers: P. Порахуйте дужки - приблизно стільки, скільки у вашій типовій програмі C ++. Справжня відмінність полягає в їхньому становищі ( myFunc()порівняно (myFunc)), і це дуже вагома причина. Мови на основі LISP все ще дуже популярні, особливо серед людей з математики / фізики. Головне, справді, що мови LISPy дуже незнайомі сучасним програмістам у стилі C - але це навряд чи є причиною ігнорувати це. Схеми, Clojure, і в деякій мірі мови на основі ML (OCaml, F # ...) дійсно дуже LISPy.
Луаан

4
@Luaan Я можу вам точно сказати, що LISP НЕ популярний у фізиці. Дві домінуючі мови в цій галузі - FORTRAN і C ++. FORTRAN є "популярним", оскільки в ньому було написано так багато старих кодів, але майже всі нові програми написані на C ++. Як фізик-дослідник, я жодного разу не стикався і не чув про програму LISP. Не кажучи про те, що їх не існує, але мови, безумовно, не популярні .
Джеймс Матта

4
@Luaan Ми можемо не потребувати більше розробників програмного забезпечення. Нам точно не потрібно більше випускників CS. Це як сказати: «нам потрібно більше структурних інженерів, тому нам потрібно більше випускників теоретичної фізики».
Майлз Рут

4
@ user1717828 Це уникнути чудових ефектів затуманення if (myField == null)як if (myField = null), що дозволить скласти чудово C / C ++, але, ймовірно, не робити те, що ви задумали. З іншого боку, if (null = myField)викличе помилку, оскільки ви не можете призначити константу.
Влерін

94

Я відповім на ваші запитання по порядку.

  1. Якщо Java не надає функцію C ++, це означає, що ця функція не є хорошою, тому нам слід не допустити її використання.

Так, будь-яка функція, яка відсутня на Java, є анафемою на жорсткому диску. Він повинен бути записаний з вашої кодової бази. Ті, хто не підкоряються, будуть розбещені, їхні душі використовуються для того, щоб покласти богів RAID.

  1. Код C ++ із специфічними функціями C ++ (наприклад, функції друзів, багаторазове успадкування) може підтримуватися або переглядатися лише програмістами C ++, але якщо ми просто запишемо C ++, як Java (без особливості мови C ++), код може підтримуватися або переглядатися обома Програмісти на C ++ та Java.

Коли ви сумніваєтесь, напишіть код для найменш компетентного члена вашої команди. Код читається набагато частіше, ніж написано, а код, який настільки розумний, як ви можете написати, занадто розумний для читання. Огляди коду, які персонал вашої реєстрації не зрозуміє, повинні бути відхилені. Щоб допомогти, навчіть їх програмувати у візуальній базі 2.0 протягом вихідних, а потім імітуйте їх стиль кодування будь-якою мовою.

  1. Вас можуть попросити якийсь день перетворити код на Java

Правда! Але навіщо зупинятися на Яві? Вас можуть попросити один день перетворити код на базовий, асемблер та / або перл. Оскільки для кожної мови є перекладачі perl, просто запишіть програму у вигляді довгої рядки perl та вкажіть аргументи на неї на вибраній мові.

Тепер, коли вам потрібно змінити мови, просто перепишіть код, що загортає рядок perl.

  1. Код без специфічних функцій C ++ зазвичай є більш ретельним

Це правда, що код, який використовує менше функцій, простіший в обслуговуванні. Оскільки всі мови еквівалентні машині Тьюрінга, а машина Тьюрінга має найменші особливості будь-якої мови програмування, то перелічений вище інтерпретатор perl фактично запускає машину Тьюрінга (стрічку і все), що вирішує вашу проблему.

  1. Кожна специфічна мова мови C ++ (наприклад, багаторазове успадкування) повинна мати альтернативи для впровадження в Java. Якщо цього немає, це означає, що модель дизайну або архітектура коду є проблематичною.

Особливості мови C ++ фактично мають цінне використання. Оскільки вони не є Java, вони є анафемою, і ті, хто її використовує, можуть бути фірмовими єретиками. Якби у C ++ не було цих мовних особливостей, ви б не змогли знайти тих, кому потрібно пожертвувати. Мовні функції C ++ вирішують проблеми!


Подивіться, у C ++ та Java є різний набір можливостей. Програмування в перетині C ++ і Java призводить до коду, який викинув більшість переваг обох мов.

Java була розроблена частково як реакція на деяке зловживання функціями C ++. Це не означає, що реакція була виправданою, особливо через роки, коли ознаки дозріли.

Ви можете робити жахливі речі з перевантаженням оператора; але жодна мова не може перешкодити написанню жахливого коду мовою, якщо це не перешкоджає всьому коду писатись мовою.

А також ви можете робити дуже елегантні речі з перевантаженням оператора. Прості речі, як-от складний номер чи матричний клас, який працює як комплексне число чи матриця.

Обережно використовувати функції C ++, недоступні на Java, слід розглядати обережно. Тільки тому, що ваш поточний набір розробників на їх нинішньому рівні кваліфікації не розуміє функції, не означає, що її ніколи не слід використовувати; в той же час, те, що ви можете використовувати функцію, не означає, що вам слід. Однак у важкому для Java магазині шанси на те, що опір буде сильнішим, ніж це має бути проти функцій, які не належать Java.

Перетворення коду між мовами найкраще проводити за допомогою переписування, незалежно від того, наскільки вони структурно схожі. Будь-яка спроба зробити це без такого переписування буде нещасним.

Багато специфічних функцій C ++ - це чудеса для обслуговування. Стирання типу (подібне std::function) дозволяє деакулювати ієрархії, що зменшує залежності. Розумні покажчики та детерміновані терміни експлуатації та RAII зменшують несподіванки під час виконання та відсувають шаблони ресурсних котлів із шляху. Високі статичні перевірки типу означають, що код не збирається, а не працює. Домішки зменшують дублювання коду. ADL дозволяє спеціальне незалежне розширення інтерфейсів між ієрархіями типів. Lambda дозволяє писати код поруч із тим, де він використовується. Переадресація та переміщення зменшують копії та роблять програмування функціонального стилю (без побічних ефектів) ефективним. Перевантаження оператора зменшує шум лінії та робить код більш схожим на математику, яку він моделює.

Остерігайтеся ями Тюрінг Тар. Ви можете реалізовувати все на будь-якій мові (включаючи необроблену машину Тюрінга зі стрічкою), але це не означає, що вам слід . Емуляція функцій C ++ за допомогою конструкцій Java-esque в C ++ - жахлива ідея; це призведе до неможливого коду, який ніхто не може прочитати чи зрозуміти.

Ви можете взяти натхнення у дизайнів Java та перенести їх на C ++. Я великий фанат приймати функції мови Python та реалізовувати їх у C ++, тому що мені подобається синтаксис. Але це не означає, що я записую свої методи класу як статичні методи, що беруть явне «я», а потім записую обгортку, яка пересилає до нього нестатичний метод.

Сучасний C ++ не так вже й схожий на мову, яку Емулював та відхиляв Java. Не зациклюйтеся на особливостях однієї мови; не існує "однієї справжньої мови". Дізнайтеся про нові мови та їхні особливості та поглинайте їхню самобутність.


1
-1, вітрова і незрозуміла.
дічлін

4
-1 аргументативний, солом’яний аргумент
user949300

28
+1, належна деконструкція поставлених питань, і я засміявся :)
кіт

11
+1. Веселий, але зберігає крапку. Дуже зрозуміло для людей, які насправді її читають.
Луїс Масуеллі

14
"Програмування в перетині C ++ і Java призводить до коду, який викинув більшість переваг обох мов." Вдарив цвях по голові! +1
Ajedi32

56

Я просто відповім на ваші причини:

  1. Я не розумію, як ви прийшли до цього висновку. Різні мови мають різні особливості. Залежить від обсягу, архітектури мови, іноді уподобань творців та багатьох інших причин. Деякі особливості мови можуть бути поганими, але ваше узагальнення очевидно неправильне IMHO.
  2. Написання C ++, як і Java, може призвести до гіршого коду. Наприклад, сьогодні C ++ 11 Я уникаю використання нових / видалення, але використовую загальні вказівники. У вашому сценарії я б покладався лише на нове / видалене. Якщо ваші програмісти розуміють лише Java, навчайте їх або наймайте кращі.
  3. Це, швидше за все, станеться? Чому ви не пишете на Java в першу чергу? Я думаю, що переписування програм з нуля новою мовою, як правило, погана ідея, і вам потрібно справді хороше виправдання для такого ризику.
  4. Це лише припущення.
  5. Залежить від IMHO сильно від вашого сценарію чи випадку використання.

27
І Java-програмісти також не використовуватимуть delete.
Paŭlo Ebermann

8
Мені довелося виправляти витоки пам’яті, викликані не знаючими програмістами Java delete. Як я пам’ятаю, принаймні в одному з цих випадків також newне було потрібне динамічне розподіл ( ).
Етан Камінський

16
@EthanKaminski Так, саме так ви можете легко помітити новачка на C ++, особливо когось із походження Java або подібного. Перестань використовувати нове для всього, чорт!
Луаан

1
@ PaŭloEbermann Так, ще гірше.
Симон

1
"У вашому сценарії я б покладався лише на нове / видалення" - смішно, я вважав би, що "ідентифікація Java (як) - тільки" C ++ ідіома буде використовувати виключно make_shared.
Кайл Странд

26

У Java є функції, які C ++ не мають, як вбудований, швидкий, надійний збирач сміття, однокоренева ієрархія об'єктів та потужна самоаналіза.

Інші функції Java розроблені для того, щоб працювати разом з ексклюзивними функціями Java, і багато можливостей Java у програмах C ++ можливі, оскільки нові функції компенсують нестачу. Наприклад, у Java немає об'єктів, виділених стеком, з детермінованими деструкторами, але, нарешті, блокує (і пробує ресурси з Java 7) та сміттєзбірник, щоб компенсувати цей недолік.

C ++ не має остаточних блоків чи збирання сміття. Якщо ви не використовуєте деструктори, оскільки їх не існує в Java (я не рахую фіналізаторів), ви знаходитесь на рівні управління ресурсами C (тобто всі інструкції), за винятком того, що ви навіть не можете згрупувати очищення в блок очищення, в який ви перейдете, тому що в Java також немає. Ви справді думаєте, що це покращує ремонтопридатність?

У Java є загальна ієрархія об'єктів, де кожен клас в кінцевому підсумку походить від Object, і кілька примітивних типів також можуть бути автоматично впаковані в такі класи. Це дозволяє записувати контейнери об'єктів один раз, щоб утримувати покажчики на Object. Java 5 представила дженерики, які позбавляються від викидів таких контейнерів потребують, але все ж складають майже такий же код.

У C ++ немає такої ієрархії. Для полегшення написання контейнерів, які працюють для декількох типів, ви використовуєте шаблони, які є кресленнями, які інстанціюються компілятором у міру необхідності для різних типів. Чи забороните ви використовувати шаблони (та макроси) та підете по маршруту C або записуйте один і той же код контейнера для різних типів, або використовуйте недійсні покажчики? (Зачекайте, у Java немає покажчиків недійсних!) Ви впевнені, що це збільшить ремонтопридатність?

Гідна мова має безліч особливостей, розроблених для спільної роботи. Забороняючи забороняти функції з мови A, оскільки мова B їх не має, ви калічите мову A, оскільки ви одночасно не додаєте функції з B, які роблять B цілісним цілим.

Це не означає, що ви не повинні обмежувати дозволені функції C ++. C ++ - це велика, історично вирощена мова, яка підкреслює можливість програмісту робити те, що він хоче, над безпекою та зручністю у використанні, і не всі його функції при всій гнучкості необхідні для створення хороших програм. Існує багато стандартів кодування, які обмежують використання деяких функцій; наприклад, вказівки Google в основному забороняють багаторазове успадкування, складні шаблони та винятки (хоча останній з історичних причин). Але жодна функція не заборонена, "оскільки у Java її немає"; функції розглядаються лише в рамках C ++.


27
Досвідчені ветерани C ++ зазвичай відкидають правила кодування Google. Сучасний C ++ набагато кращий саме тому, що він використовує ці функції. Так, це робить його ще більш різним.
Ян Худек

17
Зауважте, що у C ++ остаточно немає блоків, але він має RAII, що набагато краще для більшості випадків. І, знову ж таки, різне.
Ян Худек

7
Java в Objectзначній мірі є void*для більшості застосувань - все-таки юк.
Квентін

1
Поза вибором особливостей - питання стилю та ідіоми. Програми, як правило, легше читати та підтримувати, якщо вони використовують звичайні ідіоми для мови, якою вони написані. Навіть якби можна було написати частину програми на C ++, використовуючи лише функції, схожі на Java, результат був би дивним, виправданим C ++.
Патрісія Шанахан

2
Я б підтримав цю відповідь за правильний шлях ("не робіть цього"), але я не витримую основної передумови, що Java якимось чином "більш просунута", ніж C ++. C ++ не потребує сміттєзбірника чи однокореневої ієрархії об’єктів, так само, як Java не потрібна ... помилка ... вибачте, я не знаю, як закінчити речення, тому що мені не вистачає детермінованих деструкторів у Java, і finallyне є заміною для них. Дві мови просто принципово різні.
DevSolar

25

Я обговорював, чи варто турбуватися над публікацією іншої відповіді, коли у вас вже є номер, який доходить до того, що здається цілком розумним висновком: що ваша ідея - це в основному катастрофа, яка чекає того, що трапиться. Я думаю, однак, вони не змогли вказати на деякі дуже важливі причини, які стоять за цим висновком.

Відмінності між Java та C ++ проходять набагато глибше, ніж деталі, на яких ви, схоже, зосередилися.

Наприклад, ви говорите про заборону багаторазового успадкування в C ++. По-перше, зазначу, що це просто не вистачає сенсу. Java визначає "інтерфейси" як окремі речі від "класів". Один клас успадковує лише один клас, але може реалізувати довільну кількість інтерфейсів.

C ++ таким чином не розділяє два поняття. Найближчий аналог C ++ забезпечує реалізацію інтерфейсу в Java, який успадковує від іншого класу. Таким чином, щоб взагалі досить добре зберігати ці два вирівнювання, вам, мабуть, потрібно використовувати декілька успадкувань у C ++, але ви хочете обмежити деякі з цих базових класів приблизно однаковими способами, якими Java обмежує інтерфейс порівняно з класом (тобто по суті що він визначає підписи функцій, але, принаймні, переважно, не реалізації).

Це ледве почухає поверхню реальних відмінностей між двома. Насправді, де Java-код, ймовірно, визначає інтерфейси та класи, які реалізують ці інтерфейси, код C ++ набагато більше шансів визначити деякі шаблони, які працюватимуть із будь-яким класом, який відповідає його вимогам (не лише тим, що визначено спеціально для реалізації інтерфейсу (s) він вказує).

Якщо ви чесно хочете код, який в основному є "Java, що використовує синтаксис C ++", вам, напевно, доведеться забороняти що-небудь і все подібне до останнього. Вам потрібно буде обмежити використання шаблонів приблизно рівнем "контейнера T", який підтримує Java generics. На жаль, це призведе до отримання коду C ++, який є таким безладом, що ніхто не може підтримувати його таким, яким він є зараз, не кажучи вже про довгострокову можливість його перекладу на якусь іншу мову програмування.

Якщо ви дійсно хочете, щоб код, який у майбутньому можна перетворити на якусь іншу мову, прагніть зробити його максимально чистим і читабельним. Ідеалом є написання псевдо-коду та все ще його виконання. Добре написані сучасні C ++ підходять до цього ідеалу набагато ближче, ніж запропонований вами підмножина. Як би ви не писали, якщо ви коли-небудь перекладете на Java, вам доведеться фактично перекласти код, а не лише синтаксис окремих висловлювань.


Багато функцій C ++ можна використовувати в деяких способах, які чітко відображають поняття Java та інші способи, які цього не роблять. Деякі частини програми потребують чогось поза підгруппою, що перекриває функціональність мов, і спроба записати такі частини, як "Java з використанням синтаксису C ++", призведе до жахливого безладу. З іншого боку, багатьом іншим частинам коду може знадобитися що-небудь поза спільним підмножиною, і намагання залишитися в загальному для тих частин коду, де немає переконливих причин виходити за межі цього, може бути корисним.
supercat

Імовірно, там, де ви говорите "може знадобитися", ви дійсно маєте на увазі: "може не знадобиться"? Якщо припустити це, то я схильний би погодитися.
Джеррі Труну

Так. Якщо стане необхідною підтримка платформи, яка підтримує Java, але не C ++, частини коду майже напевно доведеться переписати з нуля, і не має значення, чи були написані ці частини, використовуючи деякі зручні для Java методи, оскільки вони ' Мене все одно перепишуть Однак, можливо, можна записати інші частини таким чином, що дозволить перенести їх без повного перезапису, а в деяких випадках додаткові витрати, необхідні для цього, можуть бути мінімальними.
supercat

4
@supercat: OTOH, враховуючи кількість платформ, які підтримують Java, але не C ++, це вважає мене майже повністю рішенням у пошуку проблеми.
Джеррі Труну

Деякий час підтримка браузера для Java-аплетів була кращою, ніж для програм C ++. Підтримка браузера для JavsScript (ніякого відношення до Java), однак, набула вдосконалення, що в основному перейнято з обох.
supercat

11

Якщо ви збираєтеся писати код на мові X, витратьте час, щоб правильно вивчити мову та використати всі функції, які вона пропонує, щоб допомогти вирішити проблему. Погані речі трапляються, коли ви намагаєтесь зробити переклад "слово за словом" з однієї мови на іншу, будь то японська на англійська чи Java на C ++. Набагато краще почати з хорошого розуміння проблеми та висловити рішення таким чином, який є найбільш природним для мови, що використовується.

Роки тому я бачив програму C, яка не мала відступів, і кожне твердження починалося у графі 7, тому що автором коду був програміст Fortran, який випадково використовував C. Інші програмісти Fortran нервували ці новомодні речі, звані покажчиками. У мене не було серця згадувати покажчики на покажчики, я думаю, що вони знепритомніли б на місці.

Уявіть, що ви наймаєте когось, щоб підтримувати цей код у майбутньому. Якщо це гарний код C ++, ви зможете найняти грамотного розробника C ++, і вони зможуть знайти свій шлях. Якщо це "Java в C ++", то ні C ++, ні Java розробники не зможуть легко зрозуміти код.


7

Усі ваші причини можна спростувати:

Якщо Java не надає функцію C ++, це означає, що ця функція не є хорошою, тому нам слід не допустити її використання.

Це не означає, що функція не є хорошою (жодна особливість не може бути по суті поганою). Це означає лише, що цю функцію часто використовували (або неможливо реалізувати через фундаментальні поняття, наприклад, прямі вказівники проти збору сміття). Java за визначенням має на меті бути простішою та зручнішою для програмістів, отже, видалення функцій, які виявили себе легко зловживатими.

Код C ++ із специфічними функціями C ++ (наприклад, функції друзів, багаторазове успадкування) може підтримуватися або переглядатися лише програмістами C ++, але якщо ми просто запишемо C ++, як Java (без особливості мови C ++), код може підтримуватися або переглядатися обома Програмісти на C ++ та Java.

О, це може бути? Давайте подивимось найпростіший код C ++:

int len = mystring->size();

На жаль, жодних "мовно-специфічних" функцій не використовується, але Java розробниками це вже неможливо досягти! Тому що в Java ви відмовляєтесь від "." поки тут це "->.

Вас можуть попросити якийсь день перетворити код на Java

Або C #. Або Хаскелл. Або Пітон. Або Рубі. Або COBOL (так, можна!). Як ви можете сказати майбутнє?

Код без специфічних функцій C ++ зазвичай є більш ретельним.

Точно навпаки. Кожна функція була введена для того, щоб полегшити програмування, отже, більш рентабельним. Наприклад: візьміть програму, що працює на плавках. Тепер оновіть його для обробки складних чисел. Оператор перевантажує на допомогу!

Кожна специфічна мова мови C ++ (наприклад, багаторазове успадкування) повинна мати альтернативи для впровадження в Java. Якщо цього немає, це означає, що модель дизайну або архітектура коду є проблематичною.

Але Java DOES мають багаторазове успадкування! Це називається "інтерфейс". Реалізація Java - це проблематичне рішення, щоб уникнути жахливого алмазу, спричиненого тим, що все випливає Object. Це робиться шляхом введення, interfaceяка єдина мета - бути чимось, з чого не випливає Object. У C ++ ніколи не було цієї проблеми - не існує обов'язкової загальної бази, тому кожен клас може функціонувати як інтерфейс без страшного алмазу.

Бічна примітка: Java нещодавно представила ... конкретні методи в інтерфейсах. Додана функція C ++ завжди мала вирішити проблему, якої ніколи не було.

Ви також згадали лише дуже мало "речей, які має C ++, але Java не має". Однією з найбільших відмінностей між C ++ та Java є контроль над компонуванням пам’яті. Ви можете створити масив покажчиків на об’єкти (як і в Java) АБО можете створити суміжний блок пам'яті. Тепер, якби я хвилювався про функцію C ++, яка може ввести в оману Java-розробників, щось таке приховане і тонке, як це було б у моєму списку набагато вище, ніж очевидне і впізнаване на перший погляд речі, такі як багаторазове успадкування або перевантажені оператори.

Підсумок: чистий код - чистий код. Java або C ++ - однакова різниця. Просто нехай це буде просто. Непотрібні ускладнення є головною причиною поганого коду.


Java пропонує деякі функції та гарантії, які не підлягатимуть мові, яка пропонує всі функції C ++. Наприклад, мова не може дозволити завантаження динамічного типу та повний діапазон Java для збереження ідентичності, пропонуючи узагальнені форми множинного успадкування, включені до C ++.
supercat

@supercat Я не розумію, чому ти тут це кажеш. Питання не в тому, які функції Java неможливо відтворити на C ++, а про функції C ++, які Java відкинула.
Agent_L

Моя думка полягає в тому, що деякі функції Java не включені в C ++, а швидше, що деякі функції Java принципово несумісні з іншими функціями, які включені в C ++, так що жодна мова не може мати типи, які підтримують обидві (такі мови, як C ++ / CLI мають типи, що підтримують функції C ++ та типи, що підтримують функції Java-ish, але вони ефективно населяють окремі всесвіти з обмеженою сумісністю).
supercat

6

Ні, зазвичай не слід писати на C ++, як це було у Java, і ви точно не повинні опускати мовні функції C ++, яких немає на Java.

З одного боку, Java збирає сміття, і тому не має еквівалента ключового слова C ++ "delete". Гаразд, тож ви реалізуєте програму без видалення, оскільки згідно з вашими правилами це заборонено.

Вітаємо, тепер у вас витік пам'яті;). Це теж не теоретично - я бачив, як така ситуація трапляється у грі з відкритим кодом.

Аналогічно, у Java немає нічого подібного до вказівників C ++, що виключає безліч загальних умов виклику функцій.

Є особливості C ++, яких, можливо, вам слід уникати (див. Нижче), але «не бути на Яві» - це не дуже хороший лакмусовий тест.


Кращими рекомендаціями були б такі:

  1. Напишіть код, який відповідає вашій мові, оточенню та інструментам.
  2. Напишіть код, який може зрозуміти ваша команда .
  3. Переконайтеся, що ваша команда є компетентною в даному домені.

Пункт (3) означає, що у вас не повинно бути коду програмістів Java в C ++, не навчаючи їх на C ++. Є деякі тонкі, але дуже важливі відмінності, які вони можуть не вивчити, якщо намагаються ставитися до цього як до дивного діалекту Java.

Пункт (2) означає, що якщо вашій команді конкретно незручно багаторазово успадковувати (наприклад), і якщо є адекватне рішення, яке не використовує, можливо, найкраще використовувати це альтернативне рішення. Однак це залежить конкретно від вашої команди. З іншого боку, якщо вашій команді незручніше з цим альтернативним рішенням, ніж із багаторазовим успадкуванням, використовуйте множинне успадкування!


І нарешті, є мовні особливості C ++, яких, певно, слід уникати. Якщо ви хочете знати, що це таке, запитайте програмістів на C ++ , а не програмістів іншої мови. Деякі приклади для початку - це арифметика вказівника (відсутність універсальної консенсусу) та гото.


6

В інших відповідях вже є деякі хороші моменти, але я хотів би дати більш повну відповідь, вирішуючи ваші запитання та заяви окремо.


Якщо Java не надає функцію C ++, це означає, що ця функція не є хорошою, тому нам слід не допустити її використання.

На це досить добре відповіли: Java не є "хорошими частинами" C ++, і немає причин вважати це.

Зокрема, хоча достоїнства кожної окремої функції C ++ є дискусійними, багато особливостей C ++ 11 / C ++ 14, які не входять до складу Java, не обов'язково виключаються, оскільки дизайнери Java вважали, що вони є поганою ідеєю. Наприклад, до версії 8 у Java не було лямбда, але вони були введені до C ++ у стандарті C ++ 11. До Java 8, ваше припущення про те, що функції C ++, відсутні у Java, відсутній у дизайні, оскільки вони "непогані", це означало б, що лямбди як мовна особливість "не є гарними" (на жаль LISPers скрізь, хоча вони напевно, жахнувся, щоб почути, що вам, мабуть, справді подобається Java). Але тепер дизайнери Java поставили свій штамп схвалення (TM) на лямбдах, тож вони тепер хороша річ.

Щоб викопати трохи глибше, навіть у Java 8, лямбдаси як закриття не такі гнучкі, як лямбди C ++ 14, але це може бути пов’язано з обмеженнями архітектури JVM, а не свідомим рішенням, що більш гнучкий підхід поганий від мовно-дизайнерська перспектива.


Код C ++ із специфічними функціями C ++ (наприклад, функції друзів, багаторазове успадкування) може підтримуватися або переглядатися лише програмістами C ++, але якщо ми просто запишемо C ++, як Java (без особливості мови C ++), код може підтримуватися або переглядатися обома Програмісти на C ++ та Java.

Це головне, на що я хотів відповісти.

Взагалі кажучи, для отримання оглядів коду програмісти, які не знайомі з мовою, якою ви користуєтесь, можуть мати деяку цінність. Вони можуть дати вам цінний відгук про чіткість назви ваших функцій / методів та коментарів, і (як правильно випливає ваше запитання), якщо мова схожа на одну або декілька мов, які вони вже знають, вони можуть бути в змозі стежити за основним потоком програми і потенційно вловлювати логічні помилки.

Однак це не так, що такий огляд коли-небудь буде "настільки ж хорошим" або "еквівалентним" відгуку від розробників, які насправді знають мову, якою ви користуєтесь. За суті, це відбувається тому , що робить одну мову вид схожий на інший, як правило , приховують тонкі відмінності, роблячи одну мову , поводяться , як інший (особливо в разі C ++ і Java) може бути не-ідіоматичних для мови і / або може виявитися занадто заплутаною для рецензентів.

Спочатку давайте подумаємо про те, що означало б зробити C ++ "схожим на" Java. Як простий випадок, ви можете використовувати newдля створення екземплярів об'єктів, як у Java:

Foo foo = new Foo();

Але об'єкти, створені таким чином, використовують ->замість .методів виклику, тому, якщо ви хочете, щоб виклики методів виглядали як Java, вам потрібно написати:

Foo& foo = *new Foo();

Але це неідіоматично; зокрема, слід згодом очистити пам'ять delete &foo, яку деякі досвідчені розробники C ++ навіть не можуть зрозуміти, що це юридичний код . У будь-якому випадку, є смішні , НЕ Java-подібні символи пронизують, тому ми не можемо досить зробити мову «виглядати» Java. (Ви можете усунути, *newвикористовуючи #define New *new, або, що ще гірше, #define new *newале тоді ви просто благаєте, щоб ваші колеги-розробники ненавиділи вас.) І, як було сказано вище, deleteна Java не існує, так що в будь-якому випадку (як згадується в іншій відповіді ) ви насправді не можете змусити використання об'єкта "виглядати" так, як це робиться на Java без витоків пам'яті.

Але сучасний C ++ включає в себе розумні загальні покажчики, які дуже схожі на змінні посилання на керовану пам'ять Java. Тож скрізь на Яві, яку ви могли написати Foo foo = new Foo();, ви можете замість цього написати:

std::shared_ptr<Foo> foo = std::make_shared<Foo>();

Тепер ви використовуєте мовну функцію, яка насправді дуже схожа на Java під кришкою. Але раптом у вас є що пояснити рецензентам, які не містять С ++: що це за shared_ptrматеріал? Які тонкі хитрі "готчі" make_shared? (У ньому використовується ідеальне переадресація, яка має деякі випадки відмов і може призвести до виклику "неправильного" конструктора.) Чому методи потрібно викликати ->, але .компілятор дозволений використовувати деякі методи? ( shared_ptrє свої методи.) Якщо метод Foo::reset(void)існує, необережний розробник може спробувати викликати його foo.reset(), який (якщо є лише один спільний вказівник, що вказує на цей екземпляр, Fooколи відбувається виклик) видалить базову пам'ять і зведе нанівець foo, і Розробники Java, мабуть, не впораються з цією проблемою.

Крім того, C ++ має багато з пасток , які специфічні для мови. Як я найкраще можу сказати, більшість розробників C ++ навчаються вирішувати ці підводні камені, поступово розробляючи власну ідіому для "безпечних" практик C ++, яка часто дещо унікальна для них або для їхньої команди розробників (див., Наприклад, існуючу відповідь, що згадує про Практика кодування Google та коментар до неї говорять про те, що "досвідчені ветерани C ++ зазвичай відкидають правила кодування Google"). Усі твердження про те, що мова може бути надто складною, здається (принаймні, на моєму досвіді), як правило, зустрічаються з деякими варіантами "ну, перестань використовувати неправильно". Я розумію , що це дуже негативний погляд на C ++ спільноти, і є, звичайно , досвідчені розробники більш готові допомогти від мови учнів, але робить здається, є певною захисністю щодо, наприклад, невизначеної поведінки (див., наприклад, велику частину дискусій у моєму "підводному камені" посилання вище).

Розробники Java просто не будуть корисні у пошуку та виправленні цих підводних каменів за допомогою перегляду коду.


Вас можуть попросити якийсь день перетворити код на Java.

Це цілком справедливо - похвально, навіть - намагатися врахувати, що може статися з вашим кодом у майбутньому, поки ви знаходитесь у фазі проектування.

Але, по-перше, цей конкретний розгляд здається віддаленою можливістю: код зазвичай або повторно використовується як є (наприклад, ви можете підключити якийсь або весь робочий код C ++ до якогось майбутнього програмного забезпечення Java за допомогою інтерфейсу JNI) або повністю переписати ніж безпосередньо вручну "переписано".

І, друге, пізніше ви кажете:

Кожна специфічна мова мови C ++ (наприклад, багаторазове успадкування) повинна мати альтернативи для впровадження в Java ....

Це по суті скасовує вашу точку "перетворення на Java". Якщо програмне забезпечення написане на ідіоматичному C ++, а потім перетворене на ідіоматичну Java, немає підстав сподіватися, що це перетворення (або могло б!) Здійснити, застосувавши точне відображення одного до одного функції C ++ до функцій Java.


Код без специфічних функцій C ++ зазвичай є більш ретельним.

Не ясно, що ви тут маєте на увазі, але я насправді дещо погоджуюся з частиною цього: якщо ви не дуже обережні, і навіть коли ви обережні, функції C ++ можуть призвести до проблем з ремонтом. C ++ FQA Lite (сайт критично мови і його прихильників з тих , хто , по крайней мере , здається, на самому ділі переконатися в цьому досить добре) стверджує , що

... 80% розробників розуміють не більше 20% мови. Це не ті самі 20% для різних людей, тому не розраховуйте на те, щоб вони зрозуміли код один одного.

УВАГА: Примітка: Якщо ви фанат C ++, і ви до цього досягли моєї відповіді і відчуваєте схильність стрибати вниз до коментарів, стверджуючи, що автор FQA насправді не розуміє C ++ або непристойний у більшості своїх аргументів зауважте, що (1) рівно через два пропозиції після його цитування я визнаю, що FQA є дуже упередженим джерелом, і (2) це не має значення для того, що я намагаюся сказати, розуміє чи автор FQA розуміє C ++ , і я не намагаюся збивати C ++, і ви повинні прочитати решту публікацій, не вважаючи, що я анти-C ++ тільки тому, що я цитував FQA. Кінець примітки.

Так само Лінус Торвальдс з цієї причини ненавидить C ++ (попередження: посилання передбачає багато присяги, у справжньому сумнозвісному стилі Лінуса).

Очевидно, що це дуже упереджене питання, але навіть прихильники C ++ часто кажуть, що не слід використовувати цілий набір мовних функцій (ще раз перегляньте інструкції Google щодо кодування; також, Bjarne Stroustrup, творець C ++ , публічно заявив: "У межах C ++ існує набагато менша та чистіша мова, яка намагається вийти").

Тому я думаю, що є деяка заслуга в ідеї, що функції C ++ можуть бути занадто простими для неправильного використання, особливо якщо ви надходите з фону Java. Крім того, заслуговує ідея полегшити ці проблеми, обмежившись деякою підмножиною мови.

Однак вирішити, який підмножина використовувати на основі іншої мови, не здається правильним підходом, якщо тільки "іншою мовою" є C, оскільки дійсно є С-подібний підмножина мови C ++. (Лінус посилається на це у своїй виклику вище, а Скотт Майєрс навіть називає це підмножиною як "підмовою".) Парадигма часу виконання Java (збирається сміття, працює на VM) настільки принципово відрізняється від C ++, що це Не ясно, є корисні уроки, щоб зробити з нього використання C ++, і як зазначалося вище, намагання витягнути уроки про C ++ безпосередньо з Java може призвести до дуже неідіоматичного коду.

Натомість спробуйте визначити свій "прийнятний підмножина" мови, щоб зрозуміти, як мовою можна користуватися ідіоматично. Якщо ви хочете досить обмежувати підмножину, яка все-таки користується багатьма можливостями C ++, ніж те, що пропонує C, вищезгадане керівництво Google щодо кодування може бути гарним місцем для початку. Звичайно, ви отримаєте розробників, які кажуть, що немає "раціональних аргументів" щодо деяких обмежень Google , але якщо ви не прагнете найняти Олександреску далеко від його роботи над мовою D (яка сама повинна вам щось сказати), це певно гаразд. Це, звичайно, краще, ніж намагатися перетворити C ++ на Java.

Ще однією гарною відправною точкою для набору кодових настанов є нові основні керівні принципи C ++ , незавершене виробництво Bjarne Stroustrup та Herb Sutter.

Єдиний інший спосіб вирішити недоліки C ++ - це вибрати іншу мову. Це здається, що вам подобається Java, і ви думаєте, що є ймовірність, що цей проект може з часом перетворитися на Java. Як зазначається в іншій відповіді, ви могли просто ... почати з Java.

З двох причин, чому вам може справді потрібно використовувати щось інше, ніж Java:

  1. Ви дійсно потребуєте виконання часу виконання. У цьому випадку лікування C ++, як-от Java, напевно, вам не допоможе, тому що подібні до Java методи, такі як загальні покажчики, погіршують вашу продуктивність.
  2. Вам потрібне програмне забезпечення для роботи на незрозумілій платформі, яка ще не підтримує JVM. У цьому випадку ви, мабуть, застрягли з мовами, які мають GCC або Clang фронти. C і C ++ є очевидними кандидатами, але ви також можете розглянути щось на зразок Руста. (Швидкий штекер: Я не використовував Руста широко, але це виглядає приголомшливо, і я готовий працювати над великим проектом Rust, як тільки можу, і я думаю, що всі, хто розглядає можливість створення проекту C ++, повинні розглядати Руст як альтернативу.)

Кожна специфічна мова мови C ++ (наприклад, багаторазове успадкування) повинна мати альтернативи для впровадження в Java. Якщо цього немає, це означає, що модель дизайну або архітектура коду є проблематичною.

Я вже дещо вирішував це, але навмисно викинув ваше друге речення.

Я не переконаний, що щось подібне constexpr, яке не мало б сенсу в частково JIT мові, як Java, є вказівкою на недійсну архітектуру. Я більше відкритий до ідеї, що надмірне використання метапрограмування шаблонів може бути більшим клопотом, ніж це варто, особливо зараз, коли constexprце робиться для оцінки функції компіляції в часі, але з випадків зрозуміло, constexprщо у вас немає вад дизайну, якщо ви Ви використовуєте це: ви просто гарантуєте, що деякі обчислення відбуваються до навіть запуску коду, що є приголомшливим підвищенням продуктивності (див., наприклад, цей запис щодо проблеми n-body The Game Benchmark Game , що перевершує будь-який інший запис, окрім іншого) написано на C ++,


5
Автор FQA, безумовно, потрапляє в групу "розуміють не більше 20% мови". Тут є декілька відповідей, які насправді помиляються, і ще купа, що просто не вистачає суті, проілюстрована соломкою після соломенника.
Ben Voigt

2
Багато (майже всі?) Скарг у С ++ FQA - це нісенітниця. Сучасні мови величезні. C ++ порівняно з Python, Ruby, Perl та так, Java порівняно невеликий. Задайте основне питання на цих мовах на StackOverflow і перший відповідь майже неминуче уздовж ліній «Чому ти не import SomeVeryBasicPackageта просто зробити це ?» Задайте просунутий питання та перший відповідь майже неминуче уздовж ліній «Чому ти не import SomeMagicalPackageта просто робити що
Девід Хаммен

1
@DavidHammen Я вважаю, що розділ 80/20 стосується основних мовних особливостей, а не лише стандартних компонентів бібліотеки. У цьому випадку мови, які ви згадуєте, за винятком Perl, насправді не такі великі і складні, як C ++. У будь-якому випадку, це була дуже мала частина моєї відповіді, і я визнав, що це упереджене джерело.
Кайл Странд

1
Мови VM / керовані мови, очевидно, значно складніші під поверхнею, але я маю на увазі складні з точки зору використання.
Кайл Странд

1
Я поняття не маю, чи правильна ваша теорія, хоча в моєму випадку я, безумовно, вивчив C ++ і C окремо, і мій клас C ++ був справді досить ґрунтовним. Але повна цитата про розкол 20/80 полягає в тому, що кожен програміст знає різні 20% мови, що не пояснюється більшістю програмістів, які навчають частину мови С самостійно. У будь-якому випадку, якщо ви хочете детально пояснити, як C ++ дозволяє більш надійне програмування (я вважаю, що я бачив і раніше, але не розумію), ми, мабуть, найкраще це зробимо в кімнаті чату чи щось, а не в коментарях тут .
Кайл Странд

5

Припустимо, я обмежуюсь використовувати C ++ навколишнім середовищем у проекті. Чи добре запобігати використанню деяких мовних функцій, які мають C ++, але у Java немає (наприклад, багаторазове успадкування, переопределення оператора)?

Немає.

Якщо ви "обмежуєтесь середовищем проекту", ви обмежуєтесь використанням C ++, то мало, якщо є, сенсу навіть думати про будь-яку іншу технологію, незалежно від того, наскільки ви особисто хочете / хочете використовувати / сподіватися на її використання.
Незалежно від того, "Технологія X" або "Y" підтримує будь-яку функцію, це не має ніякого відношення до способу побудови програми C ++.
Це додаток C ++, мабуть, для якоїсь "Доброї причини" (зараз чи раніше), тому слід писати це як додаток C ++, використовуючи все, що надає конкретний "інструментарій".

Якщо і коли є Вимога до порту програми на якусь іншу технологію, то (і тільки тоді) ви можете розглянути можливості інших платформ. Немає сенсу "відрізати ніс, щоб виплюнути обличчя" на шанс, що щось може статися. Пам'ятайте, однак, що оптовий перепис - це дорога, ризикована операція, яку управління навряд чи вдасться здійснити без дуже гарної причини для цього.

Ще кілька років тому у світі Visual Basic [.Net] з'явилася подібна дискусія ("використовувати чи не використовувати"), де хтось мав яскраву ідею, що ви повинні написати додатки Visual Basic без використання жодної [основної мови] функціональність, що надається простором імен Microsoft.VisualBasic. Було б як спробувати написати додаток C ++ без std :: простору імен; Гаразд, це можливо, але чому б на Землі хтось із розумом намагався це зробити?


1
До останнього моменту про Visual Basic: Проблема таких бібліотек постачальників полягає в тому, що вони є власником. Використовувати їх означає прив'язувати себе до цього продавця. Постачальнику сподобається, що вас прикували до ланцюга, але в довгостроковій перспективі ви не зможете користуватися програмним забезпеченням іншого постачальника, не переписуючи все, що залежить від певної функціональності постачальника. Чим більше ви використовуєте функціонал конкретного постачальника, тим вищі кошти на зміну постачальників стають, що дає змогу постачальнику примушувати зміни до вас. Це одна з причин, чому вільне (як у свободі!) Програмне забезпечення - це така велика справа.
cmaster

Справа в Microsoft.VisualBasicпросторі імен трохи розтягується. Минуло багато років, як я востаннє використовував його, але, принаймні, на початку він був здебільшого спрямований на зворотну сумісність з VB6 (та / або на те, щоб програмісти VB6 відчували себе як "вдома"); він здебільшого забезпечував функціонал, який уже був доступний у решті рамок у більш сучасній (і краще інтегрованій) формі, тому в нових проектах його рідко було сенс використовувати. Навпаки, в std::просторі імен знаходиться вся стандартна бібліотека - уникати цього було б як уникнути всього BCL в .NET.
Маттео Італія

2

Поточні відповіді говорять, що це погано, тому що ви повинні скористатися мовою, якою ви користуєтесь, а також поясніть, чому функція C ++ не є «поганою» лише тому, що вона не знаходиться в джеве. Я відповім на це з іншого кута.

Одне уникати складних функцій C ++, таких як багаторазове успадкування, перевантаження оператора та визначення власного шаблону.

Але будь-яка проблема, яка виконує більше, ніж найпростіше завдання:

  • виділяє пам'ять,
  • з'єднує ці гроші разом з очками
  • тому будуйте структури даних
  • тоді дозволяє повторно використовувати пам'ять, коли це безпечно

Немає загального підмножини Java та C ++, що дозволяє перераховане вище, тому те, що ви просите, зробити неможливо. (Якби ви запитували про Java та C #, у вас буде набагато більший шанс, оскільки вони обидва використовують сміттєзбірники.)

Однак ви можете вимагати написання коду, щоб розробник Java міг зрозуміти, що робиться (але не детальне "як"), і це було б розумно.

Ви також можете розробити власну мову, яку ви реалізували як на C ++, так і на JAVA .....


0

Ніхто не повинен писати код, який інші кодери не розуміють. Якщо ви вважаєте, що блокування мови є проблемою, зачекайте, поки ви не заблокуєте розробник. Один, швидше за все, тримає вас в заручниках, ніж інший.

Технічних причин справді немає. Що ви створили - це сценарій, коли мова використовувалася з будь-якої причини, але багато нинішні та, можливо, майбутні розробники не дуже її розуміють.

Моя здогадка, розробники Java, ймовірно, пишуть C ++ так, як вони пишуть на Java, так чому б це зробити правилом. Ви можете виявити деякі особливості C ++, які легше впроваджувати та підтримувати за допомогою невеликих інструкцій / документації на C ++ для ваших розробників Java, ніж великий бал безладу Java, який вони інакше застрягли б.

Це стало аргументом щодо проблем програмістів BASIC, які переходять на об'єктно-орієнтовані мови. Справа не в тому, що вони застосовують практику ООП на шкоду новим дияволам, які цього не розуміють, а в тому, що вони взагалі не застосовують його. Якщо вони це роблять, вони зазвичай розуміють неправильно. Якщо щось зроблено неякісно, ​​його потрібно видалити незалежно від причини.

Окрім того, що хтось лише сліпо копіює та вставляє код, вони збираються робити це у багатьох областях, які вони все одно не розуміють.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.