这是否有效,我应该以更好的方式使用封装吗?

时间:2016-10-14 12:24:52

标签: c# encapsulation

这是代码。请在本文底部查看我的问题。

public partial class myClass : Other.Class
    {
        long check1parameter = CurrentSession.CurrentFile.ID;

        protected override void EnquiryLoaded(object sender, System.EventArgs e) 
        {
            disableFields();
        }
        private void disableFields() 
        {
            if (checkEverything()) {
                EnquiryForm.GetControl("Status").Enabled = true;
            }
        }

        public bool check1_method(long check1parameter) {
            bool Check1 = false;
            string stringToCheck = check1parameter.ToString();
            if (stringToCheck.Contains("something")) {
                    Check1 = true;
                }
            return Check1;
        }

        public bool checkEverything() {
            bool roleCheck = CurrentSession.CurrentUser.IsInRoles("RequiredRole");
            bool check1 = check1_method(check1parameter);
            bool checkEverything = false;
            if (roleCheck && check1) {
                checkEverything = true;
            } 
            return checkEverything;
        }
        //other methods
    }

代码是检查某人是否有角色,以及字符串是否包含一些信息,然后禁用字段。我已从实际代码中简化了这一点,以概述关键点。虽然目的只是运行这些简单的检查并禁用字段,但我认为最好为这些任务创建单独的方法,以便以后可以扩展它们。

我确实得到了一个对象引用错误,在该位置定义了long check1parameter。它在check1_method()并且正常工作但是我想要宣布一次并且如果可能的话在多个区域使用它。

我还想将参数\变量传递给check1_method,而不是在其中声明它们。什么是使check1parameter可用于此分部类中的所有方法的最佳方法?它指的是另一个以某种方式链接到Other.Class的类。

我的主要问题是 - 如何尽可能提高效率?我应该在private使用public代替AA吗?我仍然是C#的新手,还没有完全找到封装,所以请放轻松我吧! :)

2 个答案:

答案 0 :(得分:1)

myClass不需要声明为部分,除非您打算继续在其他文件中实现它。

当使用简单的if语句时,可以删除它们,例如你可以写:

public partial class myClass : Other.Class
    {
        long check1parameter = CurrentSession.CurrentFile.ID;

        protected override void EnquiryLoaded(object sender, System.EventArgs e) 
        {
            disableFields();
        }
        private void disableFields() 
        {
            EnquiryForm.GetControl("Status").Enabled = checkEverything();
        }

        public bool check1_method(long check1parameter) {
            return check1parameter.ToString().Contains("something");
        }

        public bool checkEverything() {
            bool roleCheck = CurrentSession.CurrentUser.IsInRoles("RequiredRole");
            bool check1 = check1_method(check1parameter);

            return (roleCheck && check1);
        }
        //other methods
    }

为了避免宣布不必要的bool。除此之外,您将牺牲可读性来减少线路。

对于公共与私有,除非您需要从课堂外访问私有,否则始终指定私有是一种很好的做法。乍看之下,disableFields()应该是公开的,check1_method()checkEverything()应该是私密的。

编辑: 此外,如果check1parameter全局实例化为myClass,那么您不需要将其作为参数传递给check1_methods()

答案 1 :(得分:1)

您提供的代码看起来不错。我做了一些改变,主要是代码美学。主要是将2个检查方法转换为属性。

public partial class myClass : Other.Class
{
    long check1parameter = CurrentSession.CurrentFile.ID;

    protected override void EnquiryLoaded(object sender, System.EventArgs e)
    {
        disableFields();
    }

    private void disableFields()
    {
        if (checkEverything)
        {
            EnquiryForm.GetControl("Status").Enabled = true;
        }
    }

    // the parameter name was the same as a variable in the class
    // renamed to avoid confusion
    public bool check1_method
    {
        get {return check1parameter.ToString().Contains("something");}
    }

    public bool checkEverything
    {
        get { return CurrentSession.CurrentUser.IsInRoles("RequiredRole") 
            && check1_method; }
    }
    //other methods
}