过程代码是否适合呈现UI视图?

时间:2017-01-20 20:12:50

标签: asp.net design-patterns uiview

背景

在工作中,我遇到了一些使用一系列过程方法构建HTML视图的代码。这对我来说真的很不对,在开展工作的过程中,我设法引入了意想不到的布局变化。

有关更详细的说明,请参阅下面的伪代码。

问题

  • 该项目是一个针对4.0框架的ASP.NET Web应用程序。有了ASP.NET开发人员可用的所有工具,这种模式是否合适是有原因的。

  • 最终,如果没有其他时间优先事项,是否应重构此代码?这绝对是代码脆弱的气味。

注意事项

我不能100%确定这是否是SO的合适问题。它属于编程模式的主观主题。作为一个主观话题,SO Answers有可能转化为讨论,众所周知,这不是SO的目的。我不认为这个问题符合代码高尔夫的要求。

我正在寻找的是这种特殊模式的客观证据 由于某种原因导致不可维护的代码,这是一个坏主意。或证明这种模式适合某些情况,引用特定例子的奖励点。

如果我编写这段代码,我可能会使用某种着名的模板引擎。我在非视图代码中处理逻辑决策(突出显示有生日的人的行)。我想我是无逻辑模板引擎的支持者。

我为长代码道歉,我试图在不牺牲上下文的情况下保持简洁。希望这对于一些战斗伤痕累累的SO退伍军人来说将是一个有趣的问题。

代码

关于伪代码

此问题中的代码不代表任何实际的编程语言。 它主要基于JavaScript,其中包含HTML术语。这应该 没有重要的心理体操就很容易解释。

页面加载事件处理程序

protected void Page_Load(object sender, EventArgs e) {

    var data = DataLayer.getData();
    var engine = new DataViewRenderEngine(data);
    var divElement = engine.Render();

    document.body.add(divElement);

}

DataViewRenderEngine的定义

class DataViewRenderEngine {

    private _dataSource = null;

    public DataViewRenderEngine(dataSource) {
        this._dataSource = dataSource;
    }

    public Element Render() {
        return RenderView(this._dataSource);
    }

    private Element RenderView(data) {

        var containerDiv = RenderContainerDiv(data);            

        var pageHeader = PenderPageHeader(data.Title);
        containerDiv.add(pageHeader)    

        var personTable = renderPersonTable(data.PeopleArray)
        containerDiv.add(personTable);

        return containerDiv;        

    }

    private Element RenderContainerDiv() {
        return new Element({
            tag: 'div',
            class: 'container'
        });
    }

    private Element RenderPageHeader(title) {       
        return new Element({
            tag: 'h1',
            innerHTML: title        
        });     
    }

    private Element RenderPersonTable(peopleArray) {

        var table = new Element('table');

        for(var person in peopleArray) {
            var row = RenderPersonTableRow(person);
            table.add(row); 
        }

        return table;
    }

    private Element RenderTableRow(person) {
        var row = new Element('tr');

        row.add(new Element({
            tag: 'td',
            innerHTML: person.firstName     
        });

        row.add(new Element({
            tag: 'td',
            innerHTML: person.lastName      
        });

        var today = Date.Today();
        if(person.birthday.Month == today.Month &&
           person.birthday.Day   == today.Day) {
            row.BackgroundColor = 'green';
        }

        return row; 
    }

}

1 个答案:

答案 0 :(得分:1)

实际上,您似乎认为面向对象编程没有过去的痕迹:程序编程仍然存在。

当你实现方法时,它们的主体仍然是程序性的。也就是说,你正在调用方法,这些方法和函数后来被融合成一个概念。

后来,有好的和坏的设计。如果您的同事的代码看起来像您的pseucode,那么它似乎闻起来

渲染引擎不应绑定到特定的视图。您似乎混合了视图视图模板视图渲染器。因此,明确打破单一责任原则,因为它做了太多事情。

结论:这只是一个糟糕的设计/架构。就是这样。

现在我将回答你的具体问题:

  

该项目是一个针对4.0的ASP.NET Web应用程序   框架。使用ASP.NET开发人员可用的所有工具,是   这种模式是否恰当。

2017年,您可能不应该在ASP.NET Web窗体上投入更多精力。如果他们这样做,要么让自己适应他们糟糕的设计,要么说服他们切换到ASP.NET MVC,甚至放弃服务器端视图编程,转而支持客户端的完整HTML5 Web应用程序。

  

最终,没有其他时间优先级,这个代码应该是   重构?这绝对是代码脆弱的气味。

这个问题应该和你的第一个问题一样。