Форум программистов, компьютерный форум, киберфорум
Священные войны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/41: Рейтинг темы: голосов - 41, средняя оценка - 4.66
Автор канал по Лиспу
 Аватар для Regrin1
25 / 23 / 2
Регистрация: 10.08.2021
Сообщений: 357

Минусы ООП

21.08.2021, 07:06. Показов 8969. Ответов 97

Студворк — интернет-сервис помощи студентам
Я слышал много критики в адрес ООП. Говорят, что оно приносит больше сложности чем упрощает и такой код труднее читать.
Насколько обоснованны эти заявления? Приводятся цитаты Дейксры, Торвальдса и Рэймонда в которых они говорят об ООП не самые лестные вещи. Я понимаю, что апелляция к авторитету - не аргумент, но сомнение во мне уже заложилось...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.08.2021, 07:06
Ответы с готовыми решениями:

Какой язык веб-программирования выбрать? Плюсы\минусы
Вопрос что ни на есть из раздела священных, но все же... Какой язык веб-программирования кто предпочитает? У кого какие плюсы и...

Динамическая/статическая типизация, интерпретация/компиляция и функциональные языки - плюсы и минусы
Вынесено из темы https://www.cyberforum.ru/holywars/thread1357389.html В самой необходимости этим заниматься. Если честно, из...

Delphi !? Плюсы и минусы
Почему при поиске работы через Internet в странах Европы и Америки очень редко можно встретить необходимость в Delphi?

97
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
24.08.2021, 11:44
Студворк — интернет-сервис помощи студентам
Delphi кстати сейчас воплощает идеологию GO структур
https://docwiki.embarcadero.co... ed_Records

Есть Initialize и есть Finalize тот же конструктор и деструктор, а так же ещё куча других методов

Delphi
1
2
3
4
5
procedure ParByValue (rec: TMyRecord);
procedure ParByConstValue (const rec: TMyRecord);
procedure ParByRef (var rec: TMyRecord);
procedure ParByConstRef (const [ref] rec: TMyRecord);
function ParReturned: TMyRecord;
Полное отсутствие ООП. И полная отвага
0
Модератор
 Аватар для Curry
5171 / 3537 / 536
Регистрация: 01.06.2013
Сообщений: 7,696
Записей в блоге: 9
24.08.2021, 15:25
Цитата Сообщение от Regrin1 Посмотреть сообщение
Я уже жалею, что начал эту тему.
Не жалейте. Вы задали вопрос, и, в общем то, получили ответ. А дальше начинается флейм в холиварах. Он гораздо менее опасен чем ковид. Ничего страшного.
Цитата Сообщение от korvin_ Посмотреть сообщение
Тем что они описывают абстрактный тип, а не объект, и "связываются статически"
Т.е. эти модули как template class в С++? Там тоже можно подставить любой тип, лишь бы вызываемые в шаблонном классе методы в нём были.
Цитата Сообщение от korvin_ Посмотреть сообщение
И ещё 100500 сигнатур из разных модулей разных разрабочиков, ничего не знающих друг о друге.
Если бы они ничего не знали друг о друге, то разработчики модулей типа List_stack не знали бы какие функции требуются в модуле Main и наоборот. Т.е. знать набор функций с их сигнатурами, по любому, необходимо, и лучше сразу заложить это в интерфейс (как бы он не назывался в языке).
Неплохо также позволить добавлять интерфейсы для структур данных не меняя исходника описывающего эти структуры, т.е. приходим к классам типов / трейтам. Но именно, создавая интерфейсы, а не дублируя описания набора функций.
Проще разрабатывать новые функции выбирая уже разработанные для структур интерфейсы, в том числе, подбирая удобные пакеты.
То есть когда мухи отдельно - котлеты отдельно. А именно, данные отдельно, функции отдельно (хоть и объединённые в интерфейсы), возможностей больше.
Цитата Сообщение от korvin_ Посмотреть сообщение
Ага, но это два разных интерфейса. Delphi я уже смутно помню.
Отдельные, интерфейсы для конструирования объектов (в том числе) называются метаклассы, но они магические, их не надо объявлять для каждого объявляемого класса, и для передачи их как аргумент нужно просто указать имя класса.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
function TMainForm.ExecDialog(AFormClass: TFormClass):TModalResult;
begin
  with AFormClass.Create(Application) do // создаётся объект типа наследуемого от TForm
    try
     ExecDialog:=showModal;
    finally
     free;
    end;
