С Новым годом! Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 1
Регистрация: 23.04.2015
Сообщений: 26

Немного теории ООП

13.12.2015, 13:32. Показов 2350. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
ООП отражает поведение объектов реального мира.
Объект - набор данных, и методов для работы с ними.

Например, объекты: "Человек" и "Пиво"
C#
1
2
3
Пиво.open();
//или
Человек.open(Пиво);
В первом случае пиво открывает само себя, что не отражает реального поведения вещей.
Во втором случае методы для работы с объектом хранятся не в самом объекте.
Я понимаю, что в моих рассуждениях где-то ошибка.
Поясните, пожалуйста, где?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.12.2015, 13:32
Ответы с готовыми решениями:

Немного теории
Добрый день! На днях на одной из конференций по MSSQL, увидил немного интересное решение, обработки данных, есть две таблицы Города и...

Немного теории
хочу освоить немного openGL стал гуглить, сейчас в теме хочу прояснить для себя немного теорию. 1)glut - это просто "обертка",...

Немного теории
Доброго дня, форумчане! Пишу курсач на тему Системы программирования. Препод сказал, что у меня нет информации о видах систем...

33
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
13.12.2015, 14:13
Antonious
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Банка_Пива {
   открыть()
   {
       return Пиво;
   }
}
 
 
Человек {
    пить_пиво_из_банка(Банка_Пива x)
    {
        Я.пить_пиво(
            Банка_Пива.открыть()
        );
    }
 
личное пить_пиво(Пиво x);
}
1
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,876
13.12.2015, 15:41
Цитата Сообщение от Antonious Посмотреть сообщение
ООП отражает поведение объектов реального мира.
Не обязательно. Это всего лишь способ организации кода.
Каждый класс создаётся не "потому что это соответствует объекту реального мира", а с какой-то конкретной целью. При этом не страшно, даже если банка пива выпивает человека .
2
 Аватар для snake32
3504 / 1687 / 236
Регистрация: 26.02.2009
Сообщений: 8,409
Записей в блоге: 6
23.12.2015, 11:57
Shamil1, какой смысл банке открывать и выпивать человека если это не соответствует действительности? Боюсь представить дальнейшее развитие/эволюцию подобных классов. Сколько ещё не очевидных методов/полей появится в банке с пивом? И как потом разобраться в этом коде? А если код будет смотреть сторонний разработчик? Что может он подумать об авторе кода?
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
23.12.2015, 12:37
Возможно, Shamil1 хотел сказать «банка пива выпивается человеком».

Схема субъект-действие-объект, конечно, напрямую склоняет нас наделить субъекта возможностью совершать действие над объектом. Но уже случай, когда агенс не совпадает субъектом, встречается с проблемой определения, кто является носителем действия. Ещё есть случаи, когда несколько объектов совершают групповое действие друг к другу (например, два тела разной природы отталкиваются — кто выступает в роли носителя действия?).

Инструменталистский взгляд «делаем так, потому что нам так удобнее организовывать код» лишает необходимости решать все вышеобозначенные проблемы и даже думать о них. И в этом свете банка пива тогда начинает открывать человека, когда такое архитектурное решение оказывается более простым и очевидным, чем любое другое; в противном же случае не пиво открывает человека, а человек — пиво.
1
 Аватар для snake32
3504 / 1687 / 236
Регистрация: 26.02.2009
Сообщений: 8,409
Записей в блоге: 6
23.12.2015, 13:26
Цитата Сообщение от Mysterious Light Посмотреть сообщение
два тела разной природы отталкиваются — кто выступает в роли носителя действия?
Может третий элемент системы - природа/физический движёк?
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
23.12.2015, 13:57
Как-то я вынужден был тесно столкнуться с семантическими сетями и был удивлён, что после длительных рассуждений о типах связей (ISA, IKA etc) и прочей логике поступало предложение отказаться от сети как графа с помеченными дугами в пользу двудольного графа из объектов и действий/свойств, где каждое действие/свойство соединено помеченными (ролью объекта) ребрами с объектами, которые вступают в указанное действие или обладают свойством. Например, переход от Кот---есть--->Животное к Кот---вид-->бытие-кота-как-животного<---род---Животное

Ваше предложение ввести среду является по сути предложением перехода к такому представлению, когда взаимодействующие объекты уравниваются в правах, а субъектом становится среда.

Последовательно продолжая рассуждения, естественно спросить, а почему носителем действия открывания/выпивания пива является человек, а не природа, которая открывает/выпивает пиво человеком? Чем взаимодействие человек-пиво принципиально отличает от взаимодействия других двух разнородных объектов?
0
 Аватар для snake32
