首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数据库检索的各种配置的重载处理程序

从数据库检索的各种配置的重载处理程序
EN

Code Review用户
提问于 2016-09-27 13:34:54
回答 2查看 368关注 0票数 2

我有一个开关语句,它根据从数据库中提取的数据引用不同的配置。配置的每一次迭代都有需要启用/修改的内容的变化。

我已经设置了一个方法,该方法接受每个配置的可变参数,并执行相关的逻辑,通常更改控件中的元素。我设置了4种重载方法,它们的控制类型各不相同。

代码语言:javascript
复制
        SchemeConfigurationItems scis = sm.GetSchemeConfiguration(sid, TriState.True);
        foreach (SchemeConfigurationItem sci in scis) {
            // One of solution, other configuration items should be single items rather than grouping such as this.
            switch (sci.ConfigurationTypeID)
            {
                case (int)ConfigurationType.GPDetails:
                     bool mandatory = sci.Mandatory;
                     pnlGP.Visible = true;

                     rfvGPName.Enabled = mandatory;
                     rfvGPPractice.Enabled = mandatory;
                     rfvGPPracticeAddress.Enabled = mandatory;
                     rfvGPPracticePostcode.Enabled = mandatory;

                     tbGPName.CssClass = MandatoryHandler(tbGPName.CssClass, mandatory);
                     tbGPPractice.CssClass = MandatoryHandler(tbGPPractice.CssClass, mandatory);
                     tbGPPracticeAddress.CssClass = MandatoryHandler(tbGPPracticeAddress.CssClass, mandatory);
                     tbGPPracticePostcode.CssClass = MandatoryHandler(tbGPPracticePostcode.CssClass, mandatory);
                     break;

                case (int)ConfigurationType.ReferralOwner:
                     configHandler(sci, ddlOwners, isReferralOwnerConfig, rfvOwners);
                     break;
                case (int)ConfigurationType.RequiresAssessmentsPassed:
                     break;
                case (int)ConfigurationType.ReferralDateReceived:
                     configHandler(sci, tbReferralReceivedDate, isReferralDateReceivedConfig, rfvReferralReceivedDate ,pnlReferralReceivedDate);
                     break;
                case (int)ConfigurationType.ReasonForReferral:
                     configHandler(sci, tbReason, isReasonForReferralConfig, rfvReason, pnlReason);
                     break;
                case (int)ConfigurationType.HealthCheck:
                     configHandler(sci, rblHealthCheck, isHealthCheckConfig, rfvHealthCheck, pnlHealthCheck);
                     break;
                case (int)ConfigurationType.PersonalSafety:
                     configHandler(sci, rblPersonalSafety, isPersonalSafetyConfig, rfvrblPersonalSafety, pnlPersonalSafety);
                     break;
                case (int)ConfigurationType.PersonalSafetyDetail:
                     configHandler(sci, tbPersonalSafety, isPersonalSafetyDetailConfig, rfvtbPersonalSafety, pnlPersonalSafetyDetail);
                     break;
                case (int)ConfigurationType.ServiceAwarenessMethod:
                     configHandler(sci, ddlServiceAwarenessMethod, isServiceAwarenessMethodConfig, pnl: pnlServiceAwarenessMethod);
                     break;
                case (int)ConfigurationType.ActivitySelection:
                     configHandler(sci, cbActivitySelection, isActivitySelectionConfig, pnl: pnlActivitySelection);
                     break;
                case (int)ConfigurationType.StatLog:
                     configHandler(sci: sci, pnl: pnlStatLog, def: "");
                     break;
            }
        }

这是开关语句的一部分,大约有50,这是一般流程的方式。

