Чому C ++ все ще є "гібридом"


16

У відповідному питанні було з’ясовано, чому C ++ у багатьох аспектах не сумісний із C. Однак C ++ все ще є "гібридною" * мовою. І на жаль, багато програмістів все ще розглядають C ++ як "C із потоками та вбудованими рядками". Це призводить до дійсно поганого письмового коду, що це не є ні C ++, ні C. IMHO, було б краще, якби мова / компілятор змусили певною мірою програмістів написати більш елегантний код. Тож чи існує обґрунтування збереження сучасного C ++ (наприклад, C ++ 0x та майбутніх версій) гібридом?

* Під гібридом я маю на увазі, що програміст повинен вирішити, чи буде він / вона використовувати: стандартні рядки та потоки, класи, простори імен, крім стандартних, тощо.


Чи існують параметри компілятора / IDE, які могли б це застосувати?
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner Я не знаю жодних інструментів, які роблять це. Але було б більше сенсу писати такий інструмент (компілятор, IDE тощо), якби ці функції були частиною стандарту C ++.
sakisk

2
C ++'s raison d'etre - це зворотна сумісність і можливість використовувати всі брудні хитрощі, які були можливі в C. Забирай це, і це просто ще один C #, D або Java-клон. Якщо ви цього хотіли, чому б не просто використовувати C #, D або Java?
nikie

5
@nikie: Хахахаха. Оскільки шаблони, типи значень, чіткі посилання, детерміновані руйнування, багаторазове успадкування, швидкість виконання, низьке використання пам'яті, ці речі взагалі не існують.
DeadMG

2
@nikie: За винятком D, також існують гидоти, такі як Objectі двійкове копіювання рейтингів та асоційовані масиви, розроблені мовою (чому ...), а також інші власні сумнівні дизайнерські рішення. Крім того, він також має таку ж парадигму GC, як і інші, тому я б сумнівався, що це низьке використання пам'яті.
DeadMG

Відповіді:


26

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


1
Звичайно, але оскільки це стосується лише застарілого коду, чому новіші версії C ++ повинні залишатися сумісними? Спадковий код все ще може використовувати старішу версію C ++.
sakisk

15
@faif, у своїй роботі я весь час пишу новий код C ++, який потребує взаємодії з новим кодом С. Це не лише питання спадщини.
Карл Білефельдт

5
@faif: новіші версії C ++ мають бути сумісними назад - не тільки для підтримки старих кодів С, але і декількох сотень мільйонів рядків існуючого коду C ++. Якщо ви хочете чогось не сумісного назад, але краще спроектованого, ви можете перейти на мову на зразок D. До речі, ось справді гарна стаття про необхідність зворотної сумісності Джоела Спольського: joelonsoftware.com/items/2008 /03/17.html
Док Браун

4
The best we can do is make it easy to write good code.- Ми говоримо про той самий C ++?
BlueRaja - Danny Pflughoeft

4
@ BlueRaja-DannyPflughoeft: Мені набагато простіше написати хороший код на C ++, ніж на Java або C #. За допомогою C ++ я можу читати клас, і якщо всі інші класи поводяться, я знаю, що пам'ять та ресурси не просочуються. З Java та C # я не можу цього зробити; Мені потрібно пройти огляд інших класів, щоб побачити, чи потрібен будь-який з них. Шаблони C ++ також дозволяють мені НАДУВИТИ код, який потрібно повторити на Java.
Кевін Клайн

20

IMHO, було б краще, якби мова / компілятор змусили певною мірою програмістів написати більш елегантний код.

Ні, не буде. Зовсім. Як тривіальна демонстрація того, чому, визначте елегантне, і тоді я ставлю на облік, що десять людей прийдуть не погодитися з вами.

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

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

Не використовувати класи та простори імен - це нормально для коду стилю дошки, і є багато, багато бібліотек, які надають функції не в класі. Примусовий клас - це дійсно погана ідея.


