代码之家  ›  专栏  ›  技术社区  ›  RobertMGlynn

对每个方法的返回值的操作

c#
  •  2
  • RobertMGlynn  · 技术社区  · 14 年前

    我想做的是使用类中每个方法返回的值执行一些操作。

    例如,如果我有一个类顺序,它有一个方法

    public Customer GetCustomer()
    {
     Customer CustomerInstance = // get customer
     return CustomerInstance;
    }
    

    假设我想记录这些日志的创建-日志(customerInstance);

    我的选择(Afaik)是:

    1. 在返回对象之前,请在这些方法中调用log()。我不喜欢这个,因为如果在很多类中使用很多方法,它会变得很难处理。它也不是方法目的的内在部分。

    2. 使用composition或inheritance在order类上对日志调用进行分层,类似于:

      公用客户getCustomer()
      {
      customer customerInstance=this.originalCustomer.getCustomer(); 日志(客户立场);
      退货客户情况;
      }
      我不认为这能给我买超过1英镑的东西。

    3. 在每个返回类型上创建扩展方法:

      customer customerInstance=order.getCustomer().log();
      它也有同样多的缺点。

    我希望为返回的每个(或几乎每个)对象执行此操作,如果可能,自动执行,而不必编写双倍的代码量。我觉得我要么是在试图让语言去做它不应该做的事情,要么是没有意识到某些语言特性可以实现这一点。我们将非常感谢可能的解决方案。

    3 回复  |  直到 13 年前
        1
  •  0
  •   Fede    14 年前

    你应该查一下 Microsofts Enterprise Library .

    你可能会发现有用的 Policy Injection Application Block .

        2
  •  1
  •   ChrisF    14 年前

    你需要调查一下 Aspect Oriented Programming :

    通常情况下,一个方面作为代码分散或混乱,这使得理解和维护起来更加困难。由于函数(如日志)分布在可能使用其函数的多个不相关函数上(可能在完全不相关的系统、不同的源语言等中),因此它分散开来。这意味着更改日志可能需要修改所有受影响的模块。各个方面不仅与表示它们的系统的主线功能相混淆,而且也与彼此相混淆。这意味着改变一个关注点需要理解所有复杂的关注点,或者有某种方法可以推断出变化的影响。

    添加日志记录是这种方法的一种用途。

        3
  •  0
  •   Kay Zed    13 年前

    在我看来,你的选择1就是这样做的。即使这将在每个方法的末尾,也就是这样做的。我不会添加额外的模糊层,因为它不是一个方法的“内在目的”。

    顺便说一句,面向方面的编程正好解决了这个问题(参见Chrisf的答案),但是我们不再讨论C。