Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка функций как в Си++ или как в Джаве? 
V
    Опции темы
PashaPash
Дата 5.11.2008, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



Цитата(Dims @  4.11.2008,  23:21 Найти цитируемый пост)
Эту разницу ты создал. 

Обработчик события DoWork -- это то, что у меня абстрактный метод SpecificWork. Собираясь его реализовать в наследнике, я должен буду прочесть к нему инструкцию. И там увижу почти тот же текст, что и в инструкции к Микрософтовскому воркеру. В частности, у себя в инструкции я увижу, что нужно проверять ShouldStop, а у Микрософта, что нужно проверять CancellationPending. Точно так же, как у Микрософта я могу захотеть написать обработчик RunWorkerCompleted и тогда прочту к нему инструкцию, так же и у меня я могу захотеть реализовать Done и тогда прочту инструкцию к нему.

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

Цитата(Dims @  4.11.2008,  23:21 Найти цитируемый пост)
Выдумываешь.

Что, не надо создавать базовый класс? Или не надо читать документацию?
Ок, используем подход java и делаем все методы виртуальными. Их в воркере штук 7, если считать сеттери и геттеры. Сколько из них может полностью переопределить наследник, не поломав всю реализацию? Полностью - без вызова base и без дублирования кода из base. Только 2, и то только потому что они ничего не делают. И виноват в этом ес-но ... автор наследника. IMHO, виноват автор базового класса, который не продумал интерфейс. 
А теперь сравни это с возможностью неправильно подписаться на событие стандартного воркера. Он, кстати, не предьявляет вообще никаких требований к использующему его. Только надежда что тот будет периодически (да хоть раз в сутки) проверять CancellationPending.
Что, совсем не видно разницы? А ведь именно из-за этой "неуловимой" разницы появился Design By Contract и прочие формы отказа от наследования реализации.
Вот, линк по теме, а то пересказывать влом: http://blogs.gotdotnet.ru/personal/bezzus/...2c-f54450aa64d6
Цитата(Dims @  4.11.2008,  23:21 Найти цитируемый пост)
Это не голословное утверждение, а вывод на основе опыта программирования на Джава. Сообщество накопило, наверное, миллионы человеко-часов. Ты понимаешь, поэтому, что все жутчайшие выводы, которые ты сейчас сделаешь -- это борьба с ветряными мельницами?

Есть PHP, в котором ООП в зачаточном состоянии. На нем написны миллиарды строк кода и проведены миллиарды человекочасов. На основе опыта программирования на PHP любой студент-кодер может сделать неголословное утверждение, даже вывод, что ООП - вообще вредно, только лишний раз мозг напрягает. Строгая типизация, обработка исключений, сборщик мусора, и вообще все, что хоть сколько-нибудь заботится о дизайне приложения, о минимизации контрактов, о соблюдении принципов ООП - это тоже борьба с ветряными мельницами? Или может это обдуманные решения, принятые ради удобства самих разработчиков? Миллионы леммингов не могут ошибаться.
И, кстати, C#/.NET тоже довольно распространенные языки, но за все время я только один раз видел жалобы на невиртуальные по умолчанию функции. Вот в этом топике smile

Добавлено через 4 минуты и 34 секунды
Цитата(Dims @  5.11.2008,  14:36 Найти цитируемый пост)
Я же говорю: этот вывод элементарно опровергается практикой. Не могло бы быть на джаве написано столько качественных прог, если бы функции делали неизвестно-что.

Зато на написание и на поддержку этого качества могло бы уйти намного меньше времени.


--------------------
PM MAIL WWW   Вверх
Dims
Дата 5.11.2008, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 0
Всего: 11



Цитата(PashaPash @  5.11.2008,  15:07 Найти цитируемый пост)
Их в воркере штук 7, если считать сеттери и геттеры. Сколько из них может полностью переопределить наследник, не поломав всю реализацию?

Да сколько угодно. Вопрос только, нафига их ему переопределять? Есть абстрактные методы, их переопрелять обязательно. А неабстрактные методы можно не переопределять. 

Цитата(PashaPash @  5.11.2008,  15:07 Найти цитируемый пост)
Полностью - без вызова base и без дублирования кода из base.

Ну ты придумай ещё каких-нибудь ограничений. А потом ещё какие-нибудь выводы сделай на основании того, что сам придумал.

Цитата(PashaPash @  5.11.2008,  15:07 Найти цитируемый пост)
А теперь сравни это с возможностью неправильно подписаться на событие стандартного воркера.

