Pull to refresh
1
Alexander Legalov@kreofil

Пользователь

Send message

Кто, как и кого...

Это как раз тот вопрос, который рассматривается во всех подходах. И каждый выбирает свой вариант. Для перебора используется централизация, мультиметоды, диспетчеризация. Добавление новых сущностей требует модификации кода или специальных приемов. Вы по сути предлагаете ОО обмен сообщения, глядя на сущности как объекты. Но можно на взаимодействие смотреть как на процесс в котором описывается взаимодействие напрямую с анализом данных обоих сущностей определенной комбинации. Выбор техники кодирования определяется разработчиком. Меня больше устраивает процедурно-параметрический вариант. Он более гибкий при добавлении новых функций и новых альтернатив, позволяя при этом не изменять ранее написанный код.

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

Языков, в которых есть мультиметоды, сейчас хватает. Начиная с CLOS. В основном доступ к параметрам реализуется с использованием хеширования, что медленнее чем в ЗЗС. Сравнение и обзор есть в статье: Сравнение производительности для различных способов реализации мультиметодов. Системы анализа и обработки данных. – 2025. – № 4 (100). – С. 69–84.(https://journals.nstu.ru/vestnik/catalogue/contents/view_article?id=41742).

На уровне PPC полиморфные функции могут контролироваться примерно также как при использовании абстрактных классов в C++. Обобщенная функция может быть абстрактной. Тогда все альтернативы должны быть обязательно реализованы. Если обобщенная функция имеет тело, то она, как и виртуальные методы, используется по умолчанию там, где нет ее замены.

В СССР это направление называлось эволюционной разработкой. Были работы:
Фуксман А.Л. Технологические аспекты создания программных систем.
Горбунов-Посадов, М. М. Расширяемые программы.

Процедурно-параметрический подход решает многие проблемы, представленные в Expression Problem.

Ну, не совсем так. Система, которая описана здесь (http://softcraft.ru/neuro/ni/p00/), была еще в начале 90-х и активно использовалась в дисциплинах. Под MS DOS. Если для истории интересны работы того времени, то они в списке литературы.

Небольшое уточнение в названии кафедры. Кафедра НейроЭВМ.

Еще там есть и деструкторы. Это использовалось для поддержки процедурно-параметрического программирования в расширении языка Си: https://www.mais-journal.ru/jour/article/view/1766
В результате получился PPC - язык процедурно-параметрического программирования (http://softcraft.ru/ppp/ppc/).

Вообще-то в Линуксе издревле основным понятием был процесс, а не объект. А по поводу парадигм и программирования существуют и другие мнения. Например здесь: http://softcraft.ru/

Возможно. А может быть предыдущее поколение просто лучше знало русский язык?

Если интерес касается разных эволюций кода, то можно посмотреть здесь:

https://github.com/kreofil/evo-situations/tree/main/evolution
Старое описание ситуаций можно почитать отсюда:
http://softcraft.ru/ppp/simplesituations/

Из последнего: http://softcraft.ru/ppp/

Для коллекции. Код на Си. Ну, почти чистом Си (http://softcraft.ru/ppp/ppc/).

#include <stdio.h>
#include <stdlib.h>

typedef struct Point {int x, y;} Point;

void PointInit(Point* p, int x, int y) {
    p->x = x;    p->y = y;
}

void PointDraw(Point* p) {
    printf("Drawing Point at (%d, %d)\n", p->x, p->y);
}

char* PointName() {
    return "Point";
}

typedef struct Circle {int x, y, r;} Circle;

void CircleInit(Circle* c, int x, int y, int r) {
    c->x = x;    c->y = y;    c->r = r;
}

void CircleDraw(Circle* c) {
    printf("Drawing Circle at (%d, %d), r = %d\n", c->x, c->y, c->r);
}

char* CircleName() { return "Circle"; }

typedef struct Rectangle {int x, y, w, h;} Rectangle;

void RectangleInit(Rectangle* r, int x, int y, int w, int h) {
    r->x = x;    r->y = y;    r->w = w;    r->h = h;
}

void RectangleDraw(Rectangle* r) {
    printf("Drawing Rectangle at (%d, %d), %d*%d\n",
           r->x, r->y, r->w, r->h);
}

char* RectangleName() { return "Rectangle"; }

typedef struct Shape {}<> Shape;
Shape + <Point;>;
Shape + <Circle;>;
Shape + <Rectangle;>;

void Draw<Shape* s>() = 0;
void Draw<Shape.Point* s>() { PointDraw(&(s->@)); }
void Draw<Shape.Circle* s>() { CircleDraw(&(s->@)); }
void Draw<Shape.Rectangle* s>() { RectangleDraw(&(s->@)); }

char* Name<Shape* s>() {return NULL;} // = 0;
char* Name<Shape.Point* s>() { return PointName(); }
char* Name<Shape.Circle* s>() { return CircleName(); }
char* Name<Shape.Rectangle* s>() { return RectangleName(); }

Shape* CreateShapeAsPoint(int x, int y) {
    struct Shape.Point* s = create_spec(Shape.Point);
    PointInit(&(s->@), x, y);
    return (Shape*)s;
}
Shape* CreateShapeAsCircle(int x, int y, int r) {
    struct Shape.Circle* s = create_spec(Shape.Circle);
    CircleInit(&(s->@), x, y, r);
    return (Shape*)s;
}
Shape* CreateShapeAsRectangle(int x, int y, int w, int h) {
    struct Shape.Rectangle* s = create_spec(Shape.Rectangle);
    RectangleInit(&(s->@), x, y, w, h);
    return (Shape*)s;
}

void DeleteShape(Shape* s) {free(s);}

typedef struct Canvas {
    int len;
    Shape* shapes[100];
} Canvas;

void CanvasInit(Canvas* c) {c->len = 0;}

void CanvasClear(Canvas* c) {
    for(int i = 0; i < c->len; ++i) {
        DeleteShape(c->shapes[i]);
    }
    c->len = 0;
}
void CanvasAdd(Canvas* c, Shape* s) {
    c->shapes[c->len++] = s;
}

void CanvasRender(Canvas* c) {
    for(int i = 0; i < c->len; ++i) {
        Draw<c->shapes[i]>();
    }
}

int main() {
    Canvas canvas;
    CanvasInit(&canvas);
    CanvasAdd(&canvas, CreateShapeAsPoint(1, 1));
    CanvasAdd(&canvas, CreateShapeAsCircle(5, 5, 3));
    CanvasAdd(&canvas, CreateShapeAsRectangle(10, 10, 10, 10));

    CanvasRender(&canvas);
    CanvasClear(&canvas);
    return 0;
}

Что-то уже было в предыдущем поколении. И споры. И даже с кодом: http://softcraft.ru/paradigm/dhp/
Дежавю, однако...

Если это не перевод с английского, то где Тривиль?

Для общего подтверждения давних увлечений фото из моих архивов с объявления результатов защиты ВКР. 14.06.2018. Сергей, желаю дальнейшей успешной работы! Продолжай писать. Надеюсь, что это будет мотивировать не только незрячих, но и тех, кто пока смотрит  не дальше собственного носа.
Для общего подтверждения давних увлечений фото из моих архивов с объявления результатов защиты ВКР. 14.06.2018. Сергей, желаю дальнейшей успешной работы! Продолжай писать. Надеюсь, что это будет мотивировать не только незрячих, но и тех, кто пока смотрит не дальше собственного носа.

Тогда обычно пробелы не ставились, а ставилась табуляция. Редакторы также не заменяли табуляцию пробелами. Поэтому был только один символ. Ну и привычка. Специально посмотрел свой код 1992 года. Да. Везде табуляция. Правда сейчас она у меня отобразилось в смещение, равное двум пробелам.

В 1990 году появился Turbo C++ 1.0. Если память не изменяет Turbo сменилось на Borland где-то в районе третьей версии.

Может быть Вам стоит посмотреть на EO (Eolang), где все есть объект?
А так хорошо бы продемонстрировать предложение примерами, чтобы слова о парадигме были отражены в коде...

Information

Rating
6,033-rd
Location
Россия
Registered
Activity