end;
// ....
     TMyForm = class(TForm)
// ....
  MainForm.ExecDialog(TMyForm); // Указываем тип производный от  TForm, не от   TFormClass.
0
Невнимательный
 Аватар для ft4l
3143 / 1365 / 362
Регистрация: 08.02.2013
Сообщений: 8,014
Записей в блоге: 2
24.08.2021, 16:00
Цитата Сообщение от Regrin1 Посмотреть сообщение
приносит больше сложности
Множественное наследование ещё вроде упрощать может иногда.
Или без этого приходится лепить классы над классами цепочками за цепочками )) кучи лишних сущностей.

В список языков, поддерживающих множественное наследование, входят: Io, Eiffel, C++, Dylan, Python, некоторые реализации классов JavaScript (например, dojo.declare), Perl 6, Curl, Common Lisp (благодаря CLOS), OCaml, Tcl (благодаря Incremental Tcl)[1], а также Object REXX (за счёт использования классов-примесей).
Трейты вот в php завезли , наверно после этой статьи в вики ,)) не хватало наверно.
...Но что-то глянул на то-же Trait в Rust что-то оно там как-будто совсем другой смысл имеет...
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
24.08.2021, 17:14
Цитата Сообщение от Curry Посмотреть сообщение
Т.е. эти модули как template class в С++? Там тоже можно подставить любой тип, лишь бы вызываемые в шаблонном классе методы в нём были.
Наверное. Мало имел дела с шаблонами в плюсах. В них, вроде, даже не нужно сигнатуру описывать, или даже невозможно, пока концепты не завезут.

Цитата Сообщение от Curry Посмотреть сообщение
Если бы они ничего не знали друг о друге, то разработчики модулей типа List_stack не знали бы какие функции требуются в модуле Main и наоборот.
Разработчики модуля List_stack и не знают. Также как и разработчики какого-нибудь jackson или gson ничего не знают о тысячах проектов на, в которых используются их библиотеки. Также как оператор равенства ( = ) : t -> t -> bool для какого-то типа t ничего не знает о том, где будет использоваться, кроме своей сигнатуры и семантики.

Цитата Сообщение от Curry Посмотреть сообщение
Неплохо также позволить добавлять интерфейсы для структур данных не меняя исходника описывающего эти структуры
Это позволено.
Кликните здесь для просмотра всего текста
F#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
 
module Pair :
  sig
    type t
    val of_int : int -> t
    val ( = ) : t -> t -> bool
  end
  =
  struct
 
    type t = { x : int ; y : int }
 
    let of_int i = { x = i ; y = i }
 
    let ( = ) a b =
      a.x = b.x && a.y = b.y
 
  end
 
module Ext = struct
 
  module Pair =
    struct
      include Pair
 
      let ( <> ) a b =
        not (a = b)
 
    end
 
end
 
 
 
let main_std () =
  let a = Pair.of_int 1
  and b = Pair.of_int 1
  and c = Pair.of_int 2 in
  Printf.printf "%B %B\n" (a = b) (a = c)
 
let main_ext () =
  let open Ext in
 
  (* same part *)
  let a = Pair.of_int 1
  and b = Pair.of_int 1
  and c = Pair.of_int 2 in
  Printf.printf "%B %B\n" (a = b) (a = c)
  (* same part end *)
 
  ; Printf.printf "%B %B\n" (a <> b) (a <> c)
 
let _ =
  main_std () ;
  main_ext ()
 
 
 
(* type compatibility *)
 
let std_pair x =
  Pair.of_int x
 
let ext_pair x =
  let open Ext in
  Pair.of_int x
 
let _ =
  let a = std_pair 1
  and b = ext_pair 1 in
  Printf.printf "%B\n" (a = b) (* same type *)


Цитата Сообщение от Curry Посмотреть сообщение
Проще разрабатывать новые функции выбирая уже разработанные для структур интерфейсы, в том числе, подбирая удобные пакеты.
Кому проще? Что тебе мешает это делать хоть в Ocaml, хоть в Go?

Go
1
var _ MyCoolInterface = (*YourCoolStruct)(nil) // explicit interface compatibility check
Цитата Сообщение от Curry Посмотреть сообщение
А именно, данные отдельно, функции отдельно
Расскажи об этом OpXiv )

