From d9e6f5a10d13d54f4ee9aee08aecfa9f9d9c35df Mon Sep 17 00:00:00 2001 From: John Firebaugh <john.firebaugh@gmail.com> Date: Thu, 20 Oct 2016 13:27:26 -0700 Subject: [PATCH] Clean up {Bucket,StyleLayer}.create * Replace switch with object lookup * Avoid delayed requires * Eliminate the need for eslint-disable-line --- js/data/bucket.js | 47 ++++++++++++++++++++--------------------- js/style/style_layer.js | 29 +++++++++---------------- 2 files changed, 33 insertions(+), 43 deletions(-) diff --git a/js/data/bucket.js b/js/data/bucket.js index fea04983316..c115725b8a6 100644 --- a/js/data/bucket.js +++ b/js/data/bucket.js @@ -62,30 +62,6 @@ class Bucket { } } - /** - * Instantiate the appropriate subclass of `Bucket` for `options`. - * @param options See `Bucket` constructor options - * @returns {Bucket} - */ - static create(options) { - const Classes = { - fill: require('./bucket/fill_bucket'), - fillextrusion: require('./bucket/fill_extrusion_bucket'), - line: require('./bucket/line_bucket'), - circle: require('./bucket/circle_bucket'), - symbol: require('./bucket/symbol_bucket') - }; - - let type = options.layer.type; - if (type === 'fill' && (!options.layer.isPaintValueFeatureConstant('fill-extrude-height') || - !options.layer.isPaintValueZoomConstant('fill-extrude-height') || - options.layer.getPaintValue('fill-extrude-height') !== 0)) { - type = 'fillextrusion'; - } - - return new Classes[type](options); - } - populate(features) { this.createArrays(); this.recalculateStyleLayers(); @@ -289,6 +265,29 @@ Bucket.ElementArrayType = function (components) { module.exports = Bucket; +const subclasses = { + fill: require('./bucket/fill_bucket'), + fillextrusion: require('./bucket/fill_extrusion_bucket'), + line: require('./bucket/line_bucket'), + circle: require('./bucket/circle_bucket'), + symbol: require('./bucket/symbol_bucket') +}; + +/** + * Instantiate the appropriate subclass of `Bucket` for `options`. + * @param options See `Bucket` constructor options + * @returns {Bucket} + */ +Bucket.create = function(options) { + let type = options.layer.type; + if (type === 'fill' && (!options.layer.isPaintValueFeatureConstant('fill-extrude-height') || + !options.layer.isPaintValueZoomConstant('fill-extrude-height') || + options.layer.getPaintValue('fill-extrude-height') !== 0)) { + type = 'fillextrusion'; + } + return new subclasses[type](options); +}; + function createPaintAttributes(bucket) { const attributes = {}; for (const interfaceName in bucket.programInterfaces) { diff --git a/js/style/style_layer.js b/js/style/style_layer.js index 3558ec8de80..c9f45d9001c 100644 --- a/js/style/style_layer.js +++ b/js/style/style_layer.js @@ -10,28 +10,12 @@ const Evented = require('../util/evented'); const TRANSITION_SUFFIX = '-transition'; -// false-positive prefer-const eslint violation here; we intentionally assign once but later -let FillStyleLayer, LineStyleLayer, SymbolStyleLayer; // eslint-disable-line - class StyleLayer extends Evented { constructor(layer, refLayer) { super(); this.set(layer, refLayer); } - static create(layer, refLayer) { - switch ((refLayer || layer).type) { - case 'fill': - return new FillStyleLayer(layer, refLayer); - case 'line': - return new LineStyleLayer(layer, refLayer); - case 'symbol': - return new SymbolStyleLayer(layer, refLayer); - default: - return new StyleLayer(layer, refLayer); - } - } - set(layer, refLayer) { this.id = layer.id; this.ref = layer.ref; @@ -347,9 +331,16 @@ class StyleLayer extends Evented { module.exports = StyleLayer; -FillStyleLayer = require('./style_layer/fill_style_layer'); -LineStyleLayer = require('./style_layer/line_style_layer'); -SymbolStyleLayer = require('./style_layer/symbol_style_layer'); +const subclasses = { + 'fill': require('./style_layer/fill_style_layer'), + 'line': require('./style_layer/line_style_layer'), + 'symbol': require('./style_layer/symbol_style_layer') +}; + +StyleLayer.create = function(layer, refLayer) { + const LayerClass = subclasses[(refLayer || layer).type] || StyleLayer; + return new LayerClass(layer, refLayer); +}; function getDeclarationValue(declaration) { return declaration.value;