@oop_ru

Страница 150 из 785
Ilia
12.03.2017
23:18:53
принцип инкапсуляции в изолировании методов и свойств от других методов и классов; а чтобы получить доступ к методу класса, нужно поместить его в строго определяемый публичный метод этого класса?

я схоронил как-то сообщение @fes0r про порядок изучения: 1. Инкапсуляция 2. Закон Деметры 3. Полиморфизм 4. LSP 5. OCP 6. ISP 7. DIP 8. Coupling/cohesion 9. GRASP 10. GoF 11. P of EEE

вник в деметру, то есть у деметры недостаток в моем последнем предложении

деметра - обратное от наследования(хотя является его производным)

Google
Ilia
12.03.2017
23:20:16
паттерн синглтон частично нарушает деметру?

Ilia
12.03.2017
23:31:34
сложная формулировка)
как-то дошел до этого же

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

Ilia
12.03.2017
23:33:20
чта?
пример на php.su/learnphp/phpoo/?cp

ак оно на самом деле и есть. Функция, переопределяемая в производном классе, называется виртуальной

Sergey
12.03.2017
23:34:13
ну ты рассматриваешь конкретную реализацию а не концепцию

с концептуальной точки зрения следует вообще забить на то как происходит диспетчеризация

ну то есть как ты добиваешься того что бы по определенной сигнатуре вызывался нужный метод конкретного класса - это все как бы детали. Суть то в том что тебе не должно быть дела кто принимает сообщение (вызов метода по простому)

Ilia
12.03.2017
23:35:51
с концептуальной точки зрения следует вообще забить на то как происходит диспетчеризация
то есть неважно как это происходит, по сути как работа с обычными переменными, нужно следить за тем что есть и порядок вызова?

Google
Ilia
12.03.2017
23:36:36
Sergey
12.03.2017
23:36:52
ну я пока не улавливаю ход твоих мыслей)

Ilia
12.03.2017
23:38:08
ну я пока не улавливаю ход твоих мыслей)
дайте мне два класса и наглядный пример

Sergey
12.03.2017
23:38:27
Ilia
12.03.2017
23:38:43
пример полиморфизма?
да, и объяснить что произощло

Sergey
12.03.2017
23:38:57
драйвера для устройств ввода/вывода

один интерфейс (табличка функций) и множество реализаций

клиенту плевать кто будет обрабатывать запросы

(клиент это код который использует функции)

или там stdout/stdin процесса. Ты имеешь дело с абстракцией - потоки ввода/вывода. Но куда они пишут тебе как бы плевать

это что бы совсем абстрогироваться от классов и прочего булшита)

Ilia
12.03.2017
23:40:52
если очень грубо: использование метода неважно где?(и необязательно в дочернем?)

Sergey
12.03.2017
23:41:05
выкинь наследование из этого уравнения.

Ilia
12.03.2017
23:41:36
если очень грубо: использование метода неважно где

Sergey
12.03.2017
23:41:42
просто в большинстве языков наследование это единственный способ добиться полиморфизма подтипов

Sergey
12.03.2017
23:42:05
если очень грубо: использование метода неважно где
ну тип того. У тебя есть какой-то объект и ты шлешь ему сообщения с определенной сигнатурой. А кто будет обрабатывать сообщение - не важно.

какой бы пример привести.... ну например - у тебя есть клиент и сервер. Они шлют друг другу сообщения.

Google
Sergey
12.03.2017
23:42:51
если ты поставишь между ними кеширующий мидлварь, клиент об этом даже не узнает.

Ivan
12.03.2017
23:44:10
представь что ты водила. у тебя есть 2 тачки Феррари и Лада Седан они оба реализуют интерфейс Тачка с методом погнали тебе как водиле | клиенту абсолютно похер что там и как едет ты лишь дергаешь метод поехали который был реализован

Sergey
12.03.2017
23:44:13
ну я пытаюсь подбирать примеры максимально оторванные он языков программирования, что бы была понятна суть

Ilia
12.03.2017
23:45:09
я ведь в итоге что-то получу(что неважно)

Ivan
12.03.2017
23:45:12
проще говоря приведение к одному интерфейсу

Sergey
12.03.2017
23:45:15
ну мол поясни что ты подразумаваешь под порядком

Ilia
12.03.2017
23:46:07
ммм, ну второй раз "определяя" этот метод я могу получить другой ответ?

Sergey
12.03.2017
23:46:26
Ilia
12.03.2017
23:46:57
и тут приходит такая штука как LSP
падаждите падаждите, у меня записана