Цитата Сообщение от Curry Посмотреть сообщение
Отдельные, интерфейсы для конструирования объектов (в том числе) называются метаклассы, но они магические, их не надо объявлять для каждого объявляемого класса, и для передачи их как аргумент нужно просто указать имя класса.
Ты уверен? Пойду The Art of the Metaobject Protocol перелистаю.

Цитата Сообщение от Curry Посмотреть сообщение
Delphi
1
2
3
4
5
6
7
8
9
function TMainForm.ExecDialog(AFormClass: TFormClass):TModalResult;
begin
  with AFormClass.Create(Application) do // создаётся объект типа наследуемого от TForm
    try
     ExecDialog:=showModal;
    finally
     free;
    end;
end;
Но как тут обратиться к методам и свойствам созданного объекта TMyForm? Тут же вроде доступны будут только методы и свойства TForm (типа того же ShowModal)?

Добавлено через 11 минут
Цитата Сообщение от korvin_ Посмотреть сообщение
Но как тут обратиться к методам и свойствам созданного объекта TMyForm? Тут же вроде доступны будут только методы и свойства TForm (типа того же ShowModal)?
Хотя не, туплю, это здесь не нужно.
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
24.08.2021, 17:38
Цитата Сообщение от korvin_ Посмотреть сообщение
Расскажи об этом OpXiv )
А я считаю это глупостью от балды. Если у нас есть класс, он должен в себе содержать метод, из которого можно по this обратиться к созданному экземпляру. Или self к описанию класса. Без доп объявления на каком то внешнем методе, информации к какому структурированному классу он принадлежит как в GO.


Например, разрешено ли в GO такое ???

Go
1
2
3
4
5
6
7
func (Class_1) Func1() string {
    return "Hello!"
}
 
func (Class_2) Func1() string {
    return "Mazaf...!"
}
Как мне бегло найти все структурированные методы в общем пространстве "одного модуля"? Если есть пару таких структурированных классов, и в каждом по 10 методов. И какой то ЛАЛКА разбросал их вообще рандомно)))
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
24.08.2021, 17:45
Цитата Сообщение от Curry Посмотреть сообщение
А именно, данные отдельно, функции отдельно (хоть и объединённые в интерфейсы), возможностей больше.
Curry, вот видишь, что умный человек говорит:
Цитата Сообщение от OpXiv Посмотреть сообщение
А я считаю это глупостью от балды. Если у нас есть класс, он должен в себе содержать метод, из которого можно по this обратиться к созданному экземпляру. Или self к описанию класса. Без доп объявления на каком то внешнем методе


Цитата Сообщение от OpXiv Посмотреть сообщение
как в GO.
В C++ и Delphi так же, только this/self есть. )

Цитата Сообщение от OpXiv Посмотреть сообщение
Например, разрешено ли в GO такое ???
Go
1
2
3
4
5
6
func (Class_1) Func1() string {
    return "Hello!"
}
func (Class_2) Func1() string {
    return "Mazaf...!"
}
Конечно. А где не разрешено?

Цитата Сообщение от OpXiv Посмотреть сообщение
Как мне бегло найти все структурированные методы в общем пространстве "одного модуля"?
Воспользоваться IDE.

Цитата Сообщение от OpXiv Посмотреть сообщение
И какой то ЛАЛКА разбросал их вообще рандомно
Ну ты не будь ЛАЛКОЙ и не разбрасывай. )
0
Модератор
 Аватар для Curry
5171 / 3537 / 536
Регистрация: 01.06.2013
Сообщений: 7,696
Записей в блоге: 9
24.08.2021, 18:31
Цитата Сообщение от korvin_ Посмотреть сообщение
Разработчики модуля List_stack и не знают. Также как и разработчики какого-нибудь jackson или gson ничего не знают о тысячах проектов на, в которых используются их библиотеки.
Да, хотя бы в одну сторону информация должны быть доступна. А значит создание интерфейсов (трейтов, классов типов) возможно и оправдано, особенно для библиотек.
Цитата Сообщение от korvin_ Посмотреть сообщение
Также как оператор равенства ( = ) : t -> t -> bool для какого-то типа t ничего не знает о том, где будет использоваться, кроме своей сигнатуры и семантики.
Оператор равенства (==), но не суть. А суть в том что был создан класс типов Eq который включает в себя описание (==), и это позволяет, с одной стороны, реализовать (==), для многих типов, с другой, накладывать constrains на типы аргументов функций показывая что с чем может работать, и помогает разумно, без излишеств, проектировать, нежели при подходе с отдельными сигнатурами функций. Интерфейсы (и т.д), это реализация соглашений взаимодействия между отдельными разработчиками, между отдельными частями программы. // К. О.
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
24.08.2021, 18:54
В Delphi дженерики тоже есть. Правде неудобные, но пользоваться можно