代码语言:javascript
复制
    public void configHandler(SchemeConfigurationItem sci = null, DropDownList ddl = null, bool Config = true, RequiredFieldValidator rfv = null, Panel pnl = null, string def = "")
    {
        if (pnl != null)
        {
            pnl.Visible = Convert.ToBoolean(sci.Active);
        }
        if (Convert.ToBoolean(sci.Active))
        {
            Config = true;

            if (ddl != null)
            {
                ddl.CssClass = sci.CssClass != String.Empty ? sci.CssClass : ddl.CssClass;
                ddl.ToolTip = sci.ToolTip != String.Empty ? sci.ToolTip : ddl.ToolTip;
                ddl.CssClass = MandatoryHandler(ddl.CssClass, rfv.Enabled);
            }

            if (rfv != null)
            {
                rfv.Enabled = Convert.ToBoolean(sci.Mandatory);
                rfv.ErrorMessage = sci.ErrorMessage != String.Empty ? sci.ErrorMessage : rfv.ErrorMessage;
            }
        }
    }

    public void configHandler(SchemeConfigurationItem sci = null, TextBox tb = null, bool Config = true, RequiredFieldValidator rfv = null, Panel pnl = null)
    {
        if (pnl != null)
        {
            pnl.Visible = Convert.ToBoolean(sci.Active);
        }
        if (Convert.ToBoolean(sci.Active))
        {
            Config = true;

            if (tb != null)
            {
                tb.CssClass = sci.CssClass != String.Empty ? sci.CssClass : tb.CssClass;
                tb.ToolTip = sci.ToolTip != String.Empty ? sci.ToolTip : tb.ToolTip;
                tb.CssClass = MandatoryHandler(tb.CssClass, rfv.Enabled);
            }

            if (rfv != null)
            {
                rfv.Enabled = Convert.ToBoolean(sci.Mandatory);
                rfv.ErrorMessage = sci.ErrorMessage != String.Empty ? sci.ErrorMessage : rfv.ErrorMessage;
            }
        }
    }

    public void configHandler(SchemeConfigurationItem sci = null, RadioButtonList rbl = null, bool Config = true, RequiredFieldValidator rfv = null, Panel pnl = null)
    {
        if (pnl != null)
        {
            pnl.Visible = Convert.ToBoolean(sci.Active);
        }
        if (Convert.ToBoolean(sci.Active))
        {
            Config = true;

            if (rbl != null)
            {
                rbl.CssClass = sci.CssClass != String.Empty ? sci.CssClass : rbl.CssClass;
                rbl.ToolTip = sci.ToolTip != String.Empty ? sci.ToolTip : rbl.ToolTip;
                rbl.CssClass = MandatoryHandler(rbl.CssClass, rfv.Enabled);
            }

            if (rfv != null)
            {
                rfv.Enabled = Convert.ToBoolean(sci.Mandatory);
                rfv.ErrorMessage = sci.ErrorMessage != String.Empty ? sci.ErrorMessage : rfv.ErrorMessage;
            }
        }
    }

    public void configHandler(SchemeConfigurationItem sci = null, CheckBoxList cbl = null, bool Config = true, RequiredFieldValidator rfv = null, Panel pnl = null)
    {
        if (pnl != null)
        {
            pnl.Visible = Convert.ToBoolean(sci.Active);
        }
        if (Convert.ToBoolean(sci.Active))
        {
            Config = true;

            if (cbl != null)
            {
                cbl.CssClass = sci.CssClass != String.Empty ? sci.CssClass : cbl.CssClass;
                cbl.ToolTip = sci.ToolTip != String.Empty ? sci.ToolTip : cbl.ToolTip;
                cbl.CssClass = MandatoryHandler(cbl.CssClass, rfv.Enabled);
            }

            if (rfv != null)
            {
                rfv.Enabled = Convert.ToBoolean(sci.Mandatory);
                rfv.ErrorMessage = sci.ErrorMessage != String.Empty ? sci.ErrorMessage : rfv.ErrorMessage;
            }
        }
    }

下面是重载的方法,您可以看到所有参数都是可选的,以允许各种配置。有些人可能会注意到第一个方法中的string def = "",在本例中,如果没有包含键参数,则实现这个方法是为了针对一个默认方法-- Control。