3504 / 1687 / 236
Регистрация: 26.02.2009
Сообщений: 8,409
Записей в блоге: 6
23.12.2015, 14:59
Цитата Сообщение от Mysterious Light Посмотреть сообщение
когда взаимодействующие объекты уравниваются в правах, а субъектом становится среда.
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Чем взаимодействие человек-пиво принципиально отличает от взаимодействия других двух разнородных объектов?
Наверное, отличие в том, что человек и пиво не равны в правах.
Как Вы определяете равенство/неравенство прав?
0
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,876
23.12.2015, 16:19
snake32,
Вы предлагаете ориентироваться на схему "субъект-действие-объект". Но:
1. Это неоднозначно (поезд везёт человека или человек едет на поезде? спички промокли или [вода] намочила спички?)
2. Это в общем случае зависит от языка (снег идёт или [оно] "снежит"?)
3. Это часто неудобно (поэтому шаблоны типа "активная запись" выходят из употребления)
4. Это в принципе неверно, так как это реакция типа "почему - потому что", а целесообразно использовать реакцию типа "зачем - для того чтобы".


Рассмотрим пример с пивом.
Вы считаете очевидным добавить объекту "Человек" метод "Выпить(Пиво)". Но к чему это приведёт? Теперь класс "Человек" требует ссылки на класс "Пиво". И страница для детского сада, которая использует класс "Человек", требует ссылки на "Пиво".
Вариант добавить объекту "Пиво" метод "Выпить(Человек)" (или лучше назвать его "Выпиться"?) на первый взгляд будет более лучшим решением. Но это решение мне тоже не нравится.
Но лично я предпочту сделать специальный класс-службу "Пятница!" с методом "Выпить(Человек,Пиво)". И если вдруг выяснится, что в каких-то случаях часть методов этого класса не используется и при этом требует дополнительных ссылок, я всегда могу разделить эту службу на две.
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,764
23.12.2015, 21:53
Цитата Сообщение от Shamil1 Посмотреть сообщение
Но лично я предпочту сделать специальный класс-службу "Пятница!"
И не забудь обобщённую абстрактную фабрику.

Цитата Сообщение от Shamil1 Посмотреть сообщение
с методом "Выпить(Человек,Пиво)". И если вдруг выяснится, что в каких-то случаях часть методов этого класса не используется и при этом требует дополнительных ссылок, я всегда могу разделить эту службу на две.
Уже давно придумали мультиметоды, кстати. Правда, не везде они есть, ну да ладно.

Цитата Сообщение от Shamil1 Посмотреть сообщение
Рассмотрим пример с пивом.
Вы считаете очевидным добавить объекту "Человек" метод "Выпить(Пиво)". Но к чему это приведёт? Теперь класс "Человек" требует ссылки на класс "Пиво". И страница для детского сада, которая использует класс "Человек", требует ссылки на "Пиво".
Вариант добавить объекту "Пиво" метод "Выпить(Человек)" (или лучше назвать его "Выпиться"?) на первый взгляд будет более лучшим решением. Но это решение мне тоже не нравится.
Это делают не так. Это делают, например, так:

Objective-C
1
2
[Человек пить:Жидкость]
[Пиво получитьЖидкость]
т.е.

Objective-C
1
[Человек пить:[Пиво получитьЖидкость]]
Хотя я не понимаю, почему Пиво не унаследовано от Жидкость? Если же имелась в виду банка/бутылка пива, например, то возвращаемся к моему примеру.

А тем, кому не понятно, как это пиво само себя открывает, напомню, что программирование служит для моделирования, при котором мы абстрагируемся от реальности. Есть разные подходы к организации программ. В Ъ-ООП, например, "всё есть объект", у объектов есть поведение. Поэтому даже у камней получается какое-то поведение.

Кого это смущает (что, вообще-то, правильно), может сделать две вещи:
1) вспомнить, что ООП --- это не религия, а инструмент, и использовать его для камней и бутылок пива, пользуясь некоторыми плюшками, типа динамической диспетчеризации, наследования, модульности.
2) снова вспомнить, что ООП --- это не религия, и его не обязательно использовать везде, где можно и нельзя, нужно и не нужно.
0
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,876
24.12.2015, 00:59
Цитата Сообщение от korvin_ Посмотреть сообщение
Уже давно придумали мультиметоды, кстати.
Как мультиметоды могут мне помочь в данной ситуации?
У меня есть библиотека (dll), в ней один класс с двумя методами. Я пришёл к выводу, что очень часто в проекте используется только один из этих методов, и вынес эти два метода в разные классы и в разные библиотеки (dll). Как мне сюда прикрутить мультиметоды?

