高手来看看这段C#代码该如何优化?

文西 发布于 2011/07/22 15:21
阅读 942
收藏 0
C#
        public event Action Begin;
        public event Action EndSucc;
        public event Action<string> EndFail;

        public void MethodA()
        {
            if (Begin != null)
                Begin();

            try
            {
                ///...
                ///...
                ///...

                if (EndSucc != null)
                    EndSucc();
            }
            catch (Exception ex)
            {
                if (EndFail != null)
                    EndFail(ex.Message);
            }
        }

        public void MethodB()
        {
            if (Begin != null)
                Begin();

            try
            {
                ///...
                ///...
                ///...

                if (EndSucc != null)
                    EndSucc();
            }
            catch (Exception ex)
            {
                if (EndFail != null)
                    EndFail(ex.Message);
            }
        }

这是很多方法的重复部分,但是我在想既然这么多重复的工作,有没有什么方法可以简化这样的写法而达到相同的效果?求指教。
加载中
0
笨蛋EGG
笨蛋EGG

还真没看懂有什么好优化的地方······

顶多再做私有方法用来调用各个事件(不过个人感觉没什么必要),不过这个对于程序执行本身并算不上什么优化吧,只是良好的编程习惯而已,多处使用同样的代码时,把这些代码集中成一个方法,通过调用方法来执行相关代码,这样如果这些代码有问题或需要改动时,你只需要改动一处而不是多处,这样也便于BUG的检查和调试等等……个人见解……

0
hikari
hikari

个人认为,如果像这样写便于阅读(如果c#也有像c语言的那种#define就好了

        enum MyMethod { a, b, c }

        public void MethodX(MyMethod x)

        {

            if (Begin != null)

                Begin();

            try

            {

                switch (x)

                {

                    case MyMethod.a:

                        //call MethodA_Impl()

                        break;

                    case MyMethod.b:

                        //call MethodB_Impl()

                        break;

                }

                if (EndSucc != null)

                    EndSucc();

            }

            catch (Exception ex)

            {

                if (EndFail != null)

                    EndFail(ex.Message);

            }

        } 

0
Gmail.com
Gmail.com

每次不都是只有注释掉的那些地方不同嘛,就把那些不同的地方包装成具体的方法

private void Foo1()
{
    //...
    //...
    //...
}

private void Foo2()
{
    //...
    //...
    //...
}

private void Foo3()
{
    //...
    //...
    //...
}
然后把其他的地方抽出来,将不同的内容方法包装为参数

        public void Method(Action action) 
        { 
            if (Begin != null) 
                Begin(); 

            try 
            { 
                action();

                if (EndSucc != null) 
                    EndSucc(); 
            } 
            catch (Exception ex) 
            { 
                if (EndFail != null) 
                    EndFail(ex.Message); 
            } 
        } 
调用的时候,这样就OK

Method(Foo1);
Method(Foo2);
Method(Foo3); 

0
Gmail.com
Gmail.com
其实说白了就是将方法作为参数传递给另一个方法而已
0
文西
文西

引用来自“笨蛋EGG”的答案

还真没看懂有什么好优化的地方······

顶多再做私有方法用来调用各个事件(不过个人感觉没什么必要),不过这个对于程序执行本身并算不上什么优化吧,只是良好的编程习惯而已,多处使用同样的代码时,把这些代码集中成一个方法,通过调用方法来执行相关代码,这样如果这些代码有问题或需要改动时,你只需要改动一处而不是多处,这样也便于BUG的检查和调试等等……个人见解……

对啊,在我的这种case中,我如何把我我分离的代码集中成一个方法呢(进入方法记录日志的事件调用和方法执行完毕的记录日志的事件调用,关键是中间间隔了每个方法体各自的自定义的业务逻辑代码)?
0
hikari
hikari

引用来自“zantesu”的答案

每次不都是只有注释掉的那些地方不同嘛,就把那些不同的地方包装成具体的方法

private void Foo1()
{
    //...
    //...
    //...
}

private void Foo2()
{
    //...
    //...
    //...
}

private void Foo3()
{
    //...
    //...
    //...
}
然后把其他的地方抽出来,将不同的内容方法包装为参数

        public void Method(Action action) 
        { 
            if (Begin != null) 
                Begin(); 

            try 
            { 
                action();

                if (EndSucc != null) 
                    EndSucc(); 
            } 
            catch (Exception ex) 
            { 
                if (EndFail != null) 
                    EndFail(ex.Message); 
            } 
        } 
调用的时候,这样就OK

Method(Foo1);
Method(Foo2);
Method(Foo3); 

如果你的方法的参数形式都一致的时候,这种方法也很好
Gmail.com
Gmail.com
就是看楼主那些不同的代码里,没有用到额外的参数,也没有生成的对象,所以才用的Action
0
文西
文西

引用来自“zantesu”的答案

每次不都是只有注释掉的那些地方不同嘛,就把那些不同的地方包装成具体的方法

private void Foo1()
{
    //...
    //...
    //...
}

private void Foo2()
{
    //...
    //...
    //...
}

private void Foo3()
{
    //...
    //...
    //...
}
然后把其他的地方抽出来,将不同的内容方法包装为参数

        public void Method(Action action) 
        { 
            if (Begin != null) 
                Begin(); 

            try 
            { 
                action();

                if (EndSucc != null) 
                    EndSucc(); 
            } 
            catch (Exception ex) 
            { 
                if (EndFail != null) 
                    EndFail(ex.Message); 
            } 
        } 
调用的时候,这样就OK

Method(Foo1);
Method(Foo2);
Method(Foo3); 

这里还有一个问题,我先前没说清楚,这里的foo1、foo2、foo3他们有可能有不同的返回值和不同的参数类型,在这里的话我又该如何处理呢?如果携程params object[] 类型的参数的话,又失去了面向对象的意义,可能导致方法参数传递错误但是编译依然通过的危险。
0
Gmail.com
Gmail.com

感觉上Foo1,Foo2,Foo3如果返回值不同,参数类型不同的话,似乎就不是同一类东西了...可以采用模版

假设有三个方法,都返回string类型,而其中一个参数是string,另一个方法的参数是int,最后一个方法的类型是DateTime,那么可以编写三个Foo方法的重载

private string Foo(string str)
{
    //...
    //...
    //...
}

private string Foo(int index)
{
    //...
    //...
    //...
}

private string Foo(DateTime date)
{
    //...
    //...
    //...
}

关键在于Method方法的实现

public string Method<T>(Func<T, string> func, T t) 
{ 
    if (Begin != null) 
        Begin(); 

    try 
    { 
        return func(t);

        if (EndSucc != null) 
            EndSucc(); 
    } 
    catch (Exception ex) 
    { 
        if (EndFail != null) 
            EndFail(ex.Message); 
    } 
} 

最后这样调用就OK

var str = Method(Foo, "Hello world");
var index = Method(Foo, 10086);
var date = Method(Foo, DateTime.Now);

返回顶部
顶部