我正在寻找使解决方案更整洁、更干净和更小的方法。

EN

回答 2

Code Review用户

发布于 2016-09-27 14:27:20

  • SchemeConfigurationItem sci = null参数不需要是可选的,因为您总是传递一个不能是null的参数。
  • 基于命名指南的.NET方法应该使用PascalCase大小写来命名。
  • 在每个重载方法if (rfv != null) { rfv.Enabled = Convert.ToBoolean(sci.Mandatory);rfv.ErrorMessage = sci.ErrorMessage != String.Empty?sci.ErrorMessage : rfv.ErrorMessage;}应该将其提取到单独的方法中,以删除代码重复。在一个地方改变某件事比在多个地方改变它更容易,也许会忘记一个。
  • 你真的应该研究事物的命名。找到好的和描述性的名称是一项艰巨的任务,但是如果您或维护人员Sam必须修复一个bug,那么它将节省大量的时间。像scipnlGP这样的名字不会告诉你它是关于什么的。
  • 如果您反转了条件If (Convert.ToBoolean(sci.Active)),您可以提前返回并保存一个缩进级别,这样代码就更容易读了,例如if (!Convert.ToBoolean(sci.Active)) { save;}
票数 3
EN

Code Review用户

发布于 2016-09-27 15:22:29

所有的configHandler方法都只有一个参数不同,而且它们都是相同的。您还对每个控件使用相同的属性(第二个参数)。

您应该为它创建一个接口。

代码语言:javascript
复制
public interface IStyleable
{
    string CssClass { get; set; }
    string ToolTip { get; set; }
}

您将通过一个包含所有参数的configHandler类传递给单个ConfigProperties

代码语言:javascript
复制
public void configHandler(ConfigParameters configParams = null)
{
    configParams = configParams ?? new ConfigParameters();

    if (configParams.Panel != null)
    {
        configParams.Panel.Visible = Convert.ToBoolean(configParams.SchemeConfigurationItem.Active);
    }


    if (Convert.ToBoolean(configParams.SchemeConfigurationItem.Active))
    {
        Config = true;

        if (configParams.Control != null)
        {
            configParams.Control.CssClass = string.IsNullOrEmpty(configParams.SchemeConfigurationItem.CssClass) ? configParams.Control.CssClass : configParams.SchemeConfigurationItem.CssClass;
            configParams.Control.ToolTip = string.IsNullOrEmpty(configParams.SchemeConfigurationItem.ToolTip) ? configParams.Control.ToolTip : configParams.SchemeConfigurationItem.ToolTip;
            configParams.Control.CssClass = MandatoryHandler(configParams.Control.CssClass, configParams.RequiredFieldValidator.Enabled);
        }

        if (configParams.RequiredFieldValidator != null)
        {
            configParams.RequiredFieldValidator.Enabled = Convert.ToBoolean(configParams.SchemeConfigurationItem.Mandatory);
            configParams.RequiredFieldValidator.ErrorMessage = string.IsNullOrEmpty(configParams.SchemeConfigurationItem.ErrorMessage) ? configParams.RequiredFieldValidator.ErrorMessage : configParams.SchemeConfigurationItem.ErrorMessage;
        }
    }
}

这样,您就可以单独配置每个参数,而不必显式地将其他参数设置为null:

代码语言:javascript
复制
configHandler(new ConfigParameters 
{
    SchemeConfigurationItem = ..., 
    Control = someCheckBoxList 
});

这些参数是:

代码语言:javascript
复制
public class ConfigParameters
{
    public SchemeConfigurationItem SchemeConfigurationItem { get; set; }
    public IStyleable Control { get; set; }
    public bool Config { get; set; }
    public RequiredFieldValidator RequiredFieldValidator { get; set; }
    public Panel Panel { get; set; }
}
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/142604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档