Цитата Сообщение от korvin_ Посмотреть сообщение
Это делают не так.
Цитата Сообщение от korvin_ Посмотреть сообщение
[Человек пить:[Пиво получитьЖидкость]]
А если мне не всё равно, какую жидкость пить?

Цитата Сообщение от korvin_ Посмотреть сообщение
почему Пиво не унаследовано от Жидкость?
В данном случае это не имеет значения. Вопрос был в том, в каком классе (модуле) находится реализация взаимодействия Человека с Пивом.
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
24.12.2015, 02:00
Цитата Сообщение от Shamil1 Посмотреть сообщение
А если мне не всё равно, какую жидкость пить?
Тогда берём Человека с методом пить(Жидкость), от него наследуем Пьяницу, у которого определяем метод питьПиво(Пиво), который, правда, должен удовлетворять условию
Java
1
пьяница.питьПиво(пиво) = ((Человек)пьяница).пить((Жидкость)пиво)
Забыл, как такой паттерн называется. Вроде, прокси.
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
24.12.2015, 09:49
Мне кажется, у вас фундаментально неверное представление о методах, что и порождает сложности в описании объектов. Метод -- это не действие, которое может совершить объект.
Метод -- это какой-то внешний сигнал, который объект может воспринимать, или действие которое можно совершить над объектом.
Является ли процесс пить_пиво методом внутри объекта человек? Ответ заложен в том, к каким последствиям, к каким изменениям, если хотите, ведёт этот процесс. Если человек выпивая пиво изменяется, у него появляется новое внутреннее состояние, то это, несомненно, метод объекта человек, потому что будет совершено действие над человеком. Банка пива, когда её открывают, тоже меняется: она отдаёт своё пиво и становится пустой, -- потому метод открыть принадлежит банке, а не человеку.

Если человек открывает банку и возвращает её, причём контракт гарантирует неизменность человека в этом процессе, то такое действие уже никак не является методом человека. Это совершенно отдельный объект.
1
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,876
24.12.2015, 11:04
Mysterious Light,
Варианты с наследованием не проходят. "Человеки" могут отличаться не только тем, что одни пьют Пиво, а другие - нет. Таких отличий может быть много, а множественное наследование привело бы только усложнению кода без видимых плюсов.

Добавлено через 14 минут
mporro,
Интересный подход. Выглядит более логичным, чем "сравнение с действительностью". Но тем не менее...
Если придерживаться данного подхода, то вместо добавления в мой класс метода ToString(), мне следует в класс String добавить новый конструктор, принимающий экземпляр моего класса. Конечно, данный пример несколько "простоват", но можно придумать и более "тонкие" примеры.
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
24.12.2015, 12:28
Цитата Сообщение от Shamil1 Посмотреть сообщение
Интересный подход.
Подход Бертрана Мейра.

Что касается изменений, и методов, которые изменяют наши объекты, то они нужны, чтобы полностью определить алгебру наших объектов.
# Пусть необходимо описать объекты алгебры https://www.cyberforum.ru/cgi-bin/latex.cgi?\mathfrak{A} и у нас есть набор конструкторов наших объектов, с помощью которых мы можем получить некоторое подмножество объектов https://www.cyberforum.ru/cgi-bin/latex.cgi?A\subseteq \mathfrak{A}. Тогда методы-команды -- это минимальный набор методов, такой что замыкание https://www.cyberforum.ru/cgi-bin/latex.cgi?\bar{A} над этими методами есть https://www.cyberforum.ru/cgi-bin/latex.cgi?\mathfrak{A}. Минимальный означает, что удаление любого метода из набора приводит к тому, что https://www.cyberforum.ru/cgi-bin/latex.cgi?\bar{A}\neq\mathfrak{A}.

Однако такие объекты, которые успешно преобразовываются друг в друга, это, зачастую, не то, чего бы нам хотелось. Если у нас есть таинственный компьютер с тремя кнопками, мы, конечно, можем их нажимать, только от этого будет мало пользы. Чтобы польза была, важно иметь средства перцепции таинственного чёрного ящика на понятном нам уровне. Для этого мы снабжаем объекты методами-запросами.
# Методами-запросами назовём минимальный необходимый набор методов, позволяющий в рамках предметной области полностью описать возможные преобразования внутреннего состояния объекта в другие объекты. Здесь важно то, что методы-запросы непосредственно завязаны на внутренне состояние. Если какой-либо метод-запрос не использует внутреннее состояние -- следует вычеркнуть его из класса. Если какой-либо метод запрос может быть выражен как композиция других методов-запросов, его следует вычеркнуть.


