LINUX.ORG.RU

ооп и функциональщина кратко, внятно.

 , , ,


11

7

Дабы не слать напраслину на любителей создавать классы и объекты, пытаюсь разобраться в плюсах, которые отличаются от родителя, на первый взгляд, только названиями файлов, функций и приемами организации мышления погромиста. Так вот, эти ваши классы даже в учебнике называют почти структурами, а мизерное отличие сомнительного профита легко можно решить и в анси си(далее - ансися) при ближайшем обновлении. Ансися страдает перегрузкой названий функций для каждого из подлежащих обработке типов, отсутствием удобной иногда перегрузки функций, что, конечно минус, но не критично, ибо решаемо. Сиплюсик конечно удобен школьникам, тяжело принимающим всякие %s %d %x и так далее в качестве аргументов принтфов и сканфов, но зачем создавать для этого отдельный язык? Ведь << и >> становится лишним препятствием при освоении, если параллельно сдвиги битов читать. Итого, я вывел для себя, что в попытке облегчить участь программиста, разработчики языка усложнили его до степени родителя, не получив особенного профита. Чем же ооп так всем нравится, если оно не облегчает код?

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

ООП оказалось той темой которую обсуждали когда компы стали реально массовыми - произойди такое резкое увеличение числа менеджеров в программирование в другое время так же до сих пор пели бы осану структруному или ещё какому «серебряному» методу транспортации счастья.

ооп вообще если и имеет то значение для БОЛЬШИХ программных систем , где надежда на использование повторно кода заставляет формировать библиотеки функций и по возможности подсистем.

как хорошо показал опыт наследование в ООП самое «незначимое»

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

самое выстреливающее и приносящее пользу в ООП это полиморфизм - т.е возможность програмисту использовать связывание к коду в процессе исполнения и селекция по типу данных.

qulinxao ★★☆
()
Ответ на: комментарий от anonymous

А еще лучше - продемонстрировать это непосредственному начальству и дать гаденышу при увольнении увесистого пенделя.

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

AF ★★★
()
Ответ на: комментарий от minakov

Для себя я все понял, спасибо

А вот я не понял, ты против ООП, против С++, или против реализации ООП в С++?

AF ★★★
()
Ответ на: комментарий от PolarFox

В ассемблере как таковых нет ни структур, ни переменных.

Ну естественно, что всё транслируется в адреса и смещения, но struct.field синтаксис вроде не редкость.

GAMer ★★★★★
()
Ответ на: комментарий от AF

А так же существует масса способов наказать вредителя. Достаточно сделать так, чтобы его косяк стоил больших денег, и суметь адекватно это представить начальству. Если ты хикки-задрот, не способный двух слов связать - тогда у тебя проблемы. В любом другом случае задача тривиальная. Это я говорю как человек, начинавший трудовую карьеру еще при СССР.

anonymous
()
Ответ на: комментарий от anonymous

Если ты хикки-задрот, не способный двух слов связать - тогда у тебя проблемы

Связать слова не есть проблема. Проблема в том, кто эти слова слушает. Начальство не разбирается и не обязано разбираться в програмерских заморочках. Для начальства главное - усе работает!
Ну а когда в будущем взрывается заботливоприготтовленная быдлокодером мина, то начальство далеко не всегда способно проанализировать ситуацию и выявить реальную причину.

Вот как у меня недвано было. Босс, тут Вася у шаредпоинтеров счетчики инкрементит/деикрементит вручную, будет беда!! И ответ - та Вася синьор, я синьорам двоеряю. Вот сижу жду, пока Вася уйдет в отпуск или уволится и на когото этот код упадет ).

AF ★★★
()
Ответ на: комментарий от AF

Для начальства главное - усе работает!

Вот и показать ситуацию, где не работает. И рассказать про TCO.

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

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

И ответ - та Вася синьор, я синьорам двоеряю. Вот сижу жду, пока Вася уйдет в отпуск или уволится и на когото этот код упадет ).

Не надо ждать. Надо написать падающие тесты.

anonymous
()
Ответ на: комментарий от AF

ещё лучше

