@oop_ru

Страница 449 из 785
Sergei
13.01.2018
01:54:55
И вроде в Pyhton

da horsie
13.01.2018
01:54:56
тааак

Sergei
13.01.2018
01:55:11
И подозреваю что в JS

Метод класса (static) - он по логике своей реализует поведение не отдельного экземпляра, а класса объектов в целом.

Google
da horsie
13.01.2018
01:57:07
interface Named { toName(): string; } class Vasya implements Named { toName() {return 'Vasya';} } ... function register(Named person) { registry.add(person.toName()); }

у васи надо метод сделать статическим?

если да,то как быть с функцией register()?

наверно фиговый пример с людьми

но не важно

пусть не люди будут, а что-нить другое

Sergei
13.01.2018
02:08:24
interface Named { toName(): string; } class Vasya implements Named { toName() {return 'Vasya';} } ... function register(Named person) { registry.add(person.toName()); }
Из этого кода явно следует, что разные экземпляры Named вообще говоря имеют разные имена (и из кода register явственно следует, что регистрируются не классы, а именно инстансы).

Sergei
13.01.2018
02:09:30
Соответственно было бы очень странно делать метод static (который как раз говорил бы обратное)

da horsie
13.01.2018
02:09:38
это попадает в категорию "достаточная причина не делать статик"?

заменим toName() на toRace(), чтобы было ближе к сути

а registry пусть будет "перепись населения"

Google
Sergei
13.01.2018
02:11:29
это попадает в категорию "достаточная причина не делать статик"?
Разные экземпляры вообще говоря имеют разные имена -> значит метод вообще говоря требует знать экземпляр/this и без этого не работает. Значит мы никак не можем сделать его static :(

da horsie
13.01.2018
02:12:15
а не только техническая независимость от this

Sergei
13.01.2018
02:13:34
Мммм можно ли сказать что вот это и было бы выражением семантики, "разные экземпляры вообще говоря..."?

da horsie
13.01.2018
02:13:44
ну да

потому что мы начинаем говорить о смысле тех объектов, которые мы описываем

Sergei
13.01.2018
02:14:16
?

da horsie
13.01.2018
02:14:42
и компилятор этой семантики не знает

если вернуться к статье, наверно этот случай попадает в категорию "виртуальные методы"

ибо часть интерфейса

Sergei
13.01.2018
02:17:07
Угу, мне тоже так кажется. Ибо есть зависимость от состояния объекта (и this - как "физическое проявление" этой зависимости).

da horsie
13.01.2018
02:17:26
такой зависимости нет

т.е. из кода класса она не следует

Sergei
13.01.2018
02:17:38
А у тебя кроме Vasya есть ещё и Petya, Sasha и т.д.?

da horsie
13.01.2018
02:17:44
ну да

а есть еще Оля, у которй результат зависит от фазы луны

вася и петя - неправильные названия классов, это должны быть названия экземпляров

Sergei
13.01.2018
02:18:57
И у каждого Petya, Sasha та же песня - метод на _все_ экземпляры возвращает одно и то же (у всех скажем экземпляров Sasha вернёт "yo!"?)

da horsie
13.01.2018
02:20:33
с людьми неудачный пример

Google
da horsie
13.01.2018
02:21:41
пусть будет getGender()

и классы каких-нить лягушек

смысл в том, что есть штуки, у которых свойство задано

оно не меняется

Sergei
13.01.2018
02:23:50
Меня в приведённом выше примере кода смущает в целом только вот что - ты вроде как регистрируешь _экземпляры_ класса, т.е. как будто они все могут давать разные результаты. Но из кода самого класса Vasya выглядит так, как будто разные результаты могут быть только у разных _классов_ (а не экземпляров). В этом месте вопрос - а почему тогда мы не регистрируем сами классы?

da horsie
13.01.2018
02:23:52
но является частью интерфейса

потому что оно не всегда зависит от класса (привет Оле)

Sergei
13.01.2018
02:25:35
:)

потому что оно не всегда зависит от класса (привет Оле)
Тогда как мне кажется "всё правильно сделал" - ну то есть "вообще говоря" зависимость от экземпляра таки существует, хотя в некоторых случаях (типа Васи, который не особо зависит от циклов Луны) эта зависимость вырожденная. Регистрируем экземпляры, метод принимает this (может неявно - зависит от языка).

da horsie
13.01.2018
02:28:56
ну например, у меня в проекте есть такая штука как именованные ссылки, они являются частью агрегата. в каких-то местах могут использоваться ссылки с определенными именами, в каких-то с произвольными. Поэтому есть интерфейс Link, а есть SelfLink implements Link, это ссылка с именем Self.

и допустим, в документе можно юзать только ссылки с именем self и related. Поэтому class SelfLink implements Link, DocumentLink