Зачем мне сравнивать с возможностью подписаться неправильно? 

Цитата(PashaPash @  5.11.2008,  15:07 Найти цитируемый пост)
Что, совсем не видно разницы?

Не видно разницы в необходимом объёме прочтения документации и в объёме требований к, которую ты заявлял. Ты теперь признаёшь, что был в этом неправ и переходишь к рассмотрению какой-то другой разницы? Невозможно же, не разобравшись с одним вопросом, перескакивать на следующий.

Цитата(PashaPash @  5.11.2008,  15:07 Найти цитируемый пост)
Вот, линк по теме, а то пересказывать влом: http://blogs.gotdotnet.ru/personal/bezzus/...2c-f54450aa64d6

А не надо пересказывать, надо высказывать свои мысли.

Цитата(PashaPash @  5.11.2008,  15:07 Найти цитируемый пост)
На основе опыта программирования на PHP любой студент-кодер может сделать неголословное утверждение, даже вывод, что ООП - вообще вредно

Не надо передёргивать. На основании этого опыта можно сделать вывод, что отсутствие ООП это не катастрофа, вот и всё.

Цитата(PashaPash @  5.11.2008,  15:07 Найти цитируемый пост)
Строгая типизация, обработка исключений, сборщик мусора, и вообще все, что хоть сколько-нибудь заботится о дизайне приложения, о минимизации контрактов, о соблюдении принципов ООП - это тоже борьба с ветряными мельницами?

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

Цитата(PashaPash @  5.11.2008,  15:07 Найти цитируемый пост)
Или может это обдуманные решения, принятые ради удобства самих разработчиков?

Конечно, это обдуманные решения.

Цитата(PashaPash @  5.11.2008,  15:07 Найти цитируемый пост)
Миллионы леммингов не могут ошибаться.

Дело не в количестве леммингов, а в качестве мыслей. За каждым решением должна стоять мысль, а эту мысль должно быть можно сформулировать.

За отказом от виртуальных функций я пока увидел только одну мысль -- ограничить возможность наследника вмешиваться в функционирование того, что он использует в своей конструкции. Я нахожу это не плюсом, а минусом. 
Цитата(PashaPash @  5.11.2008,  15:07 Найти цитируемый пост)
И, кстати, C#/.NET тоже довольно распространенные языки, но за все время я только один раз видел жалобы на невиртуальные по умолчанию функции. Вот в этом топике

Ой, а покажи, на какой странице? И кто жаловался, не подскажешь?
PM MAIL   Вверх
Partizan
Дата 5.11.2008, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



Dims, принцип наименьших привилегий знаком?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PashaPash
Дата 5.11.2008, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



Цитата(Dims @  5.11.2008,  18:56 Найти цитируемый пост)
Ну ты придумай ещё каких-нибудь ограничений. А потом ещё какие-нибудь выводы сделай на основании того, что сам придумал.

Это как раз не ограничения. Ограничения - это "обязательно надо вызвать base".
Цитата(Dims @  5.11.2008,  18:56 Найти цитируемый пост)
Да сколько угодно. Вопрос только, нафига их ему переопределять? Есть абстрактные методы, их переопрелять обязательно. А неабстрактные методы можно не переопределять. 

Так о том и спор. Если наследник не может корректно переопределить неабстрактный метод, то лучше бы этому методу вообще не быть виртуальным.
Цитата(Dims @  5.11.2008,  18:56 Найти цитируемый пост)
А не надо пересказывать, надо высказывать свои мысли.

А ты сходи, почитай. Может и появятся свои мысли, а не только "в java так, зачем вы сделали по-другому" smile
Цитата(Dims @  5.11.2008,  18:56 Найти цитируемый пост)

Не видно разницы в необходимом объёме прочтения документации и в объёме требований к, которую ты заявлял. Ты теперь признаёшь, что был в этом неправ и переходишь к рассмотрению какой-то другой разницы? Невозможно же, не разобравшись с одним вопросом, перескакивать на следующий.
Вообще-то объем документации которую НУЖНО изучить перед использованием класса напрямую связан с объемом требований. Просто ты почему-то воспрнимаешь, например, обязательный вызов base как само-собой разумеющееся, а не как требование, налагаемое на наследника. Или, например, необходимость поддерживать интерфейс следующих версий базового класса - тоже требование к наследнику.