https://docwiki.embarcadero.co... f_Generics

https://docwiki.embarcadero.co... g_Generics

Добавлено через 2 минуты
Надеюсь их и в PHP добавят

https://wiki.php.net/rfc/generics
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
24.08.2021, 19:27
Цитата Сообщение от Curry Посмотреть сообщение
Да, хотя бы в одну сторону информация должны быть доступна.
В какую сторону должна быть доступна информация в случае с jackson?

Цитата Сообщение от Curry Посмотреть сообщение
А значит создание интерфейсов (трейтов, классов типов) возможно и оправдано, особенно для библиотек.
Ещё раз: разработчики Jackson должны подключить себе интерфейсы из моего проекта?

Цитата Сообщение от Curry Посмотреть сообщение
Оператор равенства (==), но не суть.
В Ocaml это ( = ), но не суть.

Цитата Сообщение от Curry Посмотреть сообщение
и это позволяет, с одной стороны, реализовать (==), для многих типов
Я и так могу реализовать ( = ) для многих типов. Без тайп классов.

Цитата Сообщение от Curry Посмотреть сообщение
с другой, накладывать constrains на типы аргументов функций показывая что с чем может работать
На отдельную функцию нельзя, да. Только на модуль.

Цитата Сообщение от Curry Посмотреть сообщение
и помогает разумно, без излишеств, проектировать, нежели при подходе с отдельными сигнатурами функций.
Без излишеств --- это же без миллионов тайпклассов монад/комонад/лифтов/линз и прочих зигохистоморфных препроморфизмов, да?

Цитата Сообщение от Curry Посмотреть сообщение
Интерфейсы (и т.д), это реализация соглашений взаимодействия между отдельными разработчиками, между отдельными частями программы. // К. О.
Молодец, К. О. Расскажи, какое соглашение должны были реализовать разработчики Jackson для моей программы?
0
Модератор
 Аватар для Curry
5171 / 3537 / 536
Регистрация: 01.06.2013
Сообщений: 7,696
Записей в блоге: 9
24.08.2021, 20:10
Цитата Сообщение от korvin_ Посмотреть сообщение
В какую сторону должна быть доступна информация в случае с jackson?
Если jackon - либа (пакет, крейт, сборка) и не проектировалась под конкретное приложение, то авторы её, будем думать, знают для чего их либа, и как её следует использовать, т.е. у неё есть её API выраженный в интерфейсах.
Цитата Сообщение от korvin_ Посмотреть сообщение
разработчики Jackson должны подключить себе интерфейсы из моего проекта?
нет
Цитата Сообщение от korvin_ Посмотреть сообщение
Я и так могу реализовать ( = ) для многих типов. Без тайп классов.
Если мы пишем функцию работающую с каким то типом поддерживающим элементарные арифметические действия, то проще задать ограничение на тип аргумента как Num, чем описывать все те функции, которые нашей функции потребуются.
Цитата Сообщение от korvin_ Посмотреть сообщение
Без излишеств --- это же без миллионов тайпклассов монад/комонад/лифтов/линз и прочих зигохистоморфных препроморфизмов, да?
Да, без тех, которые нам не потребуются для решения данной задачи. Так что, если для типа ХХХ написана реализация какого то класса типов или трейта YYY из пакета/крейта NNN, а он нам не нужен, то мы такой пакет и не подключаем. Гораздо лучше чем добавлять все функции, для всех возможных, случаев, в ООП класс.
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
24.08.2021, 20:20
В общем объективных реальных минусов нигде нет. Проблемы начинаются лишь в головах тех, которые не привыкли.


