我正在研究一个项目的大型重构,我已经要求
this question确认/理解我应该进入的方向,我想我得到了我想要的答案,这不是要扔掉多年的代码.所以,现在开始重构代码的挑战.我一直在阅读Martine Fowler和Martin Feathers的书籍,他们有很多见解,但我正在寻找关于我希望应用程序在哪里的最终目标的建议.
所以重申一下这个应用程序,它是一个动态表单系统,在字段之间有很多验证逻辑和数据逻辑.插入的主记录是页面上的一组表单字段.另一部分是你可以为一个人做的“行动”.这些“操作”可能因客户端而异,并且有数百个“操作”.还有一种说法,我们可以以某种方式制造一个最终可以采用其他类似领域的引擎,其中“人”可以是其他东西(例如学生或员工).所以我想建立一个非常去耦合的东西.我们有一个代码库,但不同的客户端有不同的DB.页面上的表单字段集是动态的,但DB不是 – 它通过存储过程转换为特定的DB表.因此,通用字段集将被发送到存储过程,然后存储过程决定如何处理字段(找出它需要去哪个表).这些表实际上是非常静态的,这意味着它们不是真正的动态,并且它有一定的结构.
我正在努力的是如何设置一个好的方法来做动态表单控件页面.似乎大多数逻辑都在UI / aspx.cs页面的代码中,因为它将控件加载到网页上.有没有办法可以做到这一点,所以它是以简化的方式完成的,所以aspx.cs页面不长5000行?我有一个’FORM’对象,其中一个属性是”FIELDS’.因此,此对象在业务层和数据层中加载,但现在在前端,它必须循环通过FIELDS并将控件输出到页面上.此外,能够控制位置的某些方面也是有用的 – 不知道如何将其纳入此模型….
此外,从另一个角度来看 – 我怎么能’真正’将它变成面向对象的结构?因为从技术上讲,它们可以创造任何形式.那些表单字段可以表示任何对象.因此,例如,今天他们可以创建一组表示“人”的表单字段 – 明天他们可以创建一组表示“家具”的表单字段.我怎么可能把它翻译成一个人或一个家具(或者我应该尝试?).我并没有对表单字段进行控制,因为它们可以创建任何内容….
任何思考过程都会非常有用 – 谢谢!
最佳答案
How can I possibly translate this to to a person or a furniture object
(or should I even be trying to?)
如果我理解正确,您可能不应该尝试将这些字段转换为特定对象,因为应用程序的性质是如此动态.如果存储过程能够确定哪个字段组合属于哪些表,那么很好.
如果您可以更改数据库架构,我建议您提出更具动态性的内容.我不是为每种类型的动态对象都有一个表,而是创建以下模式:
Object {
ID
Name
... (clientID, etc.) ...
}
Property {
ID
ObjectID
Name
DBType (int, string, object-id, etc.)
FormType ( textbox, checkbox, etc.)
[FormValidationRegex] <== optional, could be used by field controls
Value
}
如果无法更改数据库架构,仍可以使用存储过程和固定表将以下内容应用于旧系统:
然后,当您从数据库中读取特定对象时,您可以循环遍历每个属性并获取表单类型并简单地将适当的通用表单类型添加到页面:
foreach(Property p in Object.Properties)
{
switch(p.FormType)
{
case FormType.CheckBox:
PageForm.AddField(new CheckboxFormField(p.Name, p.Value));
break;
case FormType.Email:
PageForm.AddField(new EmailFormField(p.Name, p.Value));
break;
case FormType.etc:
...
break;
}
}
当然,我投入了一个PageForm对象,以及CheckboxFormField和EmailFormField对象. PageForm对象可以只是一个占位符,CheckboxFormField和EmailFormField可以是UserControls或ServerControls.
我不建议尝试控制放置.只需垂直列出每个字段.无论如何,这变得越来越流行,即使是静态形式,其布局也可以完全控制.例如,大多数注册表单都遵循此约定.
我希望有所帮助.如果我理解你的问题不对,或者你想进一步解释,请告诉我.