можно было бы делать if (link.name !=...) throw new Foo, но зачем нам if если есть полиморфизм

Sergei
13.01.2018
02:57:44
можно было бы делать if (link.name !=...) throw new Foo, но зачем нам if если есть полиморфизм
А можно ли как-то так: // положим есть список допустимых типов ссылок в данном документе ["а", "б", "х"] ... ... link.throwIfIncompatibleWith(["а", "б", "х"]); ... ...

Мягкий вариант: ... ... if (! link.compatibleWith(["а", "б", "х"]) throw BadLinkType(link); ... ...

andretshurotshka?❄️кде
13.01.2018
04:47:34
8 лет пишу без свитчей

da horsie
13.01.2018
04:47:49
вот и я решил поэкспериментировать

andretshurotshka?❄️кде
13.01.2018
04:47:50
брат жив

da horsie
13.01.2018
04:48:04
минимизировать количество if

Google
andretshurotshka?❄️кде
13.01.2018
04:48:13
Просто экспекшены не нужны

Sergei
13.01.2018
05:08:24
все равно if ;)
Оооок, передавай лямбду :) ... ... link.executeWhenIncompatibleWith(["а", "б", "х"], ()->throw new BadLink()) ... ...

andretshurotshka?❄️кде
13.01.2018
05:08:32
Лол

Ilia
13.01.2018
05:56:40
да в любом. Когда их применение оправдано? Когда они - единственный способ?
Когда тебе нужна просто функция, а засорять глобальное постановление имён не хочется.

вот! зачем?
Чтобы иметь возможность вызвать этот метод без предварительного создания объекта

В php можно вообще всё делать, там полная свобода.
В рамках обсуждения ООП говорить о PHP даже как-то смешно... Ты бы ещё про bash рассказал...

da horsie
13.01.2018
06:06:33
если мне нужна просто функция, я сделаю просто функцию

Ilia
13.01.2018
06:11:25
interface CallableByName { toName(): string; }
У тебя же это интерфейс, там не может быть по определению static методов, потому что интерфейс всегда вызывается через какой-то объект

da horsie
13.01.2018
06:13:00
так зачем нужны статические методы? если не брать в расчет аргумент "в языке X статические методы это способ сделать Y, для которого нативное решение отсутствует в силу ограничения языка" (свободную функцию, именованный конструктор, итд)

Ilia
13.01.2018
06:16:47
в большинстве языков this передается неявно, сигнатура снаружи не меняется
Ты неправ в большинстве языков объект передается при вызове ЯВНО, указывается программистом в выражении вызова метода, он только в сам метод передается через неявный аргумент.

Google
Ilia
13.01.2018
06:18:55
Артур Евгеньевич
13.01.2018
06:19:11
Ахах ?

da horsie
13.01.2018
06:19:30
да как угодно

Ilia
13.01.2018
06:20:41
А что так рассмешило?
Я понял, ты мне сейчас будешь доказывать, что PHP -это язык программирования, и даже более того, что это ООП язык...

Артур Евгеньевич
13.01.2018
06:22:16
Я понял, ты мне сейчас будешь доказывать, что PHP -это язык программирования, и даже более того, что это ООП язык...
Нет конечно. Язык программирования - это то на чем программировать можно. А на пхп разве написано хоть что то?

Ilia
13.01.2018
06:22:27
const main = (args: string[]):int = () => 0 как-то так, например
Ну это ты лямбду написал, как я понимаю, это же свободная функция, не метод и не нестатический член класса, так?

Ilia
13.01.2018
06:25:09
Нет, это сылка на неё именована, а не сама функция

da horsie
13.01.2018
06:25:13
предположим в языке есть просто функции. и функции высшего порядка. и неймспейсы и/или импорт/экспорт

блин, ну не важно

в контексте ооп - какая причина есть для существования статических методов?

Ilia
13.01.2018
06:26:58
так
Ну вот ты же не написал для main класс, метод класса и так далее. Соответственно, ты даже интуитивно понимаешь, что есть случаи, когда классы и методы нужны, а есть когда они просто не нужны

Соответственно, вот это и есть причина существования статических методов
Если тебе класс и метод не нужны, тебе даётся возможность их не использовать

Ilia
13.01.2018
06:30:04
предположим в языке есть просто функции. и функции высшего порядка. и неймспейсы и/или импорт/экспорт
Если есть свободные функции то статические методы во многом могут быть ими заменены, но в некоторых языках типа Явы таких вещей просто нет !

что "это"?
То, что тебе классы и методы не всегда нужны

da horsie
13.01.2018
06:31:22
то есть еднственная причина - когда статические функции это костыль, потому что в языке нет возможности сделать иначе, так получается?

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