Введение сложное, длинное описание более потяное.

Есть 2 популярные парадигмы программирования: функциональное и ООП.

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

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

В статье я попытался расписать подробнее, что я имею ввиду.

Возьмем например "объект", который используется при написании программ - функция.

У нее есть свойства:

  • имеет имя

  • можно вызывать ее - выполнять ее как код

  • можно присваивать в переменные (не в каждом языке программирования (ЯП))

  • можно передавать в другие функции или возвращать из других функций (не в каждом ЯП)

Т.е, относитесь к "свойствам" - как к предложениям на русском языке, которыми можно описать функцию. Я привел несколько. Вот сколько предложений о функции вы сможете сказать - столько свойств и есть у функции.

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

И затем мы можем создать новый "объект" из этих свойств:

  • имеет имя

  • можно передавать в другие функции

  • и все, других свойств у нашего нового "объекта" нету (для примера)

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

Очень хочется разобрать еще пару других стандартных "объектов", которые мы используем при написании программ.

Класс:

  • имеет даннные

  • имеет несколько функций

  • функции имеют доступ к данным

JSON строка:

  • может передаваться по сети (сериализоваться)

  • простая в структура и понимании

Вы можете выделить совершенно другие "элементарные свойства" этих 2 объектов.

Теперь мы можем комбинировать все свойства этих 3 объектов (функция, класс, json строка) вместе в любой комбинации:

  • имеет имя

  • может выполняться как код

  • может передаваться по сети (сериализоваться)

  • именно такая комбинация свойств и больше никаких свойств нету

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

В общем суть моей парадигмы программирования:

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

Комментарии (15)


  1. milkground
    09.11.2024 12:47

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


    1. GoodGod Автор
      09.11.2024 12:47

      Вполне возможно это ваше видение ООП и оно совпадает с видением описанной в статье парадигмы.


  1. VadimProfii
    09.11.2024 12:47

    Переведите слово "потяное'. Это понимать как протяжное? Не сочтите за придирку.


    1. GoodGod Автор
      09.11.2024 12:47

      Это по поводу JSON. Ну 1) малое количество символов: скобки {}, кавычки ", запятая , и вроде все. 2) простая (по сравнению с xml) структура документа, нет аттрибутов, namespace'ов из xml и т.д. 3) маленькое количество типов данных 4) и в целом когда смотришь на JSON обычно сразу понимаешь что там написано.


  1. qweururu
    09.11.2024 12:47

    Возможно, это только для меня, но из статьи не слишком ясно, что именно и зачем предлагается. Думаю, ситуацию можно исправить, добавив примеров наподобие "пример кода на языке/в парадигме X - имеем такие-то проблемы", и далее показать, каким образом новый язык/парадигма подобные проблемы решает. Это очень упростило бы понимание.


  1. xxxphilinxxx
    09.11.2024 12:47

    Самый главный вопрос: что такое "свойство" в вашей идее? Мы знаем интерфейс: пометку "этот компонент обладает/должен обладать свойством X", которую ставит программист. Мы знаем композицию: разбитие кода на компоненты со своими отдельными задачами, а затем сбор их в единый механизм. Мы знаем наследование с переиспользованием кода из родительского класса в дочернем. Мы знаем аннотации, хуки и т.д. и т.п.. Мы Что такое "свойство"? Как свойство реализуется и обеспечивается? Как происходит интеграция свойства и нового компонента и свойств между собой?

    Определенно нужно больше примеров, сейчас непонятно. Кажется, что вы хотите то ли просто множественное наследование с соблюдением принципа Лисков, то ли просто грамотную композицию, то ли что-то из аспектно-ориентированного программирования. Кроме объекта (набора данных) и функции (исполняемого кода) какие еще низкоуровневые компоненты можно вообразить и зачем? А если на примерах, более приближенных к бизнес-логике? Идеально было бы схематично описать компоненты какого-нибудь проекта чуть сложнее hello world.

    Свойства имхо проистекают из реализации. При создании нового компонента из базового "сериализуемый" как-то понадобится сериализовать новую структуру: значит, либо базовый компонент должен быть достаточно универсален, либо все-таки придется допиливать такую интеграцию, что, кажется, рушит саму идею.
    Ну и свойство может оказаться в принципе невозможным: например, "json-сериализуемый" будет фактически невыполним для производного компонента, если в нем используется ленивая подгрузка огромного объема данных, да с правами доступа, а получаемые им данные неконсистентны в отдельный момент времени и содержат рекурсии.
    "Простая в структура и понимании" - это просто субъективная оценка, а не свойство.
    Кстати, объекты и функции могут быть безымянными как в исходном коде, так и в скомпилированном.


    1. GoodGod Автор
      09.11.2024 12:47

      "Свойство" - это то, что можно русским языком расскзать об объекте/сущности.

      Например, когда мы описываем функции, обычно мы говорим: "функция имеет имя". Вот то, что "функция имеет имя" - это и есть "свойство" такого объекта как функция.

      Т.е, относитесь к свойствам - как к предложениям на русском языке, которыми можно описать функцию. Вот сколько предложений о функции вы сможете сказать - столько свойств и есть у функции.

      А затем начинается экспресиионизм - мы говорим несколько предложений о функции и несколько предложений о json строке. И затем комбинируем эти предложения между собой (1-е предложение описывающее функцию, 2-е предложеие описывающее функцию и 3-е предложение описывающее json строку), и пытамеся создать новый объект, обладающий данной комбинацией предложений.

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

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

      Например в ООП языке программирования новая сущность будет скорее всего классом, реализующим определенное поведение. Например если мы комбинируем 2 свойства - имеет имя и может выполняться, то у нашего класса будет поле name и будет реализован интерфейс типа Invokable, чтобы наш объект можно было вызвать через obj(); Если захотим добавить совйство "может сериализоваться в простую строку", то реализуем интерфейс Stringable.

      Т.е. новая сущность - это класс, имеющий поля и реализующий интерфейсы. А в функциональном языке программирования - набор функций.

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


      1. xxxphilinxxx
        09.11.2024 12:47

        Хм. Давайте пойдем от обратного: когда ООП-код не является реализацией вашей парадигмы? Вот возьмем классический учебный пример с гавкающей собакой: он подходит под ваше описание. Я комбинирую свойства "имеет имя" и "умеет гавкать" и получаю новый компонент - собаку. Затем хочу получить возможность сохранения и добавляю метод ToString() под интерфейс Stringable.

        class Dog {
        	Name string
        	Bark() {...}
        }
        


        1. GoodGod Автор
          09.11.2024 12:47

          Да, все верно, на ООП можно реализовать смыслы, которые я писал в статье. Но можно и не реализовать (если написать плохо по ООП). Т.е. тут я говорю в одной плоскости, а ООП в параллельной плоскости, одно не исключает другого.

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

          И вот выделение этих "минимальных" свойств (элементарных частиц) (и их комбинация) и есть мое предложение парадигмы.


  1. IisNuINu
    09.11.2024 12:47

    Уважаемый Автор! В Вашем тексте я обнаружил попытку переосмыслить программные парадигмы, так сказать взглянуть на мир программирования по новому, но прежде чем изобретать велосипеды не лучше ли было обратиться к основам программирования? так сказать к теории! Теория наше ВСЁ! И поскольку в тексте очень часто встречается слово "комбинирование" вам нужно ознакомиться с "комбинаторной логикой", эта теория лежит даже глубже лямбда-исчисления, лежащего в основе функциональной парадигмы. Так что рекомендую поискать в интернете: Автор В.Э.Вольфенгаген "Комбинаторная логика в программировании".


    1. gev
      09.11.2024 12:47

      Хороший плейлист на тему


  1. andmerk93
    09.11.2024 12:47

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

    Ну, да, трейты и миксины.

    Не совсем понял, в чём новизна


  1. evgeniy_kudinov
    09.11.2024 12:47

    Напишите яснее какая проблема существует и как ее решает ваша "парадигма". Иначе непонятно вообще про что речь и зачем это нужно.


  1. LyuMih
    09.11.2024 12:47

    На мой взгляд, без конкретных примеров кода для тех же Функции, Класса, JSON эту статью можно интерпритеровать кто как хочет.
    Например, как описание миксинов или множественного наследования. А на практике этим может и оказаться )


  1. 9241304
    09.11.2024 12:47

    Великий комбинатор)

    Весь этот грабёж корованов (других ассоциаций не возникло) вполне достижим с использованием обеих основных парадигм программирования. Грабить корованы - это не парадигма, а идея