题
这里是一个问题,我已经挣扎,自从我第一次开始学习对象为导向的程序:应该怎样一个实施一个记录仪中的"适当的"面向对象的代码?
通过这个,我的意思的对象,有一个方法,我们希望每一个其它的对象在代码,以便能够访问;这种方法将会输出到控制台/文件/无论,我们用于记录--因此,这个目的,将该记录器的对象。
我们不希望建立记录仪的对象是作为一个全球性变量,因为全球变量都是不好的,对吗?但是,我们也不希望有的通过记录仪对象的参数的每一个方法我们呼吁在每个单独的对象。
在大学的时候我把这个给的教授,他不能真正给我一个答案。我认识到,有实际上的软件包(为说,Java)可能实现这一功能。我最终在寻找的,但是,知识如何正确和面向对象的方式实现这个我自己。
解决方案
你的 做 要建立记录仪作为一个全球性变量,因为全球变量 不 坏。至少,他们不是具有固有坏。一个记录仪是一个很好的例子的适当利用全球可访问的对象。阅读有关的单独的设计图案,如果你想要更多的信息。
其他提示
有一些很好的想出来的解决方案。一些涉及绕过OO和使用另一机制(AOP).
记录并不真正适合自己太好OO(其是好,不是一切)。如果你有执行它自己,我建议只是实例"记录"在每个班:
私人的最终日志=new日志(这个);
和你所有的记录电话都是那么微不足道的:日志。print("嘿");
这使它更容易使用,比辛格尔顿。
有记录仪图出什么类你是在传递和使用,对注释的日志。因为你然后有一个实例的记录,你可以那么喜欢做的事情:
日志。addTag("法案");
和记录可以添加标记的法案向每个条目,以便可以实现更好的过滤你的显示器上。
log4j和电锯是一个完美的解决方案,虽然--如果你不只是学术、使用这些。
全球可访问的记录是一个疼痛的测试。如果你需要一个"集中"记录工具创建的,它对程序启动时并注入到课程/方法,需要记录。如何做你的测试方法,使用这样的事情:
public class MyLogger
{
public static void Log(String Message) {}
}
你怎么替代它有一个模拟?
更好:
public interface ILog
{
void Log(String message);
}
public class MyLog : ILog
{
public void Log(String message) {}
}
我总是用单一的模式来实施一个记录的对象。
你看起来可能在单一的模式。
创建记录仪作为一个单独的类,然后访问它使用一种静态的方法。
我觉得你应该使用AOP(面向方面编),用于这一点,而不是面向对象.
在实践中一个单独的/全球的方法工作得很好,在我的意见。最好全球的事情只是一个框架,这可以连接不同听众(观察员的模式),例如一个用于控制台输出,一个数据库输出,一个适用于Windows的事件日志产出,等等。
当心重复设计虽然,我发现,在实践中一个单一类的公正的全球方法可以工作的相当不错。
或者你可以使用基础设施的特定框架的工作中提供。
的 企业库记录应用程序块 来自微软的模式与实践小组是一个很好的例子实施一个记录框架,在一个面向对象的环境。他们有一些伟大的文件如何,他们已实施他们的日志应用程序块和所有源代码可用于自己的审查或修改。
还有其他类似的实现: log4net,log4j,log4cxx
他们的方式他们已实施企业的库记录应用程序块是有一个静态的 Logger
类与数量的不同方法的实际执行日志操作。如果你是在寻找模式,这可能是一个更好用途的单一模式。
我所有的AOP一起log4*.这真的帮了我们。谷歌给我 这篇文章 为实例。你可以尝试寻找更多的关于这个问题的。
(恕我直言)如何记录',会发生不是解决方案的一部分设计的,它的更多的一部分,无论环境的可运行的系统和历。
你的"好"解决方案是一个,是因为松散耦合的任何特定记录执行情况作为可能因此认为的接口。我会查出来的线索 在这里, 例如太阳解决它,因为他们可能想出了一个很好的设计和奠定了所有你要学!
使用静态的类,它已经最少开销,并可从所有项目类型在一个简单的大会参考
注意一个单一实例是相当的,但涉及不必要的分配
如果使用多个应用程序域,小心,你可能需要一个代理对象访问静态分类领域的其他主要的一个
此外,如果你有多线程可能需要锁周围的记录日志的功能,以避免交织的产出
恕我直言记录是不够的,这就是为什么我写了 冷静
祝你好运!
也许插入记录在一种透明的方式而不是将属于方案向编程成语。但我们正在谈论OO设计的在这里...
单一的模式可能是最有益的,在我的意见:你可以访问的记录服务的来自任何方面通过一个公共的,静态的方法的一个LoggingService类。
虽然这可能看起来很像一个全球性可变的,它不是:它是适当封装在单独的类,并不是每个人都有机会接触到它。这使你能够改变的方式记录处理,甚至在运行,但保护工作的记录从'维兰'的代码。
在系统中,我工作上,我们创建了一个数量的记录'单',在便能够区分信息来自不同的子系统。这些可以交换关于/在运行时,过滤器可以被定义,书面文件是可能的...你的名字。
我已经解决了这个在过去通过增加一个实例的记录类的基类(es)(或接口,如果语言支持)对于这类需要访问的记录。当你登的东西,记录来看,目前的呼叫叠和确定调用的代码,设置适当的元数据有关的记录的声明(来源的方法、行代码,如果可行,类记录,等等)。 这样一个最小类数有记录仪和记录仪并不需要具体用与元数据,可以自动确定。
此 做 添加相当大的开销,所以它不一定是一个明智的选择的生产记录,但方面的记录可以禁止有条件的如果你设计了它在这样一种方式。
实际上,我用公共记录的大部分时间(我做了很多工作java),但也有方面的设计我上所述,我找到有益的。的好处具有稳健的记录系统,其他人已经花费了大量时间的调试已经超过了需要什么可以被认为是一个吸尘器的设计(即显然是主观的,尤其是鉴于缺乏详细地在这个员额)。
我有问题的静态记录器造成的永久代存问题(至少我 想想 那是什么的问题),所以我可能会重新记录仪。
为了避免全球变量,我提议创建一个全球性的注册和注册globals。
为记录,我愿意提供一个单独的类或一类,它提供了一些静态的方法,用于记录。
实际上我会用一个现有的记录框架。
一个其他可能的解决方案是有一个日志类封装的记录/存储的过程。这样你可以只是一个实例 new Log();
每当你需要它,而不必使用单独.
这是我的首选解决方案,因为只依赖你需要注入的数据库如果你登录通过数据库。如果你使用文件潜在的你不需要注入任何的依赖。你也可以完全避免的全球或静态记录类/职能。