Соглашения об именовании (naming conventions) играют важную роль в разработке приложений на базе Mapbox GL JS. Библиотека содержит большое количество объектов, конфигураций, слоёв, источников данных, событий и пользовательских сущностей. Единообразный подход к именованию упрощает поддержку проекта, облегчает навигацию по коду и снижает вероятность ошибок при работе с картографическими компонентами.
Mapbox GL JS придерживается общепринятых соглашений JavaScript.
Все конструкторы и классы используют стиль PascalCase.
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v12'
});
const marker = new mapboxgl.Marker();
const popup = new mapboxgl.Popup();
Примеры классов:
mapboxgl.Map
mapboxgl.Marker
mapboxgl.Popup
mapboxgl.NavigationControl
mapboxgl.GeolocateControl
mapboxgl.LngLat
mapboxgl.LngLatBounds
Особенность PascalCase заключается в том, что каждое слово начинается с заглавной буквы.
Map
Marker
Popup
NavigationControl
GeolocateControl
Методы экземпляров используют стиль camelCase.
map.addLayer();
map.addSource();
map.getZoom();
map.getCenter();
map.flyTo();
map.fitBounds();
Примеры:
map.addControl(control);
map.removeLayer('buildings');
map.setCenter([30, 60]);
map.getStyle();
Характерные признаки:
addLayer
addSource
removeSource
getCenter
getBounds
flyTo
queryRenderedFeatures
Большинство свойств конфигурационных объектов также используют camelCase.
map.flyTo({
center: [37.6176, 55.7558],
zoom: 12,
essential: true
});
Другие примеры:
{
dragRotate: false,
attributionControl: true,
renderWorldCopies: false
}
Экземпляр карты традиционно называется map.
const map = new mapboxgl.Map({...});
Такое имя является фактическим стандартом во всех примерах документации.
Если приложение содержит несколько карт, используются более конкретные названия.
const cityMap = new mapboxgl.Map({...});
const overviewMap = new mapboxgl.Map({...});
const satelliteMap = new mapboxgl.Map({...});
Плохой вариант:
const map1 = new mapboxgl.Map({...});
const map2 = new mapboxgl.Map({...});
Хороший вариант:
const primaryMap = new mapboxgl.Map({...});
const secondaryMap = new mapboxgl.Map({...});
Источник данных (source) является фундаментальным элементом Mapbox GL JS.
Добавление источника:
map.addSource('cities', {
type: 'geojson',
data: citiesData
});
Имя источника должно отражать содержимое данных.
'cities'
'roads'
'countries'
'weather'
'earthquakes'
'bike-routes'
'railway-stations'
'data'
'layer1'
'source123'
'test'
'temp'
В крупных проектах полезно группировать источники по типу.
'vector-roads'
'vector-buildings'
'geojson-cities'
'geojson-parks'
'raster-satellite'
'raster-weather'
Такой подход облегчает понимание структуры проекта.
Каждый слой имеет уникальный идентификатор.
map.addLayer({
id: 'city-labels',
type: 'symbol',
source: 'cities'
});
Название слоя должно описывать:
'cities'
'city-points'
'capital-points'
'airports'
'station-markers'
'roads'
'highways'
'railways'
'bike-routes'
'river-lines'
'countries'
'regions'
'parks'
'lakes'
'building-footprints'
Подписи рекомендуется выделять отдельно.
'city-labels'
'road-labels'
'country-labels'
'park-labels'
Часто используется суффикс:
-labels
Для временного выделения объектов удобно использовать специальные суффиксы.
'selected-feature'
'hover-highlight'
'active-region'
или
'roads-highlight'
'cities-selected'
'parks-hover'
События в Mapbox GL JS представлены строковыми литералами.
Примеры встроенных событий:
map.on('load', handler);
map.on('click', handler);
map.on('move', handler);
map.on('zoom', handler);
Названия встроенных событий всегда записываются в нижнем регистре.
load
click
mousemove
mouseenter
mouseleave
zoom
moveend
Обработчики рекомендуется называть по шаблону:
handle + Событие
Пример:
function handleMapClick(event) {
console.log(event.lngLat);
}
map.on('click', handleMapClick);
Другие варианты:
function handleZoomEnd() {}
function handleMouseMove() {}
function handleLayerHover() {}
Распространён альтернативный стиль.
function onMapLoad() {}
function onMapClick() {}
function onZoomChange() {}
Пример:
map.on('load', onMapLoad);
Главное требование — единообразие внутри проекта.
При работе с несколькими маркерами необходимо использовать предметные имена.
const userMarker = new mapboxgl.Marker();
const officeMarker = new mapboxgl.Marker();
const destinationMarker = new mapboxgl.Marker();
Неудачный вариант:
const marker1 = new mapboxgl.Marker();
const marker2 = new mapboxgl.Marker();
Массивы рекомендуется называть во множественном числе.
const cityMarkers = [];
const restaurantMarkers = [];
const weatherStations = [];
Для объектов Popup применяются имена с суффиксом
Popup.
const cityPopup = new mapboxgl.Popup();
const airportPopup = new mapboxgl.Popup();
const informationPopup = new mapboxgl.Popup();
Такой подход позволяет мгновенно определить тип объекта.
Mapbox GL JS использует географические координаты в формате longitude/latitude.
const longitude = 37.6176;
const latitude = 55.7558;
Сокращённые варианты:
const lng = 37.6176;
const lat = 55.7558;
Именно эти сокращения используются внутри API библиотеки.
event.lngLat
const cityCenter = {
lng: 37.6176,
lat: 55.7558
};
или
const mapCenter = [37.6176, 55.7558];
Название переменной должно отражать содержимое.
const citiesGeoJSON = {...};
const roadsGeoJSON = {...};
const buildingsGeoJSON = {...};
Если данные поступают с сервера:
const fetchedCitiesGeoJSON = {...};
const remoteRoadsGeoJSON = {...};
const cityFeatures = {
type: 'FeatureCollection',
features: [...]
};
Для коллекций полезно использовать суффикс:
Features
или
FeatureCollection
В больших проектах количество слоёв может исчисляться десятками или сотнями.
Полезно придерживаться структуры:
категория-подкатегория-тип
Примеры:
transport-roads-line
transport-railways-line
transport-airports-symbol
admin-countries-fill
admin-countries-border
admin-cities-label
nature-rivers-line
nature-lakes-fill
nature-forests-fill
Преимущества:
Для собственных контролов используется PascalCase.
class SearchControl {
}
class LayerSwitcherControl {
}
class WeatherControl {
}
Экземпляры создаются через camelCase.
const searchControl = new SearchControl();
const weatherControl = new WeatherControl();
Если приложение содержит специализированные обёртки над Mapbox GL JS, рекомендуется указывать предметную область в названии.
class CityMap {
}
class LogisticsMap {
}
class NavigationMap {
}
Менее информативный вариант:
class MapManager {
}
Более информативный вариант:
class DeliveryMapManager {
}
class FleetMapManager {
}
Асинхронные операции желательно отражать в имени функции.
async function loadCities() {
}
async function fetchRoadNetwork() {
}
async function loadWeatherData() {
}
Распространённые префиксы:
load
fetch
request
retrieve
Примеры:
fetchGeoJSON()
loadMapStyle()
requestTrafficData()
Константы обычно оформляются в стиле UPPER_SNAKE_CASE.
const DEFAULT_ZOOM = 10;
const MAX_ALLOWED_ZOOM = 18;
const EARTH_RADIUS_METERS = 6378137;
Для настроек карты:
const DEFAULT_CENTER = [37.6176, 55.7558];
const DEFAULT_STYLE =
'mapbox://styles/mapbox/streets-v12';
Типичная структура:
map.js
map-init.js
map-events.js
map-controls.js
sources.js
layers.js
markers.js
geojson-loader.js
style-manager.js
Для React-проектов:
MapView.jsx
MapContainer.jsx
LayerManager.jsx
MarkerManager.jsx
geojson-cities
geojson-roads
geojson-buildings
cities-circle
cities-labels
roads-line
roads-highlight
buildings-fill
buildings-outline
const citySource;
const roadsLayer;
const selectedBuilding;
const activeMarker;
handleMapLoad()
handleCityClick()
handleMarkerHover()
handleZoomEnd()
MapManager
LayerManager
SourceManager
MarkerManager
PopupManager
Подобная система обеспечивает предсказуемую структуру кода, упрощает сопровождение картографических приложений и позволяет масштабировать проекты на Mapbox GL JS без появления хаотичных идентификаторов, дублирующихся названий и трудно читаемых конструкций.