Базовое отличие ООП от ФП
От: Разраб  
Дата: 05.03.24 02:02
Оценка:

/// Simplicity
module FP =
    let add_v1 = fun a b -> a + b
    let add_v2 = (+)
    let add_v3 a b = a + b


FP.add_v1 1 1 |> printfn "%d"

/// Complexity
module OOP =
    type Add(a) =
        class
            member it.Value = a
            member it.Plus(b) = Add((b :> Add).Value + a)
        end

OOP.Add(1).Plus(OOP.Add(1)).Value |> printfn "%d"


Выше ООП и ФП подход к решению одной задачи.
В чем принципиальное отличие?
На мой взгляд ФП ориентировано на обработку данных,
в то время как ООП старается абстрагировать проблему в некоторую модель,
что делать код намного сложнее в понимании.
Появляется неявный контекст, "за лесом не видно деревьев".
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Базовое отличие ООП от ФП
От: Sinclair Россия https://github.com/evilguest/
Дата: 05.03.24 02:56
Оценка: 4 (1) +7 :)
Здравствуйте, Разраб, Вы писали:
Р>Появляется неявный контекст, "за лесом не видно деревьев".

Принципиальное отличие в наличии изменяемого состояния, для которого необходима идентифицируемость (identity).
Всё остальное — непринципиально. Если его нет, то объект — это просто набор функций, которые объединены (или не объединены) общим замыканием. Интерфейс становится кортежем функций, а класс — синоним конструктора.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Базовое отличие ООП от ФП
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 05.03.24 07:00
Оценка: +1 -1 :)
Здравствуйте, Разраб, Вы писали:

Р>Выше ООП и ФП подход к решению одной задачи.

В твоем примере нет ООП.
Одного наличия слова class и вызова через точку недостаточно чтобы код стал ООП.
Re: Базовое отличие ООП от ФП
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 05.03.24 14:23
Оценка: 4 (1) -2
Здравствуйте, Разраб, Вы писали:

ООП это прежде всего состояние и сокращения кода за счет наследования и переопределении методов.
Плюс поддержка интерфейсов, замена множественного наследия.
и солнце б утром не вставало, когда бы не было меня
Re[2]: Базовое отличие ООП от ФП
От: novitk США  
Дата: 05.03.24 15:09
Оценка: +1
Здравствуйте, Serginio1, Вы писали:

S>ООП ... и сокращения кода за счет наследования и переопределении методов.

S>Плюс поддержка интерфейсов, замена множественного наследия.

В ООП языках представлена очень ограниченная версия — signle param dispatch.
В FP языках (Haskell/Scala — type classes, LispCLOS/Julia — multiple params dispatch) без ограничений.
Отредактировано 05.03.2024 15:16 novitk . Предыдущая версия . Еще …
Отредактировано 05.03.2024 15:15 novitk . Предыдущая версия .
Отредактировано 05.03.2024 15:15 novitk . Предыдущая версия .
Re[3]: Базовое отличие ООП от ФП
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 05.03.24 16:23
Оценка: 3 (1)
Здравствуйте, novitk, Вы писали:

S>>ООП ... и сокращения кода за счет наследования и переопределении методов.

S>>Плюс поддержка интерфейсов, замена множественного наследия.

N>В ООП языках представлена очень ограниченная версия — signle param dispatch.

N>В FP языках (Haskell/Scala — type classes, LispCLOS/Julia — multiple params dispatch) без ограничений.

Не знаю, чё це таке, но C# точно ООП язык с примесями ФП. И народ, не переходит на тот же F# раз у него нет ограничений.
Все таки изменяемое состояние в большинстве случаев более выгодно. А переопределение методов и инкапсуляция просто уменьшает количество дополнительного кода.
Хотя без отладчика иногда сложно разобраться в высокоуровневой иерархии.

ФП хорош в рекурсиях, итерациях, где можно лаконично описать процесс
и солнце б утром не вставало, когда бы не было меня
Отредактировано 05.03.2024 16:27 Serginio1 . Предыдущая версия . Еще …
Отредактировано 05.03.2024 16:26 Serginio1 . Предыдущая версия .
Re[4]: Базовое отличие ООП от ФП
От: novitk США  
Дата: 05.03.24 17:06
Оценка: 1 (1)
Здравствуйте, Serginio1, Вы писали:

