0

有没有人在为大型应用程序(几十万行代码)的外观和感觉进行标准化而苦苦挣扎?

例如,假设我的应用程序中有很多(数百个)组合框和文本框,我希望它们都具有绿色前景色和蓝色边框。然后过了一段时间,老板说“我想要所有组合框和文本框中的粗体文本”。

一种选择是手动完成,但这种方法并不好,因为: - 耗时 - 开发人员会受到影响 - 会发生错误(在应用程序中的某处会有文本框或组合框没有粗体文​​本)

我正在寻找的是一种自动(自动应用属性)或至少进行自动检查(以类似于代码分析的方式)的方法。

有人做过类似的事情或在该领域有经验吗?

4

2 回答 2

1

Winforms具体建议/答案

假设您有一个已经存在的项目,其中已经创建了数千个某某……但要使用个人扩展的基础对象,则设置需要付出更大的努力。

我自己的项目是用 winforms 编写的,虽然我们没有创建自定义控件,但我们确实有一个自定义的“UserControl”和一个自定义的“Form”,我们可以扩展。扩展表单继承了基本表单的所有格式、结构等。在这种情况下,它的颜色、属性、突出显示和其他包含的控件(如表单上的默认“关闭”按钮)以及自定义事件。

你可以创建这样的东西:

public class CustomTextBox : TextBox
{
    public override <propertyName> { get; set; } //auto-implemented property        
    ...
    public CustomTextBox() : base()
    {
         propertyName = newDefualtValue;
         ...
    }
}

这仍然允许在实例基础上手动设置这些属性......但现在为它们定义了一个新的默认值。不过,这可能需要对现有项目进行大量编辑。

这可能是最简单的设置方法,这样可以更改大型分布式但功能相同的对象的默认值,而无需单独编辑它们。您唯一的其他真正选择是代码搜索、搜索和替换操作以及广泛的测试。

于 2012-06-20T15:28:30.783 回答
0

前段时间我实现了一个解决方案,在该解决方案中我创建了自定义基本表单和控件实现,添加了一个属性并覆盖了 OnLoad 方法:

public partial class FormBase : Form   
{
    public FormBase ()
    {
        this.InitializeComponent();
    }

    protected ConsistencyManager ConsistencyManager { get; private set; }

    protected override void OnLoad(System.EventArgs e)
    {
        base.OnLoad(e);

        if (this.ConsistencyManager == null)
        {
            this.ConsistencyManager = new ConsistencyManager(this);
            this.ConsistencyManager.MakeConsistent();
        }
    }
}

ConsistencyManager 类查找所有控件、组件,还支持在特定控件中搜索自定义子控件。从 MakeConsistent 方法复制/粘贴代码:

public void MakeConsistent()
{
    if (this.components == null)
    {
        List<IComponent> additionalComponents = new List<IComponent>();

        // get all controls, including the current one 
        this.components =
            this.GetAllControls(this.parentControl)
            .Concat(GetAllComponents(this.parentControl))
            .Concat(new Control[] { this.parentControl });

        // now find additional components, which are not present neither in Controls collection nor in components
        foreach (var component in this.components)
        {
            IAdditionalComponentsProvider provider = GetAdditinalComponentsProvider(component.GetType().FullName);

            if (provider != null)
            {
                additionalComponents.AddRange(provider.GetChildComponents(component));
            }
        }

        if (additionalComponents.Count > 0)
        {
            this.components = this.components.Concat(additionalComponents);
        }
    }

    this.MakeConsistent(this.components);
}

如果有人想要完整的样本或来源,请告诉我。

最好的问候,兹冯科

PS:以同样的方式,我还创建了计算主线程调用次数的性能计数器。

于 2012-12-28T08:39:59.690 回答