Войти
ФлеймФорумПрограммирование

Вопрос по ООП (3 стр)

Страницы: 1 2 3 4 517 Следующая »
#30
(Правка: 12:36) 12:35, 16 дек. 2019

kipar

процедурное программирование тоже нифига не парадигма.
Берем бейсик или машинные коды, явно никакой не процедурный язык, добавляем стек вызовов и вуаля, у нас новая парадигма? От одной структуры данных?

Ну это для простоты понимания говорим "процедурное". На самом деле правильно говорить - Императивное программирование. И начиная от машинных кодов и до ООП оно императивное.
Но ООП в императивное программирование уже не включают, хотя лично я сомневаюсь что это отдельная парадигма. Но в Википедии статью открыл и там его выделяют в отдельную парадигму


#31
12:40, 16 дек. 2019

Delfigamer
> Нет. switch (objectType) - это тоже динамический диспатч

А я всегда считал, что switch(type) это как раз прямая противоположность динамической диспетчеризации от граблей и проблем которого она и (пере)изобреталась тысячи раз.

> Надо тогда наложить ещё один критерий - внешний код должен иметь возможность
> свободно добавлять новые типы, реализующее то же поведение.

Да, в отличие от статической диспетчеризации динамическая должна уметь работать с новыми объектами без перекомпиляции клиентского кода. Это весьма важное качество, действительно отметающее switch.

#32
(Правка: 12:45) 12:44, 16 дек. 2019

NetSpider
> И начиная от машинных кодов и до ООП оно императивное.
Хм, тогда приведи пример еще какой-нибудь парадигмы, которая бы отличалась сильнее чем ООП.
Потому что твой noname включает в себя анонимные функции, не вижу проблем на нем в функциональном стиле писать.

=A=L=X=
> без перекомпиляции клиентского кода
ну это довольно спорное отличие. Есть интерпретаторы, есть компиляторы которые перекомпилируют код в любом случае ради оптимизации, да и вообще это должна быть деталь реализации.

#33
12:50, 16 дек. 2019

Окей, посоны, вопрос повышенной сложности.
https://reference.wolfram.com/language/ref/SetDelayed.html

Read[s_FileStream] := Block[
    {buf = ByteBuf[1], r},
    r = ReadFile[FileHandle[s], BufPtr[buf], 1];
    If[r == 1, GetBuf[buf, 0], -1]];
Read[s_MemoryStream] := Block[
    {buf = MemoryHandle[s]},
    If[Tell[s] < BufSize[buf],
        Seek[s, Tell[s] + 1]; GetBuf[buf, Tell[s]-1],
        -1]]
Диспатч на паттернах - это ООП или уже нет?

#34
12:54, 16 дек. 2019

=A=L=X=
> Да, в отличие от статической диспетчеризации динамическая должна уметь работать
> с новыми объектами без перекомпиляции клиентского кода.
Так это, динамический диспатч - это всё, что происходит в рантайме. Статический - это про перегрузку операторов, типа operator<<(std::ostream&, ...); он к ИТТ вообще никаким боком.

#35
12:54, 16 дек. 2019

kipar
> ну это довольно спорное отличие.

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

#36
(Правка: 12:56) 12:55, 16 дек. 2019

kipar

Хм, тогда приведи пример еще какой-нибудь парадигмы, которая бы отличалась сильнее чем ООП

Возможно если выбирать очень тонкие критерии, то действительно можно делать подразделения на какие-либо парадигмы. Но тогда странно что так яростно отстаивается преимущество одной парадигмы над другой. Напоминает ситуацию в религии где различные конфессии одного вероисповедания враждуют меж собой, хотя имеют всего лишь незначительные отличия в толковании того же самого святого писания как и у всех остальных. Я бы понимал если бы само писание отличалось, но отличаются толкования! Похоже та же ситуация и среди программистов.
#37
14:01, 16 дек. 2019

NetSpider
отличия серьезные. Просто дело не в синтаксисе а в более высокоуровневых вещах.
Ну т.е. пользуясь твоей аналогией - не писание, а буквы общие, а вот текст - разный.

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

#38
2:04, 17 дек. 2019

NetSpider
> так яростно отстаивается преимущество одной парадигмы над другой
это где такое? всё зависит от задачи
и не нужно забывать что компилятор всё перемалывает в asm

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

#39
16:56, 17 дек. 2019

=A=L=X=
> Потому что FILE это FILE и функции по работе с FILE * умеют работать только с
> FILE *. В этом и есть сила и преимущество объектно-ориентированной идиомы.

> В функцию работающую с FILE * можно передать только FILE * - это процедурщина.
> Но в функцию работающую со AbstractStream можно передать как FileStream так и
> SocketStream или даже MemoryStream - это и есть ООП.

Неудачный пример. FILE может "быть" как файлом, так и консолью или даже динамическим буфером памяти.  Или даже чем угодно, что туда под капот прикрутит желающий.

#40
(Правка: 18:31) 17:55, 17 дек. 2019

=A=L=X=
> Файлы немного тут неудачный пример по причине которую я даже не буду упоминать
> чтобы не замыливать повествование.

https://gamedev.ru/flame/forum/?id=248858&m=5093441#m3

Да, прикол в том, что со времен юниксов файлы это ООП. Причина неудачности примера прозвучала. Однако ООП-нутость их в случае с FILE * задвинута на уровень драйверов оси и клиентскому коду не отсвечивает явным образом.

#41
(Правка: 18:05) 18:03, 17 дек. 2019

А сишный qsort(), это тоже ООП ?
А bsearch() ?
А free() ?

#42
18:21, 17 дек. 2019

exchg
> А сишный qsort(), это тоже ООП ?
схренали?

#43
18:30, 17 дек. 2019

exchg
> А free() ?

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

> bsearch(), qsort()

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

#44
18:33, 17 дек. 2019

=A=L=X=
>free как раз ничего не знает что освобождает и не может гарантированно правильно освободить ресурсы - не хватает аналога виртуального деструктора как раз.
Схеринали?
Оно знает, что освобождает блок памяти, больше оно ничего не освобождает.

Страницы: 1 2 3 4 517 Следующая »
ФлеймФорумПрограммирование