当我编写代码时,这是一种常见的情况...我看到一些看起来很相似的代码..我知道在我的代码中具有冗余功能显然不好。

但是,这是绝对的吗? 0冗余?我在下面有两个函数,看起来很像。 ViewH.bookmark和ViewH.tweet。

我试图确定是否应该将常用功能引入到名为ViewH.mark()的函数中。

编辑

var ViewH = {
    MARK:
    {
        FIELD:      '|',
        ROW:        '||',
        PASS:       '<xx_p>',
        FAIL:       '<xx_f>'
    },
    return_string:  '',
    mark: function(passed_function, embeddedAml)
    {
        var return_string,
            first_split,
            element_count,
            second_split;

        return_string = '';
        first_split = embeddedAml.split( ViewH.MARK.ROW );
        for( element_count=0; element_count < first_split.length; element_count++)
        {
            second_split = first_split[element_count].split( ViewH.MARK.FIELD );
            passed_function(second_split);
        }
        return ViewH.return_string;
    },
    bookmark: function ( embeddedAml )
    {
        ViewH.return_string='';
        return ViewH.mark(ViewH.bookmark_inner, embeddedAml);
    },
    tweet: function ( embeddedAml )
    {
        ViewH.return_string='';
        return ViewH.mark(ViewH.tweet_inner, embeddedAml);
    },
    portfolio: function ( embeddedAml )
    {
        ViewH.return_string='';
        return ViewH.mark(ViewH.portfolio_inner, embeddedAml);
    },
    bookmark_inner: function ( second_split )
    {
        ViewH.return_string = ViewH.return_string
        + '<img name="bo_im" class="c" src="'
        + 'http://www.google.com/s2/favicons?domain='
        + second_split[0]
        + '" onerror="Arc.BookmarkError(this)"><a target="_blank" name="bookmark_link" class="b" href = "'
        + second_split[1]
        + '">'
        + second_split[2]
        + '</a>';
    },
    tweet_inner: function ( second_split )
    {
        ViewH.return_string = ViewH.return_string
        + '<div class="Bb2b"><img class="a" src="'
        + Constant.PICTURES + second_split[ 0 ]
        + '.jpg" alt=""/><a class="a" href="javascript:void(0)\">'
        + second_split[ 1 ]
        + ' posted '
        + ViewH.pretty( second_split[ 2 ],second_split[ 3 ] )
        + '</a><br/><p class="c">'
        + second_split[ 4 ]
        + '</p></div>';
    },
    portfolio_inner: function ( second_split )
    {
        if( ( second_split[ 1 ] === 'docx' ) || ( second_split[ 1 ] === 'xlsx' ) )
        {
            ViewH.return_string = ViewH.return_string
            + '<img name="bo_im" class="c" src="'
            + Constant.IMAGES + second_split[1]
            + '.ico"><a target="_blank" name="bookmark_link" class="b" href = "/'
            + Constant.ROOT
            + second_split[1]
            + '/'
            + second_split[0]
            + '.'
            + second_split[1]
            + '">'
            + second_split[0]
            + '.'
            + second_split[1]
            + '</a>';
        }
        else
        {
            ViewH.return_string=ViewH.return_string
            + '<simg name="bo_im" class="c" src="'
            + Constant.IMAGES
            + 'generic'
            + '.ico"><a target="_blank" name="bookmark_link" class="b" href = "'
            + Constant.TEXT
            + second_split[0]
            + '.txt">'
            + second_split[0]
            + '.'
            + second_split[1]
            + '</a>';
        }
    },

最佳答案

这是一个很好的问题,但是没有答案适用于所有情况。这实际上取决于代码的外观。通常应避免冗余,但是有时过度设计代码并尝试使其完全不适合使用时会更糟。

在您的情况下,绝对可以从采用通用代码并将其引入通用方法中受益。看起来方法之间的唯一区别是呈现部分,将呈现函数传递到“ mark”方法中很简单。

您的“标记”方法看起来像这样:

mark: function(embeddedAml, renderer) {
    var return_string,
        first_split,
        element_count,
        second_split;

    return_string = '';
    first_split = embeddedAml.split( ViewH.MARK.ROW );

    for( element_count=0; element_count < first_split.length; element_count++)
    {
        second_split = first_split[element_count].split( ViewH.MARK.FIELD );
        return_string = return_string + renderer(second_split);
    }

    return return_string;
}


您可以保留书签和推文方法,但它们也会发生变化:

bookmark: function (embeddedAml) {
    return this.mark(embeddedAml, function(data) {
        return '<img name="bo_im" class="c" src="' +
        'http://www.google.com/s2/favicons?domain=' +
        data[0] +
        '" onerror="Arc.BookmarkError(this)"><a target="_blank" name="bookmark_link" class="b" href = "' +
        data[1] + '">' +
        data[2] + '</a>'
    });
}


现在,您的呈现代码(唯一的不同代码)是独立控制的,但是重叠的代码位于一个公共位置,如果更改,则只需在一个位置进行更新即可。

10-07 21:18