我相信,预处理器指令的使用就像#if UsingNetwork是糟糕的OO实践 - 其他同事则没有.我认为,当使用IoC容器(例如Spring)时,如果相应编程,可以轻松配置组件.在此上下文中任一个属性格式IsUsingNetwork可由IoC容器或设置,如果"使用网络"实现的行为不同,该接口的另一种实现方式应当实现,并注射(例如:IService,ServiceImplementation,NetworkingServiceImplementation).
有人可以提供OO-Gurus的引用或书籍中的参考资料,基本上是"如果你尝试配置应该通过IoC容器配置的行为,那么预处理器使用是不好的OO实践"?
我需要这种引用来说服同事重构......
编辑:我确实知道并同意在编译期间使用预处理程序指令更改目标平台特定代码很好,这就是预处理程序指令的用途.但是,我认为应该使用运行时配置而不是compiletime-configuration来获得良好的设计和可测试的类和组件.换句话说:使用#defines和#if超出它们的意图将导致难以测试代码和设计糟糕的类.
有没有人沿着这些方面阅读一些东西并且可以给我这样我可以参考?
使用模板强制编译器初始化原始/ POD类型值是一种常见的模式(/sf/answers/804562111/或http://www.codeproject.com/Articles/825/Using-模板初始化).
出于安全原因,一旦超出范围,是否存在可用于擦除值的类似模式,以确保在变量被破坏后该值不会留在堆栈中?我担心一个天真的类似实现可能不起作用,因为编译器可以自由地忽略对超出范围的值的任何赋值,因为该值可以被简单地证明不再被使用.是否存在一些一致且合理的便携式解决方案,例如使用volatile?