S>Не знаю, чё це таке, но C# точно ООП язык с примесями ФП. И народ, не переходит на тот же F# раз у него нет ограничений.

В F# ограничения как раз есть. Там полиморфизм такой же как в C# и ОCaml.
Не переходят на него потому же почему и на Скалу — голову придется утруждать, а производительность в разы не поднимется.
Re[5]: Базовое отличие ООП от ФП
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 05.03.24 18:37
Оценка: 1 (1)
Здравствуйте, novitk, Вы писали:

S>>Не знаю, чё це таке, но C# точно ООП язык с примесями ФП. И народ, не переходит на тот же F# раз у него нет ограничений.

N>В F# ограничения как раз есть. Там полиморфизм такой же как в C# и ОCaml.
N>Не переходят на него потому же почему и на Скалу — голову придется утруждать, а производительность в разы не поднимется.
Утруждать то необходимо! Новые нейронные связи образуются. Помню как на Linq плевались.
Жалко, что в одном проекте нельзя 2 языка использовать.
и солнце б утром не вставало, когда бы не было меня
Re[6]: Базовое отличие ООП от ФП
От: novitk США  
Дата: 05.03.24 18:45
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Жалко, что в одном проекте нельзя 2 языка использовать.

зачем? для скорости через unsafe?
Re[7]: Базовое отличие ООП от ФП
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 05.03.24 18:49
Оценка: +1
Здравствуйте, novitk, Вы писали:

S>> Жалко, что в одном проекте нельзя 2 языка использовать.

N>зачем? для скорости через unsafe?
Ну для многих вещей хорошо подходит ФП. Я бы с удовольствием использовал F# для того же Рослина ну и просто мозг развлечь.
А так лениво делать в разных проектах.
и солнце б утром не вставало, когда бы не было меня
Re[8]: Базовое отличие ООП от ФП
От: novitk США  
Дата: 05.03.24 19:12
Оценка: 12 (1) +1
Здравствуйте, Serginio1, Вы писали:

S> Я бы с удовольствием использовал F# для того же Рослина ну и просто мозг развлечь.

S>А так лениво делать в разных проектах.
Не понимаю use case. Для "того же Рослина" надо работать в MS, а для "просто мозг развлечь" берешь F# interactive и никакие проекты не нужны.
Re[2]: Базовое отличие ООП от ФП
От: viellsky  
Дата: 05.03.24 19:19
Оценка: 4 (1)
Здравствуйте, Serginio1, Вы писали:

S>ООП это прежде всего состояние

Собственно, и всё

S>и сокращения кода за счет наследования и переопределении методов.

Ни при наследовании ни при переопределении код (функций/методов) не сокращается. Сокращается только код, относящийся к состоянию. Т.е. всё отличие как ни крути сводится к появлению состояния и индивидуальных языковых плюшек для упрощения работы с ним.
Re[3]: Базовое отличие ООП от ФП
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 06.03.24 07:08
Оценка: 4 (1) +2 :)
Здравствуйте, viellsky, Вы писали:


S>>ООП это прежде всего состояние

V>Собственно, и всё

S>>и сокращения кода за счет наследования и переопределении методов.

V>Ни при наследовании ни при переопределении код (функций/методов) не сокращается. Сокращается только код, относящийся к состоянию. Т.е. всё отличие как ни крути сводится к появлению состояния и индивидуальных языковых плюшек для упрощения работы с ним.

Вот помню я программировал на Фортране, Паскале (не Турбо). Там никакого ООП не было. Только процедурное программирование. Но было состояние. Глобальные переменные и переменные функции и параметры.
Которые в огромном количестве передавались из метода в метод.
Что бы не таскать переменные через параметры, решили передавать через ссылку на структуру.
А затем, зачем нам передавать явно, давай прикрутим методы к структуре, а self будем передавать неявно через регистр, прикрутили наследование и VMT, информацию о типе, ну и так далее Получился ООП
и солнце б утром не вставало, когда бы не было меня
Отредактировано 07.03.2024 20:54 Serginio1 . Предыдущая версия . Еще …
Отредактировано 06.03.2024 15:25 Serginio1 . Предыдущая версия .
Отредактировано 06.03.2024 13:49 Serginio1 . Предыдущая версия .
Отредактировано 06.03.2024 10:42 Serginio1 . Предыдущая версия .
Re: Базовое отличие ООП от ФП
От: diez_p  
Дата: 06.03.24 11:47
Оценка: 8 (1)
Здравствуйте, Разраб, Вы писали:

Р>

Р>/// Simplicity
Р>module FP =
Р>    let add_v1 = fun a b -> a + b
Р>    let add_v2 = (+)
Р>    let add_v3 a b = a + b


Р>FP.add_v1 1 1 |> printfn "%d"

Р>/// Complexity
Р>module OOP =
Р>    type Add(a) =
Р>        class
Р>            member it.Value = a
Р>            member it.Plus(b) = Add((b :> Add).Value + a)
Р>        end

Р>OOP.Add(1).Plus(OOP.Add(1)).Value |> printfn "%d"

Р>


Р>Выше ООП и ФП подход к решению одной задачи.

Р>В чем принципиальное отличие?
Р>На мой взгляд ФП ориентировано на обработку данных,
Р>в то время как ООП старается абстрагировать проблему в некоторую модель,
Р>что делать код намного сложнее в понимании.
Р>Появляется неявный контекст, "за лесом не видно деревьев".

ООП необходимо для развестистой и сложной модели: бизнес процессы, ынтерпрайз, UI фреймворки — решение чисто прикладной задачи, где необходимо вытачивать дмоенную модель,
следить за консистентностью и т.д. ООП там отлично ложится при должном умении.
Если же пишется инструмент сам в себе либо что-то полусистемное, необходимая доля ООП может быть сильно уменьшена. хотел бы я посмотреть на ФП проект, хотя бы в 200к строк, и не в стиле маяковского, когда каждый чих на новой строке, а с нормальным заполнением.

То же ядро линукса можно было бы переписать на ООП и сделать код в целом понятнее и кратче, но это повлечет за собой сайд эффекты, которые будут несовместимы с требованиями.
Re[9]: Базовое отличие ООП от ФП
От: Разраб  
Дата: 06.03.24 15:31
Оценка:
Здравствуйте, novitk, Вы писали:

N>Здравствуйте, Serginio1, Вы писали:


S>> Я бы с удовольствием использовал F# для того же Рослина ну и просто мозг развлечь.

S>>А так лениво делать в разных проектах.
N>Не понимаю use case. Для "того же Рослина" надо работать в MS, а для "просто мозг развлечь" берешь F# interactive и никакие проекты не нужны.
вообще, я недавно отдуплил тему окончательно. главная сила F# скриптов,
не только в самостоятельном использований(но это тоже, особенно
сейчас с ускорением старта дотнетовой тулзы),
но прежде всего при разработке fsproj в vs code + Ionide
Каждый включенный в проект файл модуль (fs)
Отдельно от fsproj создаем fsx
через #r "nuget: Fsharp.Data" добавляем необходимые зависимости.
через #I "Utils.fs" грузим модули проекта,
добавляем отладочный код и отправляем все это в fsi
таким образом разработка идет намного веселей, вместо прыганья по класса,
отлаживаются идеальные программные единицы — функции.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Базовое отличие ООП от ФП
От: Разраб  
Дата: 06.03.24 15:37
Оценка: 8 (1)
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Разраб, Вы писали:

Р>>Появляется неявный контекст, "за лесом не видно деревьев".

S>Принципиальное отличие в наличии изменяемого состояния, для которого необходима идентифицируемость (identity).

S>Всё остальное — непринципиально. Если его нет, то объект — это просто набор функций, которые объединены (или не объединены) общим замыканием. Интерфейс становится кортежем функций, а класс — синоним конструктора.
Дело в том, что ООП делает состояние и управление им неявным, взять хотя бы классический WPF, он полагается на магические пропертя и рефлексию.
Но сейчас уже набирает силу ФРП, и оно делает многие вещи более простым способом(еще можно глянуть solidjs)
open Avalonia
open Avalonia.Controls
open Avalonia.Markup.Xaml
open FSharp.Control.Reactive
open Avalonia.Threading

type AppState =
    { Count: int
      EnableTimer: bool }

    static member Zero = { Count = 0; EnableTimer = true }

type MainWindow() as this =
    inherit Window()
    do this.InitializeComponent()

    member private this.InitializeComponent() =
#if DEBUG
        this.AttachDevTools()
#endif
        AvaloniaXamlLoader.Load(this)

        let count = Subject.behavior (AppState.Zero)

        let tb = this.FindControl<TextBlock>("info")
        let btn = this.FindControl<Button>("inc")
        let inc = fun (x: AppState) -> { x with Count = x.Count + 1 }

        btn.Click.Add(fun _ ->
            if count.Value.EnableTimer then
                count.OnNext(
                    { count.Value with
                        Count = count.Value.Count + 1
                        EnableTimer = false }
                )
            else
                count.OnNext(inc count.Value))

        count.Subscribe(fun x -> Dispatcher.UIThread.Invoke(fun _ -> tb.Text <- $"Count: {x.Count}"))
        |> ignore

        task {
            while count.Value.EnableTimer do
                do! Async.Sleep 1000
                count.OnNext(inc count.Value)
        }
        |> ignore
☭ ✊ В мире нет ничего, кроме движущейся материи.
Отредактировано 06.03.2024 15:42 Разраб . Предыдущая версия .
Re[10]: Базовое отличие ООП от ФП
От: novitk США  
Дата: 06.03.24 16:18
Оценка: +1
Здравствуйте, Разраб, Вы писали:

Именно. Я честно был недавно удивлен на интервью. Контора на дотнете, но для скриптов используют CPython, IronPython типа не развивается.
Я говорю "а что не F#?", ответ какой-то мутный, но я так понял "не осилили".
Re[2]: Базовое отличие ООП от ФП
От: novitk США  
Дата: 06.03.24 16:24
Оценка:
Здравствуйте, diez_p, Вы писали:

_>хотел бы я посмотреть на ФП проект, хотя бы в 200к строк, и не в стиле маяковского, когда каждый чих на новой строке, а с нормальным заполнением.

https://github.com/ghc/ghc
https://github.com/JuliaLang/julia/tree/master/stdlib
https://github.com/scala/scala3
Отредактировано 06.03.2024 16:25 novitk . Предыдущая версия .
Re[3]: Базовое отличие ООП от ФП
От: diez_p  
Дата: 07.03.24 14:38
Оценка:
Здравствуйте, novitk, Вы писали:

N>Здравствуйте, diez_p, Вы писали:


_>>хотел бы я посмотреть на ФП проект, хотя бы в 200к строк, и не в стиле маяковского, когда каждый чих на новой строке, а с нормальным заполнением.

N>https://github.com/ghc/ghc
N>https://github.com/JuliaLang/julia/tree/master/stdlib
N>https://github.com/scala/scala3

Мельком глянул, и Base.method это похоже на extension методы в шарпах и котлине и сложность становится сопоставимой, весь вопрос в квалификации разраба и условиях в которых это создавалось.
Re[4]: Базовое отличие ООП от ФП
От: novitk США  
Дата: 07.03.24 16:32
Оценка:
Здравствуйте, diez_p, Вы писали:

_>Мельком глянул, и Base.method это похоже на extension методы в шарпах и котлине и сложность становится сопоставимой, весь вопрос в квалификации разраба и условиях в которых это создавалось.


Не совсем. Это разные способы решения https://en.wikipedia.org/wiki/Expression_problem, но конкретно multiple dispatch в Julia (и Lisp/CLOS) сильно шире.
Вот видео про собственно multiple dispatch, расширяет мозги независимо от используемого языка:
https://www.youtube.com/watch?v=kc9HwsxE1OY
Отредактировано 07.03.2024 16:39 novitk . Предыдущая версия . Еще …
Отредактировано 07.03.2024 16:33 novitk . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.