+1 за дещо реалістичніший підхід (коли припиниться розмова про «елегантний код»: /
Rook

2
"Стилі кодування з урахуванням мови - це дуже, дуже погано." Чи можете ви навести кілька прикладів? Я думаю, що навіть такі прості речі, як примусове відступ коду Python, покращують читабельність коду.
sakisk

3
Я не впевнений, чи згоден я з цим. Основна причина використання CoffeeScript через JavaScript полягає в тому, що CoffeeScript призначений для забезпечення написання більш елегантного коду.
user16764

3
Не можу з цим погодитися. Деякі мовні конструкції мають на меті заохочувати добру практику, а розповсюдженість, що надає більшу частину C ++, як правило, це виключає. Насправді, вимкнення мови, збереження хороших частин та покращення решти - головна мотивація існування C ++ 11 .
Роберт Харві

1
@Pubby: "Писати некрасиву програму, яка працює краще, ніж писати прекрасну програму, яка нічого не робить". Звичайно, я можу з цим погодитися. Але ця стаття виходить за рамки цього і, здається, стверджує, що потворність насправді є чеснотою. І це просто смішно.
Мейсон Вілер

8

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

IMHO, було б краще, якби мова / компілятор змусили певною мірою програмістів написати більш елегантний код.

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

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

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


1
Не можу погодитися більше. Я думаю, що коли хтось каже "C ++ є гнучким", я би подумав так, оскільки він підтримує набагато більше парадигм, ніж C.
прелік

5

IMHO, було б краще, якби мова / компілятор змусили певною мірою програмістів написати більш елегантний код.

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

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

Сумісність C ++ із C, безумовно, є одним із найслабших моментів, але також майте на увазі, що це один із його найбільших.


Я збираюся додати чудову цитату Джона Перді, яку я вважаю надзвичайно актуальною:

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

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


Чи вірите ви, що прагматизм та витонченість суперечать один одному? Я думаю, що Python, Ruby та Scala - хороші приклади мов, які є і прагматичними, і елегантними.
sakisk

1
@faif: Ні, але зворотна сумісність та елегантність суперечливі. Це стосується і Python (2.x проти 3.x).
dan04

4

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

Багато чого з того, що ви виступаєте, - це справді справа про судження, в будь-якому випадку на основі проблемної області. Існує безліч невеликих програм, яким просто не потрібні (на один приклад) простори імен. Спроба змусити мене використовувати простір імен, коли я пишу текстовий фільтр на 30 рядків, було б нерозумно і зарозуміло. Навіть якщо ви вирішили, що він застосовуватиметься лише тоді, коли буде задіяно більше X рядків коду, або Y-функцій, або що б там не було, це все одно буде контрпродуктивним. Простори імен були розроблені з причини, щоб запобігти / вилікувати конкретні проблеми. Спроба насильницького їх використання за відсутності цих проблем нікому не приносить корисного.

У той же час, я думаю, що варто відзначити, що досить багато людей дійсно витрачають багато часу і зусиль, намагаючись не лише додати елегантності в C ++, але навчити і примусити людей використовувати ці можливості для написання кращого коду (наприклад, багато учасників Boost). Таким чином, люди, які продовжують наполягати на написанні коду як "C з класами", ігнорують те, що там все одно. Я думаю, що їм буде так само зручно ігнорувати нові компілятори, як ігнорувати все, що було вивчено про використання C ++ за останнє десятиліття або більше (наприклад, Сучасний дизайн C ++ був опублікований вже 11 років тому - але більшість людей ви про це, мабуть, ще не чули, тим більше читали і не розуміли навіть найпростіші його частини).


2

Ваша ідея є значною мірою обґрунтуванням дизайну Java. Java змушує використовувати класи, впорядковувати ієрархію файлів відповідно до ієрархії пакетів, виловлювати винятки тощо. Люди все ще встигають записати в неї код, подібний С.

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


0

C ++ не має "жодного справжнього шляху"; кожен підхід має сильні та слабкі сторони. Розв’язання можна записати сто різними способами.

Ви, як розробник програмного забезпечення, повинні вирішити, який підхід найкраще підійде до завдання.


0

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

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

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

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

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