тогда чел реальне неосилятор там слово absolute очень кошерно для этого было. делаем по адрессу первого поля/независимой_переменной absolute массива чаров/байтов нужного размера(на момент компиляцие как раз вычисляется) и всё и телемаркет

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

qulinxao ★★☆
()
Ответ на: комментарий от anonymous

Тесты, экспертное мнение, это все хорошо! Но это все инструменты. А самые идеальные инструменты в руках самоуверенного идиота принесут пользы 0 целых хрен десятых.

AF ★★★
()
Ответ на: комментарий от qulinxao

работаеш с перемеными как независимыми сущьностями

Ага, а потом добавляешь новую переменную, которая не должна отсылаться где-то в середину блока и думай, почему все стало работать не так.

AF ★★★
()

тебе про raii и ексепшены уже писали?

nanoolinux ★★★★
()
Ответ на: комментарий от AF

Я за все, кроме издевательства над языками - читаю в С++ для начинающих: «вы можете объявлять переменные в цикле for, вы можете выводить и вводить данные вне зависимости от их типа и не задумываясь об этом», а ошибки типов при перегрузке функций, поданные как «маленькое неудобство» - это вообще что?? Ну да ладно, нравится играть в эксепшены и сегфолты, пожалуйста, мне понравилось держать данные на привязи. А ООП - это песня: структуру взяли, переименовали, покрасили, заставили явно указывать внутренние переменные и наружние, впихнули в нее функции, деструкторы и этот комбаин с именем «класс», продают как феррари, а бензина жрет поди как трактор(вот тут аргументов нет, я вообще интересующийся, и не знаю куда деваются приватные переменные во время вызова объедка, ну и так далее - вдруг там память вообще не расходуется зря...). И ладно только это! Создали философию и мне, как новичку, ковыряя чужой код приходится думать как автор программы, а не как погромист с++. Ну сделали в си пару дефайнов, ну посмотрел я их в хедере - все стало понятно сразу, там дефолт. А ваш ООП издевается над читателем кода. Вот примерно то, что я понял.

minakov ★★★★★
() автор топика
Ответ на: комментарий от minakov

вы можете объявлять переменные в цикле for

Ну можно и что тут такого? Не нравится обьявлять в for, не обьявляй.

вы можете выводить и вводить данные вне зависимости от их типа и не задумываясь об этом

Ну классно же! (Хотя для произвольного типа таки надо задумываться и код писать)

структуру взяли, переименовали, покрасили, заставили явно указывать внутренние переменные и наружние, впихнули в нее функции, деструкторы и этот комбаин с именем «класс»

Ага, все верно. Только ты забыл про то, что все это не обязательно использовать одновременно. А если попытаешся все тоже самое сделать на чистом С, то прийдется больше печатать.

А ваш ООП издевается над читателем кода. Вот примерно то, что я понял.

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

AF ★★★
()
Ответ на: комментарий от geekless

Уж насколько php убогонький недоязычок, но быдлокодеры демонстрируют, что по сравнению с тем кодом, который они на нём творят, — сам язык недостижимый идеал. Можешь начать чтение документации отсюда http://www.php.net/manual/en/function.array-shift.php , вместо «подсматривания» способов, как вырывать зубы через задницу.

я в курсе про эту функцию. А в чём её профит для очереди перед unset()?

emulek
()
Ответ на: комментарий от cdshines

Что в этом ужасного? Не знаю, меня коробит от этих динамических языков.

меня тоже коробило. По началу. А потом привык.

Еще неизвестно, кто сильнее в ногу выстрелит - сишник, подсунувший функции пустой указатель, или пхпшник, подсунувший в массив интов строку.

ясное дело — пхпшник, он даже и не заметит своей ошибки.

emulek
()
Ответ на: комментарий от Ivan_qrt

Matrix sum(const Matrix &A, const Matrix &B)

будет короче и нагляднее?

с учётом реализации — да. Как минимум оно будет в одном месте, а не в двух, а может в 10и. Понятно что плюс складывает, но вот КАК — не вполне очевидно, особенно с учётом того, что метод может быть где-то и перезагружен.