Sergey
12.03.2017
23:46:58
если у тебя есть две реализации одного интерфейса, система не должна заметить что мы "подставили" другую реализацию вместо прежней

потому принцип и называется "принципом подстановки"

Sergey
12.03.2017
23:47:39
Да! этого клиент и не заметит?
да, он получит то же что и получил бы раньше. Просто возможно другим способом, но нам это не интересует

мне нужно загуглить LPS
эта штука напрямую завязана на концепции абстракции и полиморфизма

Ilia
12.03.2017
23:48:28
да, он получит то же что и получил бы раньше. Просто возможно другим способом, но нам это не интересует
а, ну и зшбс, если честно не хочу на этом зацикливаться, потому что даже легко прозвучало, так как не стоит заморачиваться

Sergey
12.03.2017
23:49:15
а, ну и зшбс, если честно не хочу на этом зацикливаться, потому что даже легко прозвучало, так как не стоит заморачиваться
идея в том что у тебя есть некие объекты (это не обязательно "инстансы классов", например есть erlang где ты под объектом вполне можешь подразумевать микротред)

Google
Ilia
12.03.2017
23:49:18
да, он получит то же что и получил бы раньше. Просто возможно другим способом, но нам это не интересует
может быть так, что название функции одно и тоже, но исполнение во втором случае будет отличным от первичного?(или это нарушает концепцию?)

Sergey
12.03.2017
23:49:28
и объекты имеют контракты того как они обрабатывают сообщения и что возвращают

то есть тут нет полиморфизма)

Sergey
12.03.2017
23:50:44
просто разные методы совсем разных объектов

Sergey
12.03.2017
23:50:58
полиморфизм это когда поведение не меняется

меняется реализация

Ilia
12.03.2017
23:51:19
меняется реализация
получаю доступ немного иначе?

Admin
ERROR: S client not available

Sergey
12.03.2017
23:51:30
ну смотри, у тебя есть интерфейс Filesystem и у него есть метод readFile: File

Sergey
12.03.2017
23:52:37
и есть у тебя реализации аля LocalFilesystem и S3Filesystem

каждая из которых как возвращала тебе FIle так и будет возвращать.

разница лишь в том что в первом случае мы через простой fopen будем открывать стрим на чтение, а во втором лазать по сети и скачивать например файл в in-memory буфер какой

то есть так и так получим стрим на файл

Google
Sergey
12.03.2017
23:54:03
стандартизация?
что-то в этом духе. "Абстракция" скорее. Когда ты абстрагируешься от деталей.

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

Ilia
12.03.2017
23:55:05
то есть получим тот же результат но допустим в "якобы"(отличающемся способе) от предыдущего без танцев с бубном(без доп. обработчика после использования метода)

Ilia
12.03.2017
23:55:32
все, я понял

:D

Sergey
12.03.2017
23:55:48
но это если что только полиморфизм подтипов

есть еще параметрический полиморфизм) и ad-hoc полиморфизм)

Ilia
12.03.2017
23:56:07
это еще что за дичь

Sergey
12.03.2017
23:56:39
https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BF%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC

Ilia
12.03.2017
23:56:51
уже чттаю

Sergey
12.03.2017
23:58:41
если кратко "параметрический полиморфизм" это дженерики всякие и шаблоны

а ad-hoc полиморфизм - это перегрузка методов например

Ilia
12.03.2017
23:59:10
могу захреначить каким-то боком кучу всего в один массив и отдать его кому-то другому разбираться например?

Ilia
12.03.2017
23:59:43
а ad-hoc полиморфизм - это перегрузка методов например
перегрузку уже где-то слышал, это пооисходит один раз с созданным объектом?

эм.... нипонял)
полиморфный тип: могу взять разные типы данных и поместить в массив(как пример)

квалифицированный... чет адское

Sergey
13.03.2017
00:01:58
перегрузку уже где-то слышал, это пооисходит один раз с созданным объектом?
не не... это когда у тебя 2 метода имеющих разные сигнатуры (разные аргументы) делают одно и то же. И тип в рантайме выбирается реализация исходя из сигнатуры сообщения. Пример - ну например тебе надо сумма. И ты можешь 2 аргумента иметь, можешь три, можешь массив чисел... результатом будет число. И у тебя будет три метода с одним и тем же названием но разными сигнатурами. add(a: int, b: int): int; add(a: int, b: int, c: int): int; add(numbers: int[]): int;

в языках типа Objective-C всяких прикольно это реализовано

Ilia
13.03.2017
00:02:52
приведение к одному типу?

Sergey
13.03.2017
00:03:09
ну мол там у тебя add With a With b, add With a With c With c

а не просто add

Страница 150 из 785