犯了不合理的编程罪

时间:2012-07-05 03:13:21

标签: c# sql xml stored-procedures anti-patterns

我正在阅读罗伯特·罗斯尼(Robert Rossney)关于“你必须维持的最不健全的计划是什么?”的条目。发现于:(What's the most unsound program you've had to maintain?)当我意识到我无意中发现了一个几乎相同的应用程序! 该应用程序包含一个HTTPListener对象,用于获取传入的POST请求。根据标题中的信息,我将请求的主体传递给SQL Server以执行相应的事务 请求看起来像:

<InvoiceCreate Control="389>
  <Invoice>
    <CustomerNumber>5555</CustomerNumber>
    <Total>300.00</Total>
    <RushOrder>1</RushOrder>
  </Invoice>
</InvoiceCreate>

一旦HTTPListener对象收到它,我就通过存储过程使用SQL Server的内置XML处理功能对Invoice表执行所需的INSERT:

  INSERT INTO Invoice (InvoiceNumber, CustomerNumber, Total, RushOrder)
  SELECT @NEW_INVOICE_NUMBER,  
         @XML.value('(InvoiceCreate/Invoice/CustomerNumber)[1]', 'varchar(10)'),
         @XML.value('(InvoiceCreate/Invoice/Total)[1]', 'varchar(10)'),
         @XML.value('(InvoiceCreate/Invoice/Total)[1]', 'varchar(10)')  

然后我在同一个存储过程中使用另一个SELECT语句来返回插入到Invoices表中的新发票编号的值:

SELECT @NEW_INVOICE_NUMBER FOR XML PATH 'InvoiceCreateAck'  

然后,我使用C#中的SQL数据读取器对象读取生成的XML,并将其用作HTTPListener对象的响应。

我的问题是,我注意到罗伯特确实是正确的。我的所有应用程序逻辑都存在于存储过程中,因此我发现自己必须在存储过程中进行大量错误检查(即验证客户编号和invoicenumber值)。

我仍然是一名中级开发人员,因此,我希望改进。鉴于原始帖子和我目前的架构,我可以采取哪些不同的方式来改进应用程序?我可以参考哪些模式或最佳实践?你会采取什么方法?我愿意接受任何批评,因为我愿意尽自己的一份力量来减少世界上“不合理编程”的数量。

1 个答案:

答案 0 :(得分:0)

不确定特定的图案,但您需要定义图层并坚持使用它。我在这里非常松散地使用图层。您有一个层需要解析XML。您有一个层来读取HTTP请求。您有一个层可以进行数据访问。如果你使用C#,这些可能是3个单独的类。

我不会在存储过程中这样做。根据我的经验,如果你改变数据库,做这些事情几乎可以完全重写。测试也很困难。

对于您的数据访问,您仍然可以使用存储过程。我个人只会使用C#编写简单的插入语句。我只是努力保持存储过程中的任何业务逻辑。保留任何业务逻辑,在C#中进行解析,因为稍后将更容易移植。

祝你好运!