ЗЫЖ я не говорю, что это плохо. Это иногда удобно (особенно, если кто-то за тебя уже написал sum()), но иногда и не очень. Существует опасность того, что метод будет не оптимальный в данном случае. Хотя обычно этим и можно пренебречь. На выходе получаем Windows7 и KDE4, можно сколько угодно плеваться, но факт остаётся фактом: без C++ они были-бы написаны к 3000у году. Не раньше.

emulek
()
Ответ на: комментарий от lazyklimm

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

лично мне без разницы, дело привычки. Куда как сложнее было привыкнуть к тому, что = это иногда operator=(), а иногда конструктор копирования.

emulek
()
Ответ на: комментарий от emulek

Понятно что плюс складывает, но вот КАК — не вполне очевидно

Понятно что sum(Matrix &a, Matrix &b) складывает, но вот КАК — не вполне очевидно

arkhnchul ★★★
()
Ответ на: комментарий от wota

ИМХО ТАКОЕ лучше даже на пхп НЕ писать. Я-бы тут даже на пхп всё равно написал intval(a)+intval(b), ибо это грабли.

А уж в C++ увлечение операторами преобразования всего во всё === ППЦ. ИМХО не для того их вообще придумывали.

emulek
()
Ответ на: комментарий от minakov

продают как феррари, а бензина жрет поди как трактор(вот тут аргументов нет

ты не знаешь ни плюсов, ни феррари :) Сравнил зажор у V12 и дефорсированной рядной четверки какой-нибудь «Беларуси» (Феррари в пробке на мкаде еще и кировец заткнет за пояс по зажору). Аргументов тут и правда нет - только бредовые неработающие аналогии.

slackwarrior ★★★★★
()
Ответ на: комментарий от minakov

А ООП - это песня: структуру взяли, переименовали, покрасили, заставили явно указывать внутренние переменные и наружние, впихнули в нее функции, деструкторы и этот комбаин с именем «класс», продают как феррари, а бензина жрет поди как трактор(вот тут аргументов нет, я вообще интересующийся, и не знаю куда деваются приватные переменные во время вызова объедка, ну и так далее - вдруг там память вообще не расходуется зря...).

http://i142.photobucket.com/albums/r100/frozentrall/181148-triple_facepalm_su...

geekless ★★
()
Ответ на: комментарий от minakov

структуру взяли, переименовали, покрасили, заставили явно указывать внутренние переменные и наружние, впихнули в нее функции, деструкторы и этот комбаин с именем «класс», продают как феррари, а бензина жрет поди как трактор

феррари и едет быстрее. А в C++ быстрее пишется код. Конечно на хэлловорлдах ты этого не заметишь. И ты там вроде как встроенную ковыряешь? Там тоже не нужно (раньше было, сейчас не знаю).

emulek
()
Ответ на: комментарий от slackwarrior

есть много применений. К примеру умный указатель тоже может никуда не указывать, и потому его можно приводить к bool, как обычный указатель. Логично это делать неявно. Но вот строку к целому лучше специальным методом, ибо поведение совсем не обязано быть логичным и однозначным. Неравенство "Маша" < 3 имеет множество смыслов, среди которых есть и отсутствие всякого смысла.

ЗЫЖ и да, в DSL, AFAIK принято приводить «младший» к «старшему», т.е. число в строку, но никак НЕ наоборот. Это преобразование как минимум нелогично, а следовательно должно быть описано явно.

emulek
()

Во-первых, ООП начинается не тогда, когда структуру обзывают классом. ООП начинается с наследования и виртуальных методов.

Во-вторых, в плюсах главное — не ООП, главное — метапрограммирование, сиречь шаблоны.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

наследование это то, что не взлетело , взлетело «инкапсуляция» через интерфейсы , ну а уж рекомендация включать вместо наследовать давно притча во языцах.

таблица виртуальных методов - вот и всё.

qulinxao ★★☆
()
Ответ на: комментарий от AF

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

qulinxao ★★☆
()

да, я могу тебе кратко ответить, почему си не хватает и почему был сделан с++

разница, в общем-то, именно в организации (примерно как ты сказал «приемами организации мышления погромиста»)

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

вот, скажем, если у тебя комната, где хранится всего 10 вещей, то ты вполне можешь недоумевать, зачем тебе «приемы организации хранения вещей в комнате», а вот когда у тебя будет *промышленное* складское помещение с десятками тысяч названий, то поймешь

для простоты изложения я продолжу аналогию с комнатой

допустим, ты и твой братец живут в одной комнате, и у вас нет «приемов организации хранения вещей в комнате»; тогда братец может встать, одеть твои тапки, а когда встанешь ты, то тебе придется искать его тапки, которые, конечно, неизвестно где, либо идти босыми ногами по холодному полу

в с++ компилятор *тоже* знает «приемы организации хранения вещей в комнате», поэтому не даст никому из вас одеть чужие тапки; компилятор, в принципе, можно обмануть, но если в результате кому-то придется идти босиком по холодному полу, то все программисты в команде будут знать, кто обманщик, и кому выписать волшебных пинков под зад — в отличие от си, где без «приемов организации хранения вещей в комнате» выяснить, кто виноват, невозможно

да, можно составить документ, описывающий «приемы организации хранения вещей в комнате» на си, но 1. компилятор си не будет следить за этим, 2. этот документ будет не полон, и 3. его придется исправлять для другого проекта

да, эти недостатки можно исправить, но результатом исправления будет твой личный с++

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 2)

сколько флейма ты развел

anonymous
()

Забавно... Всегда одни и те же вопросы. И всегда вместо того чтобы один раз прочитать статьи Л. Карделли и (ранние) М. Одерского, читают всякую писанину типа высеров долбака Буча.

Ну, вот тебе ООП-читшыт.

1. Класс - химера. Объединяет в себе «тип», «интерфейс», «поведение».

2. Тип. В данном конкретном случае то же самое что и множество. Т.е. class Foo <==> все объекты класса Foo принадлежат множеству Foo.

3. Интерфейс. Набор операций, который можно производить с объектами данного класса. (Не путать с abstract class и interface).

4. Поведение. Неформальное соглашение между пользователем и создателем.

5. Наследование. Если наследуем, то либо сразу тип, интерфейс и поведение, либо не наследуем ничего вообще.

6. Полиморфизм. Два типа: универсальный и специальный (иногда его называют ad-hoc).

7. Универсальный полиморфизм. Работает на бесконечном множестве классов. Два вида: параметрический и полиморфизм переопределения методов.

8. Специальный полиморфизм. Работает на конечном множестве классов. Два вида: перегрузка и преобразование типов.

9. Инкапсуляция. Неформально определенная мера насколько тип того или иного класса является абстрактным (не путать с abstract class). Или, количество информации о внутреннем устройстве.

Ну и всякие родственные концепции: метакласс, шаблонное метапрограммирование, рефлекися, динамически изменяемые интерейсы, прототипное ООП. Далеко не все они имеют прямое отношение к ООП.

Нафиг все это? Вообще не нафиг. Одни запилили фреймворк для симуляции чего-то там. Другие подметили, что вообще-то с помощью него можно моделировать произвольные программы. Третьи прониклись концепцией интерфейса, и запили ее себе, т.к. их мегаязык принципиально не поддерживал концепцию модулей. Получилось весьма годно, но в процессе работы понятие события исчезло. Четвертые нихера не поняли первых, вторых и третьих, но реализацию таки запилили. Получилось не то чтобы совсем худо, но луче бы они пилили систему модулей. Пятые нихера не поняли первых, вторых, третьих и четвертых, но поняли что можно срубить бабла и придумали термин ООП. ИЧСХ, срубили. Шестые не поняли даже пятых, но имели проблему с реюзабельностью кода. А ООП в какой-то степени ее решало. И понеслось. Поналетели всякие евангелисты и прочие пораженные СПГС. Тут же нашлись всякие разные обоснования. Была написана гора литературы типа «мы запилили ООП и наступило щастье». Результат? Дык, собака лает, караван идет.

