metaclass: (дзедline)
metaclass ([personal profile] metaclass) wrote2013-03-13 10:40 am

ООП потиху закапывают

http://avva.livejournal.com/2581700.html
Все, что было полезного в ООП, унесли в другие парадигмы (если оно раньше еще оттуда не было заимствовано), остальное решили закопать :)

[identity profile] xeno-by.livejournal.com 2013-03-13 09:36 am (UTC)(link)
это не про то (типы != классы). гляньте паперу Одерского "Nested Types" (http://lampwww.epfl.ch/~odersky/papers/fool01.ps, там матан только в аппендиксе) или вот бложек Спивака: https://www.precog.com/blog-precog-2/entry/existential-types-ftw (ту часть, где type User <: UserLike).
Edited 2013-03-13 09:39 (UTC)

[identity profile] xeno-by.livejournal.com 2013-03-13 09:43 am (UTC)(link)
приношу извинения за неточную формулировку. более точно вместо "вложенные в неймспейсы" было бы сказать "вложенные в модули".

здесь просто очень важно, что контейнер - первоклассная сущность (т.е. его можно передавать в функции, возвращать из функций, можно делать if (blah) module1 else module2). обычная коннотация слова "неймспейс" это что-то второсортное вроде пакета в жабе или неймспейса в шарпе или плюсах, а это начисто убивает всю соль задумки.

в чем собственно задумка? это описано по ссылкам в родительском каменте: http://metaclass.livejournal.com/788219.html?thread=16796923#t16796923
Edited 2013-03-13 09:45 (UTC)
(deleted comment)

[identity profile] xeno-by.livejournal.com 2013-03-13 10:06 am (UTC)(link)
type User из примера выше нигде не используется по полностью квалифицированному имени. в чем именно заключается проблема?
(deleted comment)

[identity profile] metaclass.livejournal.com 2013-03-13 10:58 am (UTC)(link)
new вызывать же запрещено, это tight coupling.
Лучшие погонщики индусов приказывают в этом случае создавать и явно ссылаться на внутренние классы только внутри их контейнеров, где имя короткое. А снаружи за нас вывод типов пусть думает.
(deleted comment)

[identity profile] xeno-by.livejournal.com 2013-03-13 11:12 am (UTC)(link)
Главное - сокрытие деталей реализации. В жабе или шарпе с интерфейсами это получается очень многословно, но в Скале есть лучший способ, который не требует набивания текста более необходимого. Опять же, гляньте линку.
(deleted comment)

[identity profile] xeno-by.livejournal.com 2013-03-13 12:29 pm (UTC)(link)
Есть импорты так же как и везде, но см. мой ответ ниже.

[identity profile] metaclass.livejournal.com 2013-03-13 11:14 am (UTC)(link)
Насколько я понимаю, в скале объявлять явно типы переменных вообще мало где нужно.

По идее, в параметрах методов могут быть такие проблемы, но методы либо живут там же где и типы, либо работают с супертипами вроде общих трейтов (и живут в этих же трейтах).

Т.е. вариант "модуль А ссылается на глубоко внутренние типы модуля B по полному пути" - это скорее всего, плохо разложили код по модулям, такого в норме быть не должно.

[identity profile] xeno-by.livejournal.com 2013-03-13 11:10 am (UTC)(link)
Почитайте ссылку все-таки. Юзер из примера не предназначен для инстанциации извне по своему имени (поэтому я и написал, что тип != класс), а служит для описания контракта модуля.
(deleted comment)

[identity profile] xeno-by.livejournal.com 2013-03-13 11:14 am (UTC)(link)
Получается, мы пришли к консенсусу, что есть разные виды вложенности типов, некоторые из которых не приводят к аду?
(deleted comment)

[identity profile] xeno-by.livejournal.com 2013-03-13 12:35 pm (UTC)(link)
Контракт в том примере публично виден.

Но "извне" это растяжимое понятие. В Скале есть способ собирать большие модули из небольших кусочков. При этом каждый из кусочков, несмотря на то, что определен отдельно от других (возможно, даже в другом пакете), логически находится в одной песочнице вместе со своими зависимостями (называется cake pattern). Как следствие, для значительной части кода ада вложенности не существует. Т.е. будет не class Foo { Bar.baz }, а class Foo { self: Bar => baz }.

Вы спросите, чем же это отличается от обычных неймспейсов и не-вложенных классов. Тем, что модули в Скале в отличие от пакетов в Джаве являются первоклассными сущностями, т.е. их можно передавать в методы, у них есть контракты, ими можно параметризировать код.
(deleted comment)

[identity profile] xeno-by.livejournal.com 2013-03-13 01:02 pm (UTC)(link)
Считается. Потому, что self-type или extends пишутся один раз, а квалификаторы не пишутся много раз.
(deleted comment)

[identity profile] xeno-by.livejournal.com 2013-03-13 01:12 pm (UTC)(link)
Более полный пример:
object Module extends Part1 with Part2 with Part3
trait Part1 { self: Module => ... }
trait Part2 { self: Module => ... }
trait Part3 { self: Module => object NestedModule { ... } }


Все определения из PartX можно использовать в любом PartY без квалификатора. Чтобы использовать определения из NestedModule, нужно или юзать квалификатор, или написать import NestedModule._.
(deleted comment)

[identity profile] xeno-by.livejournal.com 2013-03-13 01:21 pm (UTC)(link)
Как скажете. Наверное, я не очень хорошо объяснил, но у меня, к сожалению, на более развернутый рассказ нет времени.

Одно хочу сказать - лично я после перехода с сишарпа на скалу стал писать гораздо меньше импортов.
(deleted comment)

(no subject)

[identity profile] xeno-by.livejournal.com - 2013-03-13 13:48 (UTC) - Expand
(deleted comment)

(no subject)

[identity profile] xeno-by.livejournal.com - 2013-03-13 13:54 (UTC) - Expand
(deleted comment)

(no subject)

[identity profile] xeno-by.livejournal.com - 2013-03-13 14:01 (UTC) - Expand

[identity profile] metaclass.livejournal.com 2013-03-13 01:55 pm (UTC)(link)
Слушай, а вот оные объекты, собранные из частей - это ж получается типа синглетонов - т.е. анонимный класс и один его экземпляр?

[identity profile] xeno-by.livejournal.com 2013-03-13 02:03 pm (UTC)(link)
Ну да, они так и реализованы. Но мне лично проще думать о них как о first-class неймспейсах - какая-то именованная штука, внутри которой есть другие штуки.

(no subject)

[identity profile] metaclass.livejournal.com - 2013-03-13 14:07 (UTC) - Expand

(no subject)

[identity profile] xeno-by.livejournal.com - 2013-03-13 14:10 (UTC) - Expand

(no subject)

[identity profile] jdevelop.livejournal.com - 2013-03-14 01:52 (UTC) - Expand