Цитата(Dims @  5.11.2008,  18:56 Найти цитируемый пост)
Не надо передёргивать. На основании этого опыта можно сделать вывод, что отсутствие ООП это не катастрофа, вот и всё.

Цитата(Dims @  5.11.2008,  18:56 Найти цитируемый пост)
Ну если кто-то скажет, что без сборщика мусора -- полный капец -- то это будет борьба с ветряными мельницами. На самом деле, перечисленные тобой вещи просто улучшают жизнь, повышают КПД и производительность труда. Но они не превращают смерть в жизнь.

Да любой пхп-ст тебе как два пальца докажет что ООП - бесполезный выверт. Недвано на хабре даже спор был о полезности ООП.

Ну вот невиртуальность функций по умолчанию, и вообще переход от наследования реализации к наследованию контракта повышает производительность, КПД, и уменьшают количество багов и затрат на поддержку. Хочешь конкретных примеров - возьми стандартные паттерны - IoC/DI, MVC - не используется в них наследование. Возьми гамму - там наследование реализации очень редко встречается. Возьми того же Фаулера - там наследования почти нет. Возьми какой-нибудь Eiffel - типа идеал ООП - там вообще один интерфейсы. Почитай классику по ООП - Алана Кея - там нет наследования как такового.

Вирутальные функции тоже не превращают жизнь в смерть, просто перед их объявлением надо думать. Ну не верю я, что до написания тела функции можно быть 100% уверенным в том, что она достойна стать виртуальной. А ты веришь в умных кодеров наследников, которые будут читать документацию.

Цитата(Dims @  5.11.2008,  18:56 Найти цитируемый пост)
Дело не в количестве леммингов, а в качестве мыслей. За каждым решением должна стоять мысль, а эту мысль должно быть можно сформулировать.

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

Мысль - ограничить возможность наследника вмешаться прямо (некорректно заменить) или косвенно (использовать недокументированные подробности реализации базового класса) вмешаться в реализацию базового класса. Снизить вероятность привязки наследника к конкретной реализации базового класса. Ограничить распространение изменений базового класса - отказом от наследования вообще, или от виртуальных функций в частности. Принудительно потребовать от наследника соблюдать принцип подстановки (а не на надеятся на умных кодеров наследника). И еще много мыслей, которые ты сейчас отметешь как несущественные, потому что в java можно кодить без них.

Добавлено через 1 минуту и 6 секунд
Partizan, бесполезно, он исповедует принцип свободы, и считает невиртуальные функции лишними ограничениями и происками MS.


--------------------
PM MAIL WWW   Вверх
mr.DUDA
Дата 5.11.2008, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Модератор: БУУУУУУУУУУУ !!!!!!!!!!!!!

Ну народ, и нафлудили вы тут пока меня не было полгода...  smile  smile  smile  smile 

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


--------------------
user posted image
PM MAIL WWW   Вверх
diadiavova
Дата 5.11.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(Dims @  5.11.2008,  14:36 Найти цитируемый пост)
Я же говорю: этот вывод элементарно опровергается практикой. Не могло бы быть на джаве написано столько качественных прог, если бы функции делали неизвестно-что.

На ассемблере тоже можно писать, некоторым даже не плохо это удаётся, это же не значит, что надо вернуться к ассемблеру. Я нигде не пытался доказать, что явовский подход неработоспособен. Просто тот, который реализован в дотнете мне кажется более удачным и безопасным.

Цитата(Dims @  5.11.2008,  18:56 Найти цитируемый пост)
За отказом от виртуальных функций я пока увидел только одну мысль -- ограничить возможность наследника вмешиваться в функционирование того, что он использует в своей конструкции. Я нахожу это не плюсом, а минусом.

А кто говорит об отказе? Речь только о том, чтобы не делать виртуальными члены, не предназначенные для переопределения.



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
MasterOfCode
Дата 5.11.2008, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 4
Всего: 27



OFF: Ура! Модератор вернулся. Теперь будет чистота и порядок. А то уже эти холивары надоели smile



mr.DUDA: угу, дискуссия была весьма захватывающей, я даже попкорн купил... но для холиваров есть целый раздел, а тут им не место вообще-то.  smile 

Это сообщение отредактировал(а) mr.DUDA - 6.11.2008, 00:43


--------------------
user posted image
PM ICQ   Вверх
diadiavova
Дата 6.11.2008, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(MasterOfCode @  5.11.2008,  21:32 Найти цитируемый пост)
дискуссия была весьма захватывающей, я даже попкорн купил... но для холиваров есть целый раздел, а тут им не место вообще-то.

