如何组织重复代码?


11

我的团队创建了很多一次性的Web表单。这些表格中的大多数仅发送电子邮件,而一些表格进行简单的数据库写入。

现在,每种形式都存在于Visual Studio Team Foundation Server中自己的单独解决方案中。这意味着我们有将近100个不同的表单项目,这使得保持一致性变得很困难。每种形式都是唯一的,因为字段是不同的,但是它们几乎都做相同的事情。

我希望以某种方式压缩这些内容,并且我确实可以使用一些指导。

  • 我是否应该尝试在其中包含所有表单项目的情况下创建一个解决方案文件?尽管我可以创建一些帮助程序类来帮助进行电子邮件格式化等,但是没有很多管道代码。能够在项目之间共享CSS,JavaScript,控件和图像将非常有帮助。
  • 既然我们是Microsoft商店,那么针对这种特定情况,通过Webforms使用MVC之类的东西有什么明显的好处?整个MVC的概念使我受宠若惊,但是如果该表格仅发送电子邮件,是否可以帮助我更有效地整理15字段数据收集表格?我想到的表单具有很多内置的逻辑,可以根据用户的响应显示和隐藏字段,并且似乎使用MVC和jQuery的效率较低。

2
这是什么从meta迁移到这里的?应该放在SO上。
Josh K

1
@Josh Stack Overflow是针对与代码中特定问题直接相关的问题的。程序和工作流设计在此处成为主题

@Mark:这听起来不太主观,因为很容易给出理想的“最佳实践”解决方案。我不是MS专家,所以我不知道并发症是什么,但是我冒昧地猜测这将是最好的非主观回答。
Josh K

同意 这将因此关闭。
Walter

Answers:


3

在没有测试的情况下安全地进行重构非常困难,并且充满危险。

我将从以下内容开始:

  • 将涵盖各种输入形式的测试用例编写成这些表格以及预期的输出。听起来这实际上并不需要花费太长时间,因为您认为这些形式中的大多数在功能上是相同的或相近的。

  • 针对100个左右的表单运行这些测试用例(打开代码覆盖率以帮助您跟踪代码路径)。

之后,您可以查看可以安全重构的内容,然后可以(示例):

  • 运行您的代码重复检测工具(不知道它在.NET中是什么,在Java中我们拥有CPD)。立即删除13个相同的表格。现在重新运行测试-是的!他们都通过了,除了11号表格,确定,所以我们还不能删除它。

  • 删除所有本地电子邮件格式代码,并获取所有表格以调出公共电子邮件处理模块。运行测试,所有测试都通过,除了一个,嗯……好吧。UTF-8字符,在通用模块中修复,再次运行测试,是的,我们都很好!

冲洗并重复。


2
+1有关如何进行重构的提示,请参阅Michael Feathers与Legacy Code有效合作amazon.com/dp/0131177052
迈克尔·布朗

很好的参考-我喜欢那本书。
Martijn Verburg

0

我建议抽象出提交部分。使用模型/视图/控制器,将表单放入视图中,并使它们使用相同的控制器。该控制器可以执行一般操作,例如向默认地址发送电子邮件,也可以将表单数据转移到可以的控制器上。这样,创建新表单所需要做的就是创建表单并将输出定向到该控制器。该架构可以包含在一个项目中,这将使您能够共享CSS和javascript。

要处理电子邮件的格式,我将从创建一个通用格式器开始,比如说一个仅列出表单元素名称和值的格式器,以及另一个诸如提交时间的metdata类型stuf等。您可以根据需要将其设置为花哨。然后,如果确实需要更多自定义处理,则添加一个工厂。工厂将返回格式化程序接口。然后,在工厂内,您可以查找该特定格式的格式化程序,或者如果不存在特定格式,则返回通用格式。这种设计还可以使cntroller的单元测试更加容易,因为您可以轻松提供用于测试目的的模拟格式化程序。

顺便说一句,我不会将电子邮件地址作为表单的参数。如果您需要发送到多个地址,我建议您使用一个查找表,其中包含所有表格以及将其发送到的电子邮件。这可以用XML或代码来实现(我已经看过两者,尽管我不确定两者是否更好)。这将有助于避免垃圾邮件发送者从表单页面获取您的电子邮件地址。


谢谢回复。在这种体系结构中,您将在哪里处理格式化发送的电子邮件?我想将其抽象化,但是我想不出一种方法来进行格式化,而无需创建字符串生成器并将字段放在静态文本块之间。这似乎特定于每种形式。
乔什·厄尔

另外,在处理表单逻辑方面是否有建议,例如根据另一个下拉菜单中的选择填充一个下拉菜单?如果我们使用MVC路线,jQuery是唯一的选择吗?
乔什·厄尔

@JoshEarl:我已经为格式化程序进行了编辑,但是我无法对jQuery等提出任何建议。网页方面并不是我完全不愿意提出建议的领域。如果事情太复杂,则可能必须采用完整的MVC设计,每页一个控制器。正如@Martijn所说,单元测试将帮助您准确了解您的需求。我的设计假设表单之间有很多相似之处。
Michael K
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.