Вот вы правша. А тут пришёл левша, и давай затерать как левой рукой удобно кушать. Так правша возьмёт дробаш, и отстрелит ему левую руку. Принудительно заставив кушать с правой.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
24.08.2021, 21:14
Цитата Сообщение от Curry Посмотреть сообщение
Если jackon - либа (пакет, крейт, сборка) и не проектировалась под конкретное приложение, то авторы её, будем думать, знают для чего их либа, и как её следует использовать, т.е. у неё есть её API выраженный в интерфейсах.
Или не выраженный, но не суть. Ты же знаешь про инверсию зависимостей?
Типа вот я пишу приложение:
Code
1
2
3
ComponentA -> Jackson
ComponentB -> Jackson
...
теперь я хочу избавиться от прямой зависимости:
Code
1
2
(ComponentA -> FromJSONInterface) <- Jackson
(ComponentB -> ToJSONInterface) <- Jackson
Как ты понимаешь, интерфейсы тут предоставляют "высокоуровневые" компоненты A и B, а Jackson просто подставляется как реализация.
Jackson конечно же ничего не знает про эти интерфейсы. И не может, потому что компонентов сотни в тысячах проектов.

Цитата Сообщение от Curry Посмотреть сообщение
нет
Как они тогда реализуют требования моего приложения? Очевидно никак.

Конечно, в общем случае, интерфейс библиотеки может не совпадать с интерфейсами, которые требуют мои компоненты и мне придётся писать какой-то bridge (хз как там в паттернах это называется), но в случаях, когда совпадают --- не придётся. В этом и отличие. Я уже приводил пример, повторю: SWT, два компонента, TextField, ComboBox, оба имеют метод getText, одинаковый как по сигнатуре, так и по семантике, но авторы SWT не предоставили каой-нибудь интерфейс Textable { getText() : String }. Как мне однообразно обработать объекты TextField и ComboBox? Без костылей --- никак. А если это компоненты из разных библиотек, SWT и Swing (их можно совмещать в одном приложении), которые в общем случае не обязаны знать друг о друге и иметь общую зависимость в виде единого набора интерфейсов?

Цитата Сообщение от Curry Посмотреть сообщение
Если мы пишем функцию работающую с каким то типом поддерживающим элементарные арифметические действия, то проще задать ограничение на тип аргумента как Num, чем описывать все те функции, которые нашей функции потребуются.
Так и не нужно их все описывать, достаточно описать модуль.

Цитата Сообщение от Curry Посмотреть сообщение
Да, без тех, которые нам не потребуются для решения данной задачи. Так что, если для типа ХХХ написана реализация какого то класса типов или трейта YYY из пакета/крейта NNN, а он нам не нужен, то мы такой пакет и не подключаем.
Спасибо, кэп.

Цитата Сообщение от Curry Посмотреть сообщение
Гораздо лучше чем добавлять все функции, для всех возможных, случаев, в ООП класс.
Это вообще к чему? Мы уже целую страницу про ООП не говорим

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от OpXiv Посмотреть сообщение
В общем объективных реальных минусов нигде нет. Проблемы начинаются лишь в головах тех, которые не привыкли.
Вот вы правша. А тут пришёл левша, и давай затерать как левой рукой удобно кушать. Так правша возьмёт дробаш, и отстрелит ему левую руку. Принудительно заставив кушать с правой.
Да, кстати, иди уже кушать и на тихий час, не мешай взрослым дядям разговаривать.

0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
24.08.2021, 21:26
Цитата Сообщение от korvin_ Посмотреть сообщение
не мешай взрослым дядям разговаривать.
А это уже оффтоп не по теме. Вы ударяетесь уже в извращения самых крупных извращенцев.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
24.08.2021, 21:38
Curry, и ещё вот такой момент:

есть у меня три компонента, требующие такие зависимости:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
component A
  requires Repo {
    Get (ID) -> User
  }
 
component B
  requires Repo {
    Get (ID) -> User
    Put (User) -> ID
  }
 
component C
  requires Repo {
    Put (User) -> ID
  }
теперь я реализую репозиторий:
Code
1
2
3
4
component Repo {
  Get (id: ID) -> User { ... }
  Put (user: User) -> ID { ... }
}
всё, могу использовать. Компилятор позаботится о соответствии Repo нужным требованиям.

В Java интерфейсы "складываются", т.е. методы с одинаковыми сигнатурами из разных интерфейсов считаются одним методом. Типа

Code
1
2
3
4
5
6
component Repo implemets
  A.Repo, B.Repo, C.Repo
{
  Get (id: ID) -> User { ... }
  Put (user: User) -> ID { ... }
}
А для Haskell/Rust мне придётся реализовывать m*n тайпклассов/трейтов? Типа:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
component Repo implemets A.Repo
{
  Get (id: ID) -> User { ... }
}
 
component Repo implemets B.Repo
{
  Get (id: ID) -> User { ... }
  Put (user: User) -> ID { ... }
}
 