То есть вот так вот значит, да? Развлёкся, попкорна похавал, а теперь мятыми упаковками от этого попкорна в тех, кто тебя развлекал швыряешь?
И потом: причём тут холивар? Мы просто общаемся, выясняя вопрос, вполне вписывающийся в тематику форума. Если автор темы не пометил вопрос решённым - значит ему не всё ясно, а объяснения вроде

Цитата(mr.DUDA @  5.11.2008,  20:58 Найти цитируемый пост)
Потому что вызов виртуальной функции дороже с точки зрения производительности. 

не убеждают даже меня, ибо в этом случае возникает вопрос: а почему тогда все классы не делаются завершёнными по-умолчанию? 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
mr.DUDA
Дата 7.11.2008, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(diadiavova @  6.11.2008,  10:10 Найти цитируемый пост)
не убеждают даже меня, ибо в этом случае возникает вопрос: а почему тогда все классы не делаются завершёнными по-умолчанию? 

Разницу между расширяемостью и оптимальным подходом видишь?

Ну вот скажем, хочу я в одном случае сделать иерархию классов, с наследованием и полиморфизмом. На производительность мне начхать. Следовательно мне удобнее, чтобы классы были наследуемыми (а не завершёнными по умолчанию) и были доступны фичи а-ля реализация набора интерфейсов или базовых классов (как в С++), виртуальные функции и всяческий синтаксический сахар. Это про расширяемость.

Теперь про оптимальный подход. Допустим я хардкорный программер и хочу поиметь максимальную производительность и мимимум оверхеда на всякие ООП-приблуды, но вынужден по той или иной причине пользоваться дотнетом и сишарпом. Что мне делать? Использовать один-два класса, функциональный подход, никаких виртуальных функций, структуры вместо классов на мелкие объекты, массивы через указатели и так далее. Здесь мне уже начхать на полиморфизм и наследование.

Итак, вопрос: что важнее с точки зрения создателя такого языка и такой платформы как сишарп и дотнет? Ответ такой: важны все разработчики, важны все возможные области применения. Вердикт: минимум ограничений, максимум возможностей. Не запрещается наследование, но и не принуждается использование виртуальных функций.

Пример частный, но в контексте темы.

З.Ы. попкорном не кидаюсь!!!!!  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
diadiavova
Дата 7.11.2008, 02:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Ну здесь, на сколько я понимаю, никто не говорил об ограничениях, спор всего-навсего о том, какими члены типов должны быть по-умолчанию. Умолчания обычно можно изменять, однако те значения, которые элементы имеют по-умолчанию, считаются оптимальными и наиболее часто используемыми. И разногласия были собственно в том, что чаще нужно: виртуальные члены или нет.
Если мне по тем или иным причинам понадобится виртуальный член, то скорее всего производительность отойдёт на второй план и я сделаю член типа виртуальным. Собственно, я говорил только о том, что в контексте разговора производительность(ИМХО) не является решающим фактором.

Цитата(mr.DUDA @  7.11.2008,  02:32 Найти цитируемый пост)
попкорном не кидаюсь

Та ладно бы попкорном, а то пожамканая упаковка в ход идёт smile



Это сообщение отредактировал(а) diadiavova - 7.11.2008, 02:51


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
mr.DUDA
Дата 7.11.2008, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(diadiavova @  7.11.2008,  02:48 Найти цитируемый пост)
Та ладно бы попкорном, а то пожамканая упаковка в ход идёт

diadiavova, работа такая у модератора - кидать упаковкой от попкорна или чем-нибудь потяжелее  smile

Консенсуса не видно, тема уже на 6 страницах, треть постов - оффтоп на тему нот и затенения. Заготавливаю ещё попкорн, чтобы было чем швыряться...


--------------------
user posted image
PM MAIL WWW   Вверх
diadiavova
Дата 7.11.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(mr.DUDA @  7.11.2008,  12:14 Найти цитируемый пост)
работа такая у модератора - кидать упаковкой от попкорна или чем-нибудь потяжелее 

Можно было бы и попкорном швырнуть для разнообразия, а то тоже охота.
Цитата(mr.DUDA @  7.11.2008,  12:14 Найти цитируемый пост)
треть постов - оффтоп на тему нот и затенения

Насчёт нот - согласен, а с затенения всё и началось. Dims спросил: зачем оно нужно, и тут выяснилось, что функции не виртуальные по-умолчанию. 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0885 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.