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

Минусы ООП

21.08.2021, 07:06. Показов 8972. Ответов 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
23.08.2021, 12:25
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от korvin_ Посмотреть сообщение
При чём тут QuickTime player?
Я о https://www.qt.io/

Цитата Сообщение от korvin_ Посмотреть сообщение
Снова ты мимо, впрочем ничего нового.
Тебя не поймёшь. У QT очень богатый ООП.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
23.08.2021, 13:12
Цитата Сообщение от OpXiv Посмотреть сообщение
Это Qt, а не QT.

Цитата Сообщение от OpXiv Посмотреть сообщение
Тебя не поймёшь
Ничего, со временем сможешь, если займёшься расширением кругозора. Почитаешь SICP, CTMCP, TAPL, например.
0
2737 / 894 / 331
Регистрация: 10.02.2018
Сообщений: 2,136
23.08.2021, 13:25
Цитата Сообщение от Regrin1 Посмотреть сообщение
Я слышал много критики в адрес ООП. Говорят, что оно приносит больше сложности чем упрощает и такой код труднее читать.
Может усложнить и затруднить, а может не усложнить и не затруднить. Всё зависит от разработчика. Если он не слишком хорош, то может своим ООП любого программиста вогнать в депрессию.

Я для себя вижу главный минус в том, что "мерчендайзеры" ООП сильно приукрашивают его возможности. Новички думают, что им предлагают BFG-9000, а на деле это оказывается обычная штурмовая винтовка.

Приведу пару примеров.
1. В ООП можно делать крутые черные ящики. Мы там что-то сделали и теперь может это везде использовать. Ага, щаз. Попробуйте заиспользовать класс кнопки TButton из примера выше. Дело в том, что он потянет за собой ещё десяток классов, которые потянут за собой ещё сотню классов и типов. И вообще, что бы попользоваться данной кнопкой нужно писать свою программу в борландовом фреймворке. ООП не делает переносимые чёрные ящики, но вы можете, если очень постараетесь.
2. Муки деления программы на классы. Зачастую, деление логики на классы не является чем-то тривиальным и однозначным. Задачу можно по разному разбить на классы. Какой вариант правильный? Если есть несколько классов, то некая совместная логика может быть отнесена к одному или ко второму. Куда её запихнуть? Запихнуть ли некую вспомогательную логику в собственный класс или добавить к имеющемуся? И ещё куча вопросов и нюансов. И вот я сижу и делаю классы. В какой-то момент понимаю, что лучше по другому и переделываю. И так ещё несколько раз. А когда уже всё готово и я доволен своим шедевральным творением, то у заказчика появляется новое требование и упс... это требование не вписывается в реализованное деление на классы и нужно опять что-то менять. ООП не сможет за вас разбить сложную задачу на высокоуровневые абстракции, продумать взаимодействие этих абстракций и заглянуть в будущее.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
23.08.2021, 14:57
Цитата Сообщение от OpXiv Посмотреть сообщение
Представь себе коробку, в которую ты можешь положить всё угодно (Функции, переменные, ...)
Ты можешь сделать дырочку в этой коробке, обозвав функции\переменные public.
А можешь обозвать private, и тогда всё будет доступно из коробки, без внешнего вмешательства.
Так же можешь взять вторую такую же коробку, и подключить к первой коробке.
Так же можешь заранее создать interface, что бы создать описывающий список.
Это модуль.
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
23.08.2021, 17:21
Цитата Сообщение от korvin_ Посмотреть сообщение
Это Qt, а не QT.
Не видишь в адресной строке ? "qt"

Цитата Сообщение от Ygg Посмотреть сообщение
ООП не делает переносимые чёрные ящики, .... что бы попользоваться данной кнопкой нужно писать свою программу в борландовом фреймворке.
Враньё и провокация! Ты запросто можешь отдельно скомпилировать весь FMX и VLC даже не используя Delphi среду

Цитата Сообщение от Ygg Посмотреть сообщение
это требование не вписывается в реализованное деление на классы и нужно опять что-то менять.
А просто сесть, хотя бы на листке бумаге нарисовать как это должно работать - не катит? Заранее всю структуру продумать.

Цитата Сообщение от politoto Посмотреть сообщение
Это модуль.
Поздравляю. Тогда все классы в PHP являются модулями в привычном понимание GO программистов.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
23.08.2021, 17:40
Цитата Сообщение от OpXiv Посмотреть сообщение
Не видишь в адресной строке ? "qt"
А ты по ссылке перейди.

Цитата Сообщение от OpXiv Посмотреть сообщение
Заранее всю структуру продумать.
Заранее всю структуру можно продумать только у hello-world'ов.

Цитата Сообщение от OpXiv Посмотреть сообщение
Тогда все классы в PHP являются модулями в привычном понимание GO программистов.
Нет, не являются, ибо модули в Go — это совсем другое.

А politoto говорит о таких модулях:

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
(* box 1 *)
module List_stack :
  (* public *)
  sig
    exception Empty_stack
    type 'a t
    val make : unit -> 'a t
    val push : 'a -> 'a t -> unit
    val pop  : 'a t -> 'a
  end = struct
 
    exception Empty_stack
 
    type 'a t = 'a list ref
 
    let make () = ref []
 
    let push x st =
      st := x :: !st
 
    let pop st =
      match !st with
      | [] -> raise Empty_stack
      | head :: rest ->
        begin
          st := rest ;
          head
        end
 
  end
 
 
 
(* box 2 *)
module Array_stack :
  (* public *)
  sig
    exception Empty_stack
    type 'a t
    val make : unit -> 'a t
    val push : 'a -> 'a t -> unit
    val pop  : 'a t -> 'a
  end = struct
 
    (* public impl *)
 
    exception Empty_stack
 
    type 'a t =
      { mutable items : 'a option array
      ; mutable count : int
      }
 
    (* private *)
 
    let grow_factor = 1.6
    let init_capacity = 10
 
    let grow src =
      let old_cap = Array.length src in
      let new_cap = int_of_float (grow_factor *. float_of_int old_cap) in
      let dst = Array.make new_cap None in
      Array.blit src 0 dst 0 old_cap ;
      dst
 
    let ensure_cap s =
      if s.count < Array.length s.items
      then ()
      else s.items <- grow s.items
 
    (* public impl *)
 
    let make () =
      { items = Array.make init_capacity None
      ; count = 0
      }
 
    let push x s =
      ensure_cap s ;
      Array.set s.items s.count (Some x) ;
      s.count <- s.count + 1
 
    let pop s =
      if s.count = 0
      then raise Empty_stack
      else
        s.count <- s.count - 1 ;
        match Array.get s.items s.count with
        | None   -> raise (Failure "unreachable")
        | Some x ->
          begin
            Array.set s.items s.count None ;
            x
          end
 
  end
 
 
 
(* interface *)
module type Stack =
  sig
    exception Empty_stack
    type 'a t
    val make : unit -> 'a t
    val push : 'a -> 'a t -> unit
    val pop  : 'a t -> 'a
  end
 
 
 
(* box 3 *)
module Main (Stack : Stack) =
  struct
 
    let main () =
      let s = Stack.make () in
      for i = 1 to 3 do
        Stack.push i s
      done ;
      for i = 1 to 3 do
        Stack.pop s |> Printf.printf "%d "
      done ;
      Printf.printf "\n"
 
  end
 
let _ =
  let module M1 = Main (List_stack) in
  let module M2 = Main (Array_stack) in
  M1.main () ;
  M2.main ()
0
Модератор
 Аватар для Curry
5171 / 3537 / 536
Регистрация: 01.06.2013
Сообщений: 7,697
Записей в блоге: 9
24.08.2021, 04:10
korvin_, и чем эти F# модули отличаются от ООП классов?
Разве что тем, что для них не указывается какой интерфейс для них реализуется, так это минус, лучше бы указывался явно, а не по утиному принципу - раз такой то набор функций есть, значит подходит под "интерфейс" Stack.
0
Автор канал по Лиспу
 Аватар для Regrin1
25 / 23 / 2
Регистрация: 10.08.2021
Сообщений: 357
24.08.2021, 04:28  [ТС]
korvin_, OpXiv, Послушайте, к чему вообще приведет ваш разговор? Мне кажется, спор зашел в тупик, и скоро скатится в простое сотрясание воздуха. Я уже жалею, что начал эту тему.
0
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
24.08.2021, 05:21
Цитата Сообщение от Curry Посмотреть сообщение
и чем эти F# модули отличаются от ООП классов?
Тем, что ООП классы не нужны в ООП как исключительно "контейнеры" статичных методов. Модули исключительно статика.

Добавлено через 52 секунды

Не по теме:

Цитата Сообщение от Regrin1 Посмотреть сообщение
Я уже жалею, что начал эту тему.
А вы в каком разделе вопрос задали? =)

0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
24.08.2021, 07:30
Цитата Сообщение от Regrin1 Посмотреть сообщение
апелляция к авторитету - не аргумент
Гуманитарное знание невозможно без отсылки к авторитетным мнениям и источникам.
0
Эксперт .NET
 Аватар для Usaga
14792 / 9566 / 1367
Регистрация: 21.01.2016
Сообщений: 36,069
24.08.2021, 07:38
Цитата Сообщение от Regrin1 Посмотреть сообщение
Я уже жалею, что начал эту тему.
Подобные провокационные темы всегда заканчиваются срачем. Ничего другого вы в ней не могли увидеть по определению.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
24.08.2021, 07:43
Цитата Сообщение от Regrin1 Посмотреть сообщение
жалею, что начал эту тему
А какая изначальная цель была у темы?
0
Автор канал по Лиспу
 Аватар для Regrin1
25 / 23 / 2
Регистрация: 10.08.2021
Сообщений: 357
24.08.2021, 07:45  [ТС]
politoto,
Изначальной целью было выявить объективные минусы и область применения ООП, а не вот это вот...
0
Эксперт .NET
 Аватар для Usaga
14792 / 9566 / 1367
Регистрация: 21.01.2016
Сообщений: 36,069
24.08.2021, 07:51
Regrin1, "объективные" минусы?)
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
24.08.2021, 07:54
Модуль - многозначный инженерный термин,
а объект - философская категория.

Таким образом, без вот этого вот - никак.
0
Автор канал по Лиспу
 Аватар для Regrin1
25 / 23 / 2
Регистрация: 10.08.2021
Сообщений: 357
24.08.2021, 07:58  [ТС]
Usaga, Ну... Может и не совсем объективные, но во всяком случае проявляющиеся в определенных ситуациях.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
24.08.2021, 08:26
Тогда нужно рассмотреть конкретные примеры определённых ситуаций.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
24.08.2021, 09:02
Цитата Сообщение от Curry Посмотреть сообщение
и чем эти F# модули отличаются от ООП классов?
Тем что они описывают абстрактный тип, а не объект, и "связываются статически", поэтому конструктор (функция make) может входить в сигнатуру модуля, а конструктор объекта в интерфейс --- нет.
Кроме того, два типа Stack.t из раных модулей с совпадающими сигнатурами --- это разные типы, их значения нельзя поместить в один список, например, в отличие от двух объектов разных классов с одинаковыми интерфейсами.
Перепеши модуль Main с использованием объектного интерфейса.

Цитата Сообщение от Curry Посмотреть сообщение
Разве что тем, что для них не указывается какой интерфейс для них реализуется
Это не отличие. В Ocaml интерфейс объекта тоже не нужно явно указывать. Это практически полностью соответствует ООП по Кею: любому объекту можно послать любое сообщение, если он его поддерживает (отличие для обеспечения статической типизации).

Например

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
72
73
74
75
76
77
78
exception Empty_stack
 
class ['a] list_stack =
  object
    val mutable items : 'a list = []
 
    method push (x : 'a) =
      items <- x :: items
 
    method pop : 'a =
      match items with
      | [] -> raise Empty_stack
      | head :: rest ->
        begin
          items <- rest ;
          head
        end
 
  end
 
class ['a] array_stack =
  let grow_factor = 1.6
  and init_capacity = 10 in
 
  object (self)
    val mutable items : 'a option array = Array.make init_capacity None
    val mutable count = 0
 
    method push (x : 'a) =
      self#ensure_cap ;
      Array.set items count (Some x) ;
      count <- count + 1
 
    method pop : 'a =
      if count = 0
      then raise Empty_stack
      else
        count <- count - 1 ;
        match Array.get items count with
        | None   -> raise (Failure "unreachable")
        | Some x ->
          begin
            Array.set items count None ;
            x
          end
 
    method private ensure_cap =
      if count < Array.length items
      then ()
      else items <- self#grow
 
    method private grow =
      let old_cap = Array.length items in
      let new_cap = int_of_float (grow_factor *. float_of_int old_cap) in
      let dst = Array.make new_cap None in
      Array.blit items 0 dst 0 old_cap ;
      dst
 
  end
 
type 'a stack =
  < push : 'a -> unit
  ; pop  : 'a
  >
 
let main (make_stack : unit -> 'a stack) =
  let s = make_stack () in
  for i = 1 to 3 do
    s#push i
  done ;
  for i = 1 to 3 do
    s#pop |> Printf.printf "%d "
  done ;
  Printf.printf "\n"
 
let _ =
  main (fun () -> new list_stack) ;
  main (fun () -> new array_stack)
https://ideone.com/tgCMGc


Цитата Сообщение от Curry Посмотреть сообщение
так это минус
Нет, не минус.

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

F#
1
2
3
4
module List_stack : Stack =
  struct
    (* impl *)
  end
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
24.08.2021, 09:22
Цитата Сообщение от korvin_ Посмотреть сообщение
конструктор объекта в интерфейс --- нет
В Delphi конструкторы в интерфейсе класса, а не экземпляра, если я не ошибаюсь.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
24.08.2021, 10:36
Цитата Сообщение от politoto Посмотреть сообщение
В Delphi конструкторы в интерфейсе класса, а не экземпляра, если я не ошибаюсь.
Ага, но это два разных интерфейса. Delphi я уже смутно помню. В Java интерфейсы относятся только к объектам. Да и в C# тоже, насколько я знаю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.08.2021, 10:36

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
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