Так что нет никакой необходимости заводить методы в класс строки. Там хранятся методы для преобразования между строками (минимальный набор) и свои методы преобразования строки понятному виду, к байтовому массиву, например, и числу, определяющему кодирования символов.
А у человека есть метод to_string(), с помощью которого мы как раз и выясняем пил он пиво или нет, или возможно пил, но не так много, чтобы отнять права.
1
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,876
24.12.2015, 13:46
mporro,
А куда поместить методы:
- transfer(A a, B b) // меняет оба объекта
- calculate(A a, B b) // не меняет ни один из объектов
- validate(A a) // не меняет объект
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
24.12.2015, 14:48
Цитата Сообщение от Shamil1 Посмотреть сообщение
куда поместить методы
Всё зависит от конкретной системы...
Но скорее всего, все три случая не описывают методы, а описывают действия, которые должны быть выражены объектами.
Например так:
C#
1
2
3
4
5
6
class A {
}
 
class ValidA extends A {
    public ValidA(A any);
}
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,764
25.12.2015, 21:00
Цитата Сообщение от Shamil1 Посмотреть сообщение
Как мультиметоды могут мне помочь в данной ситуации?
Так, что не надо думать
Цитата Сообщение от Shamil1 Посмотреть сообщение
куда поместить методы:
- transfer(A a, B b) // меняет оба объекта
- calculate(A a, B b) // не меняет ни один из объектов
- validate(A a) // не меняет объект
--- К.О.

Цитата Сообщение от Shamil1 Посмотреть сообщение
А если мне не всё равно, какую жидкость пить?
Выясняешь свойства жидкости и принимаешь решение. Не нужно впадать в крайность и завязывать всё на иерархию классов и методы.

Цитата Сообщение от Shamil1 Посмотреть сообщение
Вопрос был в том, в каком классе (модуле) находится реализация взаимодействия Человека с Пивом.
В случае с мультиметодами, ответ: в модуле "питьё", например. Не в смысле базовом классе "Жидкость", а в третьем, по отношению к (Человеку и прочим животным) и (Пиву и прочим жидкостям) модуле.
0
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,876
26.12.2015, 02:16
Цитата Сообщение от korvin_ Посмотреть сообщение
В случае с мультиметодами, ответ: в модуле "питьё", например.
То есть, пиво знает, что ему делать с человеком?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,764
26.12.2015, 12:09
Цитата Сообщение от Shamil1 Посмотреть сообщение
То есть, пиво знает, что ему делать с человеком?
Нет. При чём тут Пиво? модуль "питьё" означает действие, а не базовый класс для жидкостей, я же написал.

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
;;; Animals
 
(defclass animal () (...))
 
...
 
(defclass human (animal) (...))
 
; alcoholic-mixin
(defclass alcoholic () ())
 
(defclass alcoholic-human (humal alcoholic) (...))

Lisp
1
2
3
4
5
6
7
;;; Liquids
 
(defclass liquid () (...))
 
...
 
(defclass beer (liquid) (...))

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
;;; Drinking
 
(defgeneric drink (subject object))
 
...
 
(defmethod drink ((subject human) (object t))
  (error "WTF? I can not drink that!"))
 
(defmethod drink ((subject human) (object liquid))
  (print "Hm... It looks drinkable..."))
 
(defmethod drink ((subject human) (object water))
  (print "Nice .."))
 
(defmethod drink ((subject human) (object beer))
  (error "I'm not an alcoholic!"))
 
(defmethod drink ((subject alcoholic-human) (object beer))
  (print "At last!.."))
 
...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.12.2015, 12:09
Помогаю со студенческими работами здесь

немного теории
Очень долго искал в инете определение методу Итерации чтоб так сказать было разжеванно но не нашел кто поможет дать ему определение на...

немного теории
Здравствуйте, проверьте пожалуйста мои ответы. Я тут выбрала...надеюсь верно. 1 Укажите верное утверждение? -Функция LIST...

Немного теории
Здравствуйте, ребята! Такой вопрос: У меня есть свой сайт. На нем я хочу подключить снег. Для запуска снега используется функция да и...

Немного теории
Ребятушки, поясните пожалуйста в этом кусочке: (tail (cdr val))) (if (null val) () `(let ((,stat...

Немного о теории
Впервые мне попалась такая постановка задачи: создать класс ru.qwerty.vova.ivan.Main , который имплементирует интерфейс...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru