当前位置:  开发笔记 > 编程语言 > 正文

需要引用:预处理器使用是不好的OO练习

如何解决《需要引用:预处理器使用是不好的OO练习》经验,为你挑选了4个好方法。

我相信,预处理器指令的使用就像#if UsingNetwork是糟糕的OO实践 - 其他同事则没有.我认为,当使用IoC容器(例如Spring)时,如果相应编程,可以轻松配置组件.在此上下文中任一个属性格式IsUsingNetwork可由IoC容器或设置,如果"使用网络"实现的行为不同,该接口的另一种实现方式应当实现,并注射(例如:IService,ServiceImplementation,NetworkingServiceImplementation).

有人可以提供OO-Gurus的引用书籍中的参考资料,基本上是"如果你尝试配置应该通过IoC容器配置的行为,那么预处理器使用是不好的OO实践"?

我需要这种引用来说服同事重构......

编辑:我确实知道并同意在编译期间使用预处理程序指令更改目标平台特定代码很好,这就是预处理程序指令的用途.但是,我认为应该使用运行时配置而不是compiletime-configuration来获得良好的设计和可测试的类和组件.换句话说:使用#defines和#if超出它们的意图将导致难以测试代码和设计糟糕的类.

有没有人沿着这些方面阅读一些东西并且可以给我这样我可以参考?



1> Vojislav Sto..:

亨利斯宾塞写了一篇名为#ifdef Considered Harmful的论文.

此外,Bjarne Stroustrup本人在他的" C++的设计和演变"一书的第18章中对预处理器的使用表示不满,并希望完全消除它.但是,Stroustrup也认识到#ifdef指令和条件编译的必要性,并继续说明在C++中没有它的替代品.

最后,Pete Goodliffe在他的" Code Craft:The Writing of Writing Excellent Code"一书的第13章中给出了一个例子,即使用于其原始目的,#ifdef也会使你的代码变得混乱.

希望这可以帮助.但是,如果你的同事不会首先听取合理的论点,我怀疑书的引用会有助于说服他们;)


感谢您回来并随身携带这些书;-)

2> sastanin..:

恕我直言,你谈的是C和C++,而不是一般的OO实践.而C不是面向对象的.在这两种语言中,预处理器实际上都很有用.只需正确使用它.

我认为这个答案属于C++ FAQ:[29.8]你是说预处理器是邪恶的吗?.

是的,这就是我所说的:预处理器是邪恶的.

每个#define宏都有效地在每个源文件和每个范围内创建一个新关键字,直到该符号为#undefd.预处理器允许您创建一个始终被替换的#define符号,与{...}该符号出现的范围无关 .

有时我们需要预处理器,例如#ifndef/#define每个头文件中的包装器,但是应该尽可能避免."邪恶"并不意味着"永远不会使用".你有时会使用邪恶的东西,特别是当它们是"两个邪恶中的较小者"时.但他们仍然是邪恶的:-)

我希望这个来源足够权威:-)



3> Vojislav Sto..:

C#中的预处理程序指令具有非常明确定义和实际的用例.你专门讨论的那些,称为条件指令,用于控制代码的哪些部分被编译,哪些不是.

不编译代码部分和控制对象图通过IoC连接的方式之间存在非常重要的区别.让我们看一个现实世界的例子:XNA.当您开发计划在Windows和XBox 360上部署的XNA游戏时,您的解决方案通常至少有两个可在IDE中切换的平台.它们之间会有一些差异,但其中一个区别在于XBox 360平台将定义条件符号XBOX360,您可以在源代码中使用以下习语:

#if (XBOX360)
// some XBOX360-specific code here
#else
// some Windows-specific code here
#endif

当然,您可以使用策略设计模式来分解这些差异,并通过IoC进行实例化控制,但条件编译至少提供三个主要优势:

    您不提供不需要的代码.

    您可以在该代码的正确上下文中查看两个平台的特定于平台的代码之间的差异.

    没有间接开销.编译适当的代码,另一个不编译,就是这样.



4> Robert Gould..:

"预处理器是邪恶的化身,也是地球上所有痛苦的原因" -Robert(OO Guru)

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有