Подскажите начинающему программеру
Модератор: Модераторы разделов
-
minoru-kun
- Сообщения: 621
- ОС: Debian GNU/Linux
Re: Подскажите начинающему программеру
С++ = С + ООП.
Имхо, C++ отлично подходит для моделирования (и других видов описания явлений объектно-ориентированной природы), а так же для разработки больших проектов со сложными структурами данных. Сначала следует изучить C, и только потом C++, иначе весь код, который вы напишите на C++, наверняка будет индийским.
Имхо, C++ отлично подходит для моделирования (и других видов описания явлений объектно-ориентированной природы), а так же для разработки больших проектов со сложными структурами данных. Сначала следует изучить C, и только потом C++, иначе весь код, который вы напишите на C++, наверняка будет индийским.
-
wzrd
- Сообщения: 323
- ОС: Debian Lenny
Re: Подскажите начинающему программеру
подобие ООП есть и в C. C++ силен своей стандартной библиотекой, ну и более навороченным ОПП
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Подскажите начинающему программеру
(minoru-kun) писал(а):С++ = С + ООП.
Это неполное утверждение. С++ это не только С + ООП.
(minoru-kun) писал(а):Сначала следует изучить C, и только потом C++, иначе весь код, который вы напишите на C++, наверняка будет индийским.
Страуструп говорит иначе. Я уже писал выше, что С++ следует учить как отдельный язык.
(wzrd) писал(а):подобие ООП есть и в C.
Что ты имеешь в виду? Как, на твой взгляд, в С реализовано ООП?
-
Фантом
- Сообщения: 463
- ОС: openSUSE
Re: Подскажите начинающему программеру
Это во многом не так. ООП - одна из дополнительных особенностей С++, но только одна из нескольких.
minoru-kun писал(а): ↑15.03.2008 19:14Имхо, C++ отлично подходит для моделирования (и других видов описания явлений объектно-ориентированной природы), а так же для разработки больших проектов со сложными структурами данных. Сначала следует изучить C, и только потом C++, иначе весь код, который вы напишите на C++, наверняка будет индийским.
Как показывает опыт, обычно бывает наоборот. Сначала человек, например, привыкает описывать константы и inline-функции с помощью макросов, а потом, при переходе на C++, мучительно отвыкает обратно (если вообще отвыкает). C++, даже за вычетом всего, связанного с ООП - язык, существенно более строгий, чем C (хотя и ему далеко до идеала).
Поскольку сейчас почти везде (кроме embedded-систем) использование C++ вместо C не влечет практически никаких накладных расходов, то "в среднем" разумнее изучать и использовать именно C++.
-
wzrd
- Сообщения: 323
- ОС: Debian Lenny
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Подскажите начинающему программеру
Но структуры недостаточно для реализации ООП. Это лишь малая часть...
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Подскажите начинающему программеру
Да всего достаточно. См. Gtk, к примеру.
А вообще, от С++ до ООП - дистанция огромного размера...
А вообще, от С++ до ООП - дистанция огромного размера...
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
bahurin
- Сообщения: 13
- ОС: SUSE
Re: Подскажите начинающему программеру
deninok писал(а): ↑14.03.2008 22:42(wzrd) писал(а):(Portnov) писал(а):Изучать же сначала С, а потом С++ имхо категорически нельзя.
а можете сказать почему? просто я думаю по другому.
Хотя вопрос был задан не мне, выскажу свое мнение.
Переход на С++ после изучения С (особенно если опыт работы с С был немалым) действительно тяжел. Так говорит и Страуструп. Он, выбрав С в качестве основы для С++, как никто другой знал различие между этими языками.
Дело в том, что, работая с С, программист (так или иначе) привыкает к его особенностям и парадигме. Скажу больше: он привыкает к философии С. И чем дольше программист следует этой философии в своей профессиональной деятельности, тем сильнее свыкается с ней.
А у С++ философия совсем другая. Чтобы (по-настоящему) эффективно использовать этот язык, необходимо научиться "думать на нем". И если за изучение С++ берется С-программист, он вынужден ломать свое восприятие программирования. Если говорить об ООП как о распространенной парадигме, поддерживаемой С++, то использовать ее правильно может лишь тот программист, который научился мыслить "объектно-ориентированно". А (в большинстве случаев) для С-программиста это неестественно. Поэтому ему приходится фактически переучиваться.
Я сам пришел к С++ от С. И мне действительно пришлось переучиваться. А ведь это немалая потеря времени и сил. Могу сказать, что даже сейчас, после (примерно) двух лет постоянной работы с С++ мне все еще трудно избавиться от "С-шности" в своей программе.
Мой приятель долгое время писал программы на си для микроконтроллеров. После начал писать по для компьютера. Так вот заметил что ни одного класса он не написал. Пишет под винду использую только win32api. Когда я ему показал борландовскую библиотеку vcl, или qt, то он сказал, что это все от лукавого и использовать ее не хочет, потому что за годы программирования на си привык к функциям и ООП его просто пугает. главный аргумент его - в вмн32апи нет ниодного класса. Так что пожалуй соглашусь, что переход с Си к с++ довольно сложен психологически.
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Подскажите начинающему программеру
(Portnov) писал(а):А вообще, от С++ до ООП - дистанция огромного размера...
Простите, не понял... Какая может быть дистанция, если С++ непосредственно поддерживает ОО-парадигму?
-
divenvrsk
- Сообщения: 379
- ОС: Ubuntu, openSuSE
Re: Подскажите начинающему программеру
deninok писал(а): ↑16.03.2008 13:50(minoru-kun) писал(а):С++ = С + ООП.
Это неполное утверждение. С++ это не только С + ООП.
(minoru-kun) писал(а):Сначала следует изучить C, и только потом C++, иначе весь код, который вы напишите на C++, наверняка будет индийским.
Страуструп говорит иначе. Я уже писал выше, что С++ следует учить как отдельный язык.
(wzrd) писал(а):подобие ООП есть и в C.
Что ты имеешь в виду? Как, на твой взгляд, в С реализовано ООП?
Objective C как пример ООП на С , 100% совместимость кода и поддержка в gcc.
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Подскажите начинающему программеру
Хм... Признаться, совершенно не знаком с Objective C (кроме того, что слышал о нем).
Однако, говоря о С (о чистом ISO C), можно сказать, что на нем можно писать ОО-программы. Более того, на С можно сымитировать все механизмы поддержки ООП (такие, как наследование и вызов виртуальной функции), ибо низкоуровневые детали этих механизмов известны. Однако речь идет главным образом не о том, что можно или нельзя писать на С или С++, а о том, для чего каждый из них предназначен. Парадигма ООП закладывалась в С++ изначально, в С она не закладывалась.
Однако, говоря о С (о чистом ISO C), можно сказать, что на нем можно писать ОО-программы. Более того, на С можно сымитировать все механизмы поддержки ООП (такие, как наследование и вызов виртуальной функции), ибо низкоуровневые детали этих механизмов известны. Однако речь идет главным образом не о том, что можно или нельзя писать на С или С++, а о том, для чего каждый из них предназначен. Парадигма ООП закладывалась в С++ изначально, в С она не закладывалась.
-
wzrd
- Сообщения: 323
- ОС: Debian Lenny
Re: Подскажите начинающему программеру
deninok, я и не утверждаю что C создан для ООП. я бы сравнил С и C++ с actionscript 1.0 и actionscript 2.0, та же самая ситуация, в первом можно писать в ОО стиле, но он не предназначен для этого, а втором уже есть поддержка ООП, но на самом деле это всего лишь изменение синтаксиса и добавление некоторых удобств, то есть всё это было, но не было реализовано должным образом.
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Подскажите начинающему программеру
В С++ заложена довольно сильно прищемленная дверью ОО-парадигма. Например: в ОО-языках всё есть объект, а в С++ объектами являются только экземпляры классов; Инкапсуляция понимается почему-то как сокрытие данных объекта (хотя вообще-то не имеет к сокрытию данных никакого отношения); Полиморфизм настолько тесно связан с наследованием, что кажется, будто это "обратная сторона наследования" (хотя по идее он никак не связан с наследованием); Интроспекции и динамизма нет вообще.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Подскажите начинающему программеру
(Portnov) писал(а):Например: в ОО-языках всё есть объект, а в С++ объектами являются только экземпляры классов
Это зависит от того, как вы интерпретируете термин "объект". В С++ переменная int i вполне может быть рассмотрена как объект. Другое дело, нужно ли простую переменную рассматривать как объект... Как сказал один очень известный программист (имя забыл): "Иногда переменная должна быть всего лишь переменной".
(Portnov) писал(а):Инкапсуляция понимается почему-то как сокрытие данных объекта (хотя вообще-то не имеет к сокрытию данных никакого отношения)
В С++ инкапсуляция - это не сокрытие данных, а защита данных. Сокрытие и защита - принципиально разные термины.
Впрочем, дабы не начинать очередной раунд давнишнего спора о том, "какой язык лучше", спрошу вас (просто для личного интереса): в каком языке, на ваш взгляд, ОО-парадигма реализовано лучше, чем в С++?
-
Subj
- Сообщения: 151
- Статус: Useful
- ОС: win
Re: Подскажите начинающему программеру
Ну не знаю насчет что лучше что хуже, но попробую в двух словах описать как ООП реализован в Аде.
Обеспечение полной поддержки ООП появилось в стандарте Ada95 с введением теговых типов, особенностью которых является возможность расширения существующего типа данных при наследовании и динамической диспетчерезации вызовов примитивных операций.
В традиционном понимании, слово "класс" трактуется как спецификация типа данных и множество методов (операций) этого типа данных. В отличие от этого, Ада трактует понятие "класс" как набор типов которые объединены иерархией наследования.
Возможности "класса" (допустим в С++ или Делфи) в Аде осуществляются связкой возможностей теговых типов(наследование и полиморфизм) и стандартных возможностей такой единицы как "пакет" (все остальное).
Использование пакетов Ады, как инструмента абстракции данных, подобно классам в других объектно-ориентированных языках программирования, где в качестве средства абстракции данных используется класс, определяющий тип данных, множество операций и действия, необходимые для инициализации.
Класс имеет вид более чистой реализации абстрактного типа, однако он требует некоторых дополнительных затрат производительности. Класс обеспечивает неявное дублирование объектов, предоставляя (по крайней мере в принципе) новое множество операций для каждого объекта, генерируемого классом. Пакет нельзя дублировать, и поэтому все операции пакета одни и те же для всех объектов. При сравнении пакетов и классов доводы в пользу классов, как правило, основаны на эстетических соображениях. Практически пакеты Ады полностью соответствуют требованиям реализации абстрактных типов данных, и, кроме того, имеют по сравнению с классами множество других применений.
Стандарт Ada2005 внес несколько расширений в модель ООП, как то интерфейсы, аналог factory и пр.
Building better software with Ada
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Подскажите начинающему программеру
Мде? Перечислите плиз атрибуты этого объекта (ООП предполагает, что у каждого объекта есть атрибуты). Ну например i->attr. А какие методы есть у этого объекта?
Разверните, пожалуйста.
Тем не менее, термин "инкапсуляция" не означает ни сокрытия данных, ни защиты данных (если я хотя бы примерно правильно понимаю термин "защита данных" - первый раз его слышу). Термин "инкапсуляция" означает "хранение методов обработки данных вместе с данными", не больше и не меньше.
Smalltalk, Ruby, Python, да даже в Java - и то лучше.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Подскажите начинающему программеру
(Portnov) писал(а):ООП предполагает, что у каждого объекта есть атрибуты). Ну например i->attr. А какие методы есть у этого объекта?
Вот это я как раз и имел в виду, уважаемый Portnov
Открытым атрибутом объекта int i является i (ведь атрибут может быть и один, не так ли?). А что касается методов... К объекту i применим ряд операторов, выполняющих известные математические действия. Эти операторы можно представить себе как методы этого объекта. Ведь существуют же такие объекты, методами которых являются только перегруженные операторы, не правда ли?.. И даже инициализация переменной int i может быть выполнена (синтаксически) подобно инициализации объекта пользовательского типа - вызовом псевдоконструктора.
И опять же повторю уже цитируемые мною слова: "Иногда переменная должна быть всего лишь переменной".
(Portnov) писал(а):Термин "инкапсуляция" означает "хранение методов обработки данных вместе с данными", не больше и не меньше.
К сожалению, вы не совсем правы. Да, инкапсуляция подразумевает объединение данных с методами их обработки, однако этого совершенно недостаточно. Инкапсуляция всегда подразумевает еще и защиту реализации объекта от внешних контекстов (под защитой я подразумеваю такое строение объекта, при котором исключено (непреднамеренное) нарушение его внутренней структуры). Если говорить конкретно, то грубейшим нарушением инкапсуляции является объявление данных объекта открытыми (за исключением особых, очень редких случаев).
(Portnov) писал(а):(deninok) писал(а):в каком языке, на ваш взгляд, ОО-парадигма реализовано лучше, чем в С++?
Smalltalk, Ruby, Python, да даже в Java - и то лучше.
Хм... Благодарю за ответ. Буду знать.
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Подскажите начинающему программеру
Метод объекта должен быть реализован внутри объекта (см. инкапсуляция). Арифметические действия реализованы внутри переменной i ? Потом, методы объекта обычно доступны в форме объект.метод (или похожей, например объект->метод), например то же сложение (+) может быть доступно как a.__add__(b) (см. принцип общения через посылку сигналов от А.Кея). Где это в с++?
deninok писал(а): ↑19.03.2008 21:26Да, инкапсуляция подразумевает объединение данных с методами их обработки, однако этого совершенно недостаточно. Инкапсуляция всегда подразумевает еще и защиту реализации объекта от внешних контекстов (под защитой я подразумеваю такое строение объекта, при котором исключено (непреднамеренное) нарушение его внутренней структуры). Если говорить конкретно, то грубейшим нарушением инкапсуляции является объявление данных объекта открытыми (за исключением особых, очень редких случаев).
Если вам нужно защитить объект от неправильного изменения его состояния, то нужно явно выписывать его инварианты (функции от состояния, которые должны оставаться постоянными) и реализовывать их проверку при каждом присваивании, по-другому никак. Кроме того, это в принципе невозможно в языке, где есть указатели:
Код: Выделить всё
class A....
A* a = new A;
memset(a,0,sizeof(A));И как в приведенном примере инкапсуляция защитила объект?..
В том же python все атрибуты и методы объекта доступны снаружи (в терминах c++, они public). Это никак не мешает инкапсуляции. А чтобы программист не делал с объектом что попало, есть документация. Кроме того, с помощью метаклассов или декораторов классов в python можно оч.красиво реализовать проверку инвариантов при каждом изменении состояния. Это хоть как-нибудь возможно в с++?
ну и т.д. Спорить дальше я не буду - скучно уже. Если вам еще не надоело - можете развлечься в community.livejournal.com/ru_anti_cpp.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Подскажите начинающему программеру
Ну, на том и закончим... А то уже явный оффтоп пошел.
-
AMD
- Сообщения: 478
- Статус: Maestro
- ОС: Linux Kubuntu 7.10
Re: Подскажите начинающему программеру
Не не - чтото вы быстро кончили ребята
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Подскажите начинающему программеру
Можно, конечно, и продолжать, но тогда модераторы форума справедливо сочтут нас за холиварщиков, ведь дискуссия о том, какой язык лучше подходит для реализации ООП - извечный и очень горячий холивар. Да и потом для этого разговора данная тема действительно не подходит, надо отдельную открывать. Но эта тема не относится к программированию в Linux (или в другой ОС), поэтому данный форум, вероятно, не лучшее место для подобных дискуссий...
Хотя, признаюсь честно, у меня есть некоторые мысли об ООП и С++.
Хотя, признаюсь честно, у меня есть некоторые мысли об ООП и С++.
-
AMD
- Сообщения: 478
- Статус: Maestro
- ОС: Linux Kubuntu 7.10
Re: Подскажите начинающему программеру
Portnov писал(а): ↑19.03.2008 19:53
Разверните, пожалуйста.
Тем не менее, термин "инкапсуляция" не означает ни сокрытия данных, ни защиты данных (если я хотя бы примерно правильно понимаю термин "защита данных" - первый раз его слышу). Термин "инкапсуляция" означает "хранение методов обработки данных вместе с данными", не больше и не меньше.
Кстати видео урок во флэше что такое "инкапсуляция" - там даже конкретный пример дан
http://dump.ru/files/o/o323513813/
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Подскажите начинающему программеру
Хм... Посмотрел я этот ролик. Ну не то чтобы очень хороший, но для новичков сойдет. Правда, об инкапсуляции сказано неточно, ибо упомянута защита методов объекта, но ни слова не сказано о защите членов-данных объекта...
-
AMD
- Сообщения: 478
- Статус: Maestro
- ОС: Linux Kubuntu 7.10
Re: Подскажите начинающему программеру
По информации из интернета бытуют два понятия про инкапсуляцию
Первую которую я узнал это была что это свойство языка программирования, позволяющее объединить данные и код в объект
Второе это скрыть реализацию объекта от пользователя (можно понимать и как защита методов и свойств объекта - ведь мы скрываем чтобы защитить - еще это называется управление доступом)
Но в принципе это и Первое и Второе понятие.
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Подскажите начинающему программеру
В том-то и дело! Это и первое, и второе вместе, но никак не раздельно.
-
diesel
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: Подскажите начинающему программеру
да одно и тоже это понятие.
что в том числе позволяет:
где под "скрыть" можно понимать разное.
-
RVladimir
- Сообщения: 8
- ОС: WinXP/FreeBSD6.3/MDV2007.1PP
Re: Подскажите начинающему программеру
Я бы посоветовал начать с чистого С. А уже после этого изучать С++. Чтобы знать отличия, и уметь отделять одно от другого.
Моё имхо.
Моё имхо.
JID: rhub@jabber.ru
-
deadsuslik
- Сообщения: 15
- ОС: Slackware Linux
Re: Подскажите начинающему программеру
Мне скорее не совсем понятно, зачем нужен C++. По-моему, в большинстве случаев достаточно: для низкоуровневых задач - C, для высокоуровневых (в т.ч. гуя) - скриптовых языков (я лично предпочитаю Перл). Хотя когда-то мне Плюсы очень нравились, да и сейчас тоже, но я просто не видел кода на них, в котором были бы видны преимущества по сравнению с C (включая языковую поддержку ООП).
ОО подход - вещь хорошая, но кроме него есть еще много чего. Мне кажется, что популяризация ООП сказывается на качестве софта очень пагубно. Как известно, система тем лучше спроектирована, чем она проще. Когда не можешь хорошо спроектировать архитектуру, без ООП вообще не получится написать серьезный проект - запутаешься. А с ООП кое-как получится. Вот и получается, что занимаются вовсю инкапсуляцией, наследованием и полиморфизмом, вместо того чтобы думать, как можно упростить (улучшить) архитектуру системы.
-
bum
- Сообщения: 138
- ОС: Ubuntu 8.04
Re: Подскажите начинающему программеру
По большому счету, C и C++ имхо можно считать двумя разными языками. Оба они требуют индивидуального подхода и понимания. Человек виртуозно владеющий C в большинстве случаев будет писать жутко неоптимальный код для C++. ООП это совсем другая парадигма по сравнению с процедурным программированием и она предполагает иной способ мышления. Имхо вопрос, что лучше изучать в данном случае лишен смысла, все зависит от конкретных задач.
Ubuntu-блог: http://korkholeh.blogspot.com/
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Подскажите начинающему программеру
+1
Считаю, что несмотря на внешнюю похожесть, это совершенно разные языки.