Macil ★★★★★
()
Ответ на: комментарий от geekless

https://www.kernel.org/

его спасает жесткий контроль и высокий уровень программистов

https://developer.gnome.org/glib/2.32/

наглядный пример ущербности ЯП, Ъ-проекты на С не мараются использованием этого набора костылей

wota ★★
()
Ответ на: комментарий от wota

его спасает жесткий контроль и высокий уровень программистов

Любой промышленный проект на любом языке спасает жесткий контроль и высокий уровень программистов. Иначе — никак.

наглядный пример ущербности ЯП, Ъ-проекты на С не мараются использованием этого набора костылей

Наглядный пример балабольства wota.

geekless ★★
()
Ответ на: комментарий от geekless

Любой промышленный проект на любом языке спасает жесткий контроль и высокий уровень программистов. Иначе — никак.

сразу видно, что ты не видел загоны с жабо-обезьянками, обычно там есть только жесткий контроль, да и то не всегда

Наглядный пример балабольства wota.

а чо, у тебя багет, лалка? смотрим с самого начала:

https://developer.gnome.org/glib/2.32/glib-Basic-Types.html

вот это не костыли? ты еще скажи, что так и надо

wota ★★
()
Ответ на: комментарий от wota

а какое у них замечательное ООП...

g_signal_new("child-finished",
    G_TYPE_OBJECT,
    G_SIGNAL_RUN_FIRST,
    0,
    NULL, NULL,
    NULL,           // *** I think this is where I need to change it
    G_TYPE_NONE, 0);

просто мечта

wota ★★
()
Ответ на: комментарий от qulinxao

конкретизируй статьи pls

Cardelli On Understanding Types, Data Abstraction, and Polymorphism

С Одерским, не понмню где имeнно. Где-то в начале 90-х и не в одной статье.

почти всё так

А что еще? Интересно же.

Macil ★★★★★
()
Ответ на: комментарий от minakov

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

У тебя каша в голове, судя по всему. Конечно Страуструп зря решил городить подмножество C, откуда, кстати, и появился вырвиглазный синтаксис.

m0rph ★★★★★
()

ответ не на ОП, а на многие комментарии:

http://yosefk.com/c fqa/

В идеальном мире, где люди читают факи, предложил бы добавить эту ссылку в фак. Хотя, никто же не знает, может она уже там :)

MyTrooName ★★★★★
()
Ответ на: комментарий от Macil

в смысле взляд на ооп постепенно в целом становится массовым ,

всё по старому наблюдению новая концепция замещает старую часто по причине вымирания стороников старой.

а ООП - да религия , чё уж.

qulinxao ★★☆
()

ООП облегчает построение кода. Возможно, у вас просто пока не получается правильно использовать ООП.

Что касается С++, то он гораздо лучше С(перегрузка функций, ООП, пространства имен, шаблоны, RAII, лямбды, вывод типов, стандартная библиотека(контейнеры, алгоритмы, объекты-функции, нити, строки, регекспы и пр.) и пр., так же возможно появятся модули, концепты, мультиметоды и много чего другого).

Проблема в том, что процесс его изучения до такого уровня очень долгий и не всегда приятный. При этом язык таки позволяет существовать быдлокодерам, что печалит.

Вообще, если тебя устраивает производительность и расход памяти, используй(и изучай соответственно) Scala.

anonymous
()
Ответ на: комментарий от PolarFox

_Generic не является полноценной перегрузкой. Костыль, как в сишечке любят.

Допустим в библиотеке есть набор функций, вызываемых из _Generic. Как мне при реализации своего типа добавить перегрузку функции для него, не трогая то определение с _Generic?

anonymous
()
Ответ на: комментарий от minakov

чем классы лучше структур

Разделением на интерфейс/реализацию, поздним связыванием без лишнего кода, построением иерархий, реализацией принципа «открыт-закрыт» и пр.

Читай Буча и Мейера.

anonymous
()
Ответ на: комментарий от stevejobs

структуру нельзя пихать в шаблон

С вашим уровнем знания С++ нужно спрашивать, а не объяснять.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.