我对解析器过于复杂吗?

时间:2015-10-20 19:00:22

标签: javascript angularjs design-patterns

这是一个技术问题的设计问题,但由于有一个名为design-patterns的标签,我认为这是有道理的。

我的方案如下:我有一个CSV文件,我想用它来填充一个对象,然后使用该对象进行API调用。到现在为止还挺好。

棘手的部分是CSV数据在填充对象之前可能需要一些转换,一旦创建并填充了对象,我想编辑其中一些对象属性。

视图和控制器操作将由angular提供,我专注于模板的东西。

对象是如何组成的?好吧,我的想法如下:

  • 结果将是对象的hasmap,其中每个对象都有一个字段集合,这些字段也是对象。此对象表示一行,每个字段表示一列。
    • 每个字段都有一个value属性,这样angular就可以实现双向数据绑定魔法。它还有一组用于查询和与对象交互的方法,比如请求对象类(ng-dirty,如果它是必需的和空的),如果它是一个集合而不是单个值,则添加另一个元素,还有那种东西。

要构建此对象,我将以这种方式继续:

  • 首先构建一组用于解析每个列/字段数据的规则。
  • 每个规则都有一个解析数据的解析器方法,以及一个构造函数方法,它返回我上面提到的“field”对象。
  • 构造函数调用解析器,解析器将解析数据并返回该数据的有效表示。然后,构造函数将返回一个对象字段,其中解析器结果为值,以及一组与该对象进行交互的方法。
  • 使用ruleFactory函数创建规则。此函数接收字段的“类型”,如果它是必需的(必需),则使用构造函数和对象以获取其他选项,例如解析器使用并返回规则。

一些构造函数构建在其他构造函数之上。例如,arrayConstructor使用基本构造函数,它扩展了基本构造函数返回的对象,然后返回它。 arrayConstructor使用limitedValuesConstructor,依此类推。如果你没有注意到,如果没有定义,一些构造函数会回退到默认解析器。

我的想法是希望这是可扩展的,所以如果将来如果数据格式发生变化,我只需要添加另一个解析器,或者更新现有的解析器。构造函数的内容相同。

但是,我觉得我会为这项任务复杂化,我想要你的意见。令我害怕的另一件事是,我觉得这不符合我所知道的任何有效设计模式。它不是典型的,不是经典的,不是模块模式(闭包),我不熟悉构图,但我觉得这也不是有效的构图。

下面你可以找到一个闭包内的基本代码。

    (function () {
     function ruleFactory (type,required,constructor,options) {
        constructor = constructor || basicConstructor;
        var column = {
            'type': type,
            'required': required || false,
            'parser': options && options.parser ,
            'constructor': function (data) { return constructor.apply(column,[data,required,options])}
        };
        return column
    }

    function strParser (data){
        if( typeof data === "string" ){
            return data
        } else if( data && data.toString){
            return data.toString();
        }
        return ''
    }

    function arrParser (data){
        if(!data){
            return []
        }
        if( angular.isArray(data) ){
            return data
        }
        return strParser(data).split(' ');
    }

    function basicConstructor (data,required) {
        var parser = this.parser || strParser; //fallback to the most basic parser
        var column = {};
            column.value = parser(data);
            column.getClass = function (){
                if( required && ! this.value ){
                    return 'ng-dirty'
                }
                return ''
            };
            return column
    }

    function arrConstructor (data,required) {
        this.parser = this.parser || arrParser; // default parser for this constructor
        var column = basicConstructor.apply(this,arguments);
        column.addValue = function (value) {
            column.value.push(value);
        }
        column.getClass = function ( ) {
            if ( column.value.length <= 0 && required ) {
              return 'ng-dirty'
            }
            return ''
        }
        return column
    }

})()

“规则”对象(或数组或任何你想要的)构建如下:

var rules  = {
            "someColName": ruleFactory('number',true), // true means required. Defaults to false
            "someList" :  ruleFactory('array',false,arrConstructor), //No parser defined, so fallbacks to default parser for arrConstructor
            "otherList" :  ruleFactory('array',false,arrConstructor, {parser:arrParser}) }

非常欢迎任何意见/建设性批评。

此致

0 个答案:

没有答案