component Repo implemets C.Repo
{
  Put (user: User) -> ID { ... }
}
Нет, спасибо.
0
Модератор
 Аватар для Curry
5171 / 3537 / 536
Регистрация: 01.06.2013
Сообщений: 7,696
Записей в блоге: 9
24.08.2021, 22:22
Цитата Сообщение от korvin_ Посмотреть сообщение
Ты же знаешь про инверсию зависимостей?
Угу. При её использовании обычно применяют шаблоны "фабрика", "фабричный метод".
Что же про конкретную библиотеку о которой вы пишите, то я не знаю даже в каком языке она используется, что бы влезать в её нюансы.
Цитата Сообщение от korvin_ Посмотреть сообщение
Я уже приводил пример, повторю: SWT, два компонента, TextField, ComboBox, оба имеют метод getText, одинаковый как по сигнатуре, так и по семантике, но авторы SWT не предоставили каой-нибудь интерфейс Textable { getText() : String }. Как мне однообразно обработать объекты TextField и ComboBox? Без костылей --- никак.
А началось с обсуждения достоинств и недостатков ООП, применения модулей. И вы переходите к жалобам на то как криво SWT сделана. В нормальных либах таких проблем нет. Несколько лет назад я сделал простенький GUI на Haskell, поверх SDL, так у меня виджеты, для которых это имеет какой то смысл, реализуют
Haskell
1
2
3
4
-- | Для экземпляров этого класса типов можно назначить установку и извлечение некоего текста.
class TextProperty a where
    setText :: MonadIO m => a -> T.Text -> m ()
    getText :: MonadIO m => a -> m T.Text
Ссылка на либу есть где то в моём тутошнем блоге, по датам на гитхабе сможете убедится, что это я туда не только что дописал.
Т.е. сведение таких элементарных вещей к одному интерфейсу представляется очевидно необходимым для нормального проектирования либы.
Цитата Сообщение от korvin_ Посмотреть сообщение
Так и не нужно их все описывать, достаточно описать модуль.
Я писал про ограничения налагаемые на тип конкретного аргумента (аргументов) функции. Если вы уподобите каждый класс типов/трейт/интерфейс модулю, то так и будет.

Добавлено через 13 минут
Цитата Сообщение от korvin_ Посмотреть сообщение
В Java интерфейсы "складываются", т.е. методы с одинаковыми сигнатурами из разных интерфейсов считаются одним методом.
Так может быть, если это методы без реализации. Но если в нескольких интерфейсах/классах типов/трейтах есть функции с одинаковыми именами и сигнатурами, и, из вашего конктекста, я понимаю что это одно и тоже (их же "легально" складывать), значит ошибка на уровне проектирования интерфейсов, не стоит их дублировать, но создать отдельный интерфейс для get, для put, а их уже использовать как зависимости для component A,B,C.
Как говориться don't repeat yourself.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
24.08.2021, 22:36
Цитата Сообщение от Curry Посмотреть сообщение
Угу. При её использовании обычно применяют шаблоны "фабрика", "фабричный метод".
Это не связано. Возможно, но не необходимо.

Цитата Сообщение от Curry Посмотреть сообщение
Что же про конкретную библиотеку о которой вы пишите, то я не знаю даже в каком языке она используется, что бы влезать в её нюансы.
Java, но для моего примера это не имеет значения.

Цитата Сообщение от Curry Посмотреть сообщение
А началось с обсуждения достоинств и недостатков ООП, применения модулей.
Я описал разницу, не навязывая применение одного подхода во всех ситациях.

Цитата Сообщение от Curry Посмотреть сообщение
И вы переходите к жалобам на то как криво SWT сделана.
Я привожу пример.

Цитата Сообщение от Curry Посмотреть сообщение
В нормальных либах таких проблем нет.
Как бы в Хаскелле/Расте были бы реализованы такие библиотеки? Как были реализованы кроссбиблиотечные интерфейсы? И давай без примеров примитивного (простого) Show, не раздувай стандартную библиотеку на все 100500 случаев.

Цитата Сообщение от Curry Посмотреть сообщение
Несколько лет назад я сделал простенький GUI на Haskell, поверх SDL, так у меня виджеты, для которых это имеет какой то смысл, реализуют
Молодец, а какой-нибудь HaskellQt тоже реализует твои тайпклассы?

Цитата Сообщение от Curry Посмотреть сообщение
Т.е. сведение таких элементарных вещей к одному интерфейсу представляется очевидно необходимым для нормального проектирования либы.
Теперь увеличь количество либ в N раз.

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

Добавлено через 2 минуты
Цитата Сообщение от Curry Посмотреть сообщение
Как говориться don't repeat yourself.
Ну вот в Go я могу не повторять себя бессмысленными письменами типа
Code
1
impl I for T { ... }
:lol:
0
Модератор
 Аватар для Curry
5171 / 3537 / 536
Регистрация: 01.06.2013
Сообщений: 7,696
Записей в блоге: 9
25.08.2021, 16:21
Цитата Сообщение от korvin_ Посмотреть сообщение
Как бы в Хаскелле/Расте были бы реализованы такие библиотеки?
Какие библиотеки?
Цитата Сообщение от korvin_ Посмотреть сообщение
Как были реализованы кроссбиблиотечные интерфейсы?
На https://www.stackage.org/ и https://crates.io/ десятки тысяч библиотек. Большинство с друг другом взаимодействуют. И через класса типов/крейты. Исходники доступны. welcome to reading.
Цитата Сообщение от korvin_ Посмотреть сообщение
какой-нибудь HaskellQt тоже реализует твои тайпклассы?
Qt даже не ООП-шный, а гипер-ООП-шный, идеологически не совместим с haskell.
Несколько отвлекаясь от темы (здесь палата №6 холивары, здесь можно). Мне усиленно кажется что для реализации механизма сигналов-слотов не нужно было городить препроцессор, это реализуется на чистых плюсах (хотя и не пытался так сделать). При чём в Qt (по крайней мере 4.х и 5.1 которыми я пользовался) можно было отправить сигнал объекту у которого нет соотвествующего слота, и выяснялось это только в рантайме, исключением. На плюсах можно было бы и в компайлтайме проверять, через множественное наследование. Я в курсе что множественное наследование гораздо больше народу не одобряет чем ООП, но в данном случае, это было бы лучше чем препроцессор. Ну, да, препроцессор ещё туда всякие foreach-и добавляет, но это мелочи.
Цитата Сообщение от korvin_ Посмотреть сообщение
Теперь увеличь количество либ в N раз.
Цитата Сообщение от korvin_ Посмотреть сообщение
Расскажи про эту ошибку авторам разных библиотек.
Ну что ж делать если они такие ... альтернативно продвинутые.
Объединяйте их костылями. В Java же завезли рефлексию. Выковыривайте методы getText по имени в рантайме, к примеру.
Цитата Сообщение от korvin_ Посмотреть сообщение
Ну вот в Go я могу не повторять себя бессмысленными письменами типа
А если вернётесь к голым С, то вам понадобится ещё меньше "бессмысленных письмен".
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
02.09.2021, 13:49
Цитата Сообщение от Curry Посмотреть сообщение
Объединяйте их костылями. В Java же завезли рефлексию. Выковыривайте методы getText по имени в рантайме, к примеру.
Она там изначально была. Но да, так и сделано было, рефлексо-костылём.

Сравнивать Ocaml'овские модули с тайп-классами и трейтами всё же не совсем корректно, их нужно сравнивать с Хаскелльными и Растовыми модулями.

Например, подключил ты какой-то модуль реализации стека:
Haskell
1
import qualified Stack = ListStack
и далее используешь его. Потом решил перейти на другую реализацию:
Haskell
1
import qualified Stack = ArrayStack
Если их сигнатуры совпадают, то пользовательский код соберётся. Утиная типизация модулей, только без явного описания сигнатур.

Цитата Сообщение от Curry Посмотреть сообщение
А если вернётесь к голым С, то вам понадобится ещё меньше "бессмысленных письмен".
Наоборот, устану типы приводить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.09.2021, 13:49

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

Студентская жизнь.Ее плюсы и минусы.
Студентская жизньпрекрасна...Так говорят.А как думаешь ты?

Что вы делаете необычное на форуме(плюсы и минусы)
что вы делаете на форуме не обычного? Ну не так как все... Вот пример: прежде чем ответить кому-либо, почему-то смотрю его профиль,...

Плюсы и минусы использования ООП в PHP
Опишите плюсы и минусы использования ООП в PHP???

Где лучше учить ООП PHP ? И зачем нужен ООП
Здравствуйте ! До того как начел учить ООП я кайфовал от программирования, после того как начел учить ООП нет мотивации ну и т.д общем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
98
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru