Как стать автором
Обновить

Комментарии 16

Достучаться до приватных членов класса, как и до абстрактных классов родителей, будет проблематично

Очень странное желание. Приватные члены сделаны приватными, потому что они в будущем могут измениться, и полагаться на них нельзя.

В рамках обычных ООП-шных языков вы будете правы. Но в JS технически все члены класса публичные, и разделение их на приватные, защищенные и публичные условно. В OL у некоторых свойств ( в комментах к ним для jsdoc) стоит модификатор protected — т.е. доступ из потомков предполагается. Я не говорю здесь про доступ из других классов к приватным методам и свойствам, я говорю про доступ из потомков.

Мне кажется, что если разработчик использует нотацию приватных членов (в Closure или в Typescript), то он воспринимает отсутсвие в js приватных свойств, как недостаток и решает его с помощью компилятора/транспайлера. Скрытие данных или реализации с помощью приватных свойств и методов даёт разработчику преимущество не думать об обратной совместимости, когда он захочет их поменять.


Насчёт @protected не понял, там в коде есть @protected и @private у одних и тех же свойств? Я думаю, что это ошибка.

Из потомков нельзя достучаться даже до членов классов которые помечены как protected, т.е. предполагается доступ к ним.

Я код OpenLayers не модифицировал, но с Closure Compiler/Library работал плотно, и у меня этой проблемы не было. Возможно, есть какие-то особенности, про которые я не знаю.

Вот вы-то мне и нужны ))) Может быть я что-то не понимаю, вам вопрос: могу ли я нормально наследоваться с доступом к членам protected и абстрактным классам, если код уже собран? и работаю я с ним уже после Closure Compiler.

Я все такие телодвижения делал до сборки, так что не смогу помочь, к сожалению. И использовал Closure как программист-пользователь, т.е. не настраивал окружение.


Если вы это будете делать средствами javascripta, то, думаю, сможете. Ведь собранный код — это javascript, и там нет @protected, @abstract, @private и т.д.


Лично я на вашем месте попробовал бы typescript, с ним должно стать всё намного проще (например, https://stackoverflow.com/a/40732068/8159386)

Во-первых, если из-за технических ограничений разработчик не может сделать настоящий приватный член, и поэтому просто помечает его, как приватный, он как раз и имеет в виду, что полагаться на него нельзя и вообще трогать его нельзя. Так что желание достучаться до приватных членов класса — всё ещё странное.


Во-вторых в JS технически нет проблем с тем, чтобы сделать приватные члены класса. И добраться до них, в отличии от какой-нибудь джавы, будет вообще нереально.

Под словом «приватные», я больше имел ввиду не публичные.
Простой пример по коду Leaflet.
Есть класс Layer, у него есть свойство _map, судя по "_" оно не публичное.
Есть класс наследник — LayerGroup, он использует свойство this._map от потомка. Т.е. по сути своей оно защищенное (protected), объявлено как приватное, но фактически оно публичное, т.к. к нему можно обратится извне.
Т.е. по сути своей оно защищенное (protected)

Так и есть.


объявлено как приватное

Что вы имеете в виду, когда говорите, что оно объявлено, как приватное? Что у него underscore перед именем?


но фактически оно публичное

Я хотел отметить, что в js нет проблем с тем, чтобы сделать его приватным фактически.

НЛО прилетело и опубликовало эту надпись здесь
Согласен с вами, но последующие 2 статьи про плагины, фишки и выводы будут объемней, а моя лень затянет написание такой длинной статьи на бесконечное время. Поэтому решил подробить. Сейчас думаю: может еще рассказать как рендеры у них работают.
НЛО прилетело и опубликовало эту надпись здесь
Лично я не вижу для себя весомых преимуществ в «академичности» OL. Это совершенно абстрактное достоинство, которое на практике выливается в банальную многословность. На каждый чих у них объект, каждый объект нужно конструировать.

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

Код
// Leaflet
var map1 = L.map('map1', {
    center: [55.8, 37.6],
    zoom: 12,
});
L.tileLayer('http://sometileserver.com/{z}/{x}/{y}.png', {
    attribution: '© <a href="http://sometileserver.com">sometileserver.com</a>',
})
.addTo(map1);

// OpenLayers
var map2 = new ol.Map({
    target: 'map2',
    layers: [
        new ol.layer.Tile({
            source: new ol.source.XYZ({
                url: 'http://sometileserver.com/{z}/{x}/{y}.png',
                attributions: new ol.Attribution({
                    html: '© <a href="http://sometileserver.com">sometileserver.com</a>',
                }),
            }),
        })
    ],
    view: new ol.View({
        center: ol.proj.fromLonLat([37.6, 55.8]),
        zoom: 12,
    }),
});

Я имел дело (понемногу) почти со всеми популярными картографическими апи — имхо, Leaflet рулит и бибикает.
Ну это пока вы в «мейнстриме» держитесь, а как только шаг вправо, шаг влево, начинаются нюансы. Возьмите коническую проекцию, да разных плагинов, которые друг с другом не работают, вот тут Леафлет бибикая уезжает в кювет, но об этом в следующий раз. Так что, не все так однозначно.

<сарказм>Меркаатора хватит для всего</сарказм>

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории