繁体   English   中英

应用一些基本宏来简化大型项目中的代码是一个好主意吗?

[英]Is it a good idea to apply some basic macros to simplify code in a large project?

我已经在基础c ++库上工作了一段时间,而且我有很多想法可以真正简化代码编写和管理过程。 其中之一是引入一些宏来帮助简化经常出现的语句,但比必要时复杂一点。

例如,我想出了这个基本宏来简化最常见的for循环类型:

#define loop(v,n) for(unsigned long v=0; v<n; ++v)

这将使您能够替换那些看起来如此笨重的笨重的循环:

for (int i = 0; i < max_things; i++)

使用更容易编写的内容,甚至更高效:

loop (i, max_things)

使用这样的约定是一个好主意吗? 使用不同类型的编译器可能会遇到任何问题吗? 对于不熟悉宏的人来说,这会让人感到困惑吗?

恕我直言,这通常是一个坏主意。 您实际上是将众所周知且理解的语法改变为您自己的发明。 不久你可能会发现你重新发明了这种语言 :)

我想说这取决于你是否希望其他人能够理解你的代码。 如果它只是你在那里,那么我没有看到宏的问题。

如果其他人必须要查看此代码,那么宏将导致问题。 另一个人不会知道他们是什么或他们做了什么(无论他们看起来多么可读和明显)并且当他们第一次遇到他们时将不得不去寻找他们。 结果将使您的代码对除了您自己以外的任何人都不可读 - 任何使用它的人都必须同时学习新的语言和程序。

而且,如果你希望代码成为一个不仅仅是你个人用途的库,那么它只是你处理代码的可能性几乎为零 - 那么我就不去做

不,不是个好主意。


  int max = 23;
  loop(i, ++max)...

但是,将常用代码重构为可重用组件然后重用而不是复制是一个好主意。 您应该通过编写类似于标准算法(如std :: find())的函数来完成此操作。 例如:


template < typename Function >
void loop(size_t count, Function f)
{
  for (size_t i = 0; i < count, ++i) f();
}

这是一种更安全的方法:


int max = 23;
loop(++max, boost::bind(....));

我想你已经用你的示例用法提供了一个强有力的论据来反对这个宏。 您将循环迭代器类型从int更改为unsigned long 这与你想要做多少打字无关,那么为什么要改变呢?

循环的繁琐指定了迭代器的起始值,结束值,类型和名称。 即使我们假设最后一部分将始终是++name ,并且我们很乐意坚持这一点,您有两种选择 - 删除一些灵活性或每次都输入。 您已经选择去除灵活性,但您似乎也在代码库中使用了这种灵活性。

在Unix中,我发现当我想要为命令创建一个别名时,我一直使用命令,我的命令就在我的手指上,而且我记得别名的语法比原始命令更难。

这同样适用于此 - 当你使用成语这么多以至于你想为它创建一个宏时,这个成语会在你的手指上,并且比你输入代码更让你感到痛苦。

摆脱for循环通常是一个好主意 - 但用宏替换它们不是。 我会仔细查看标准库算法。

这是一个你在哪里获得价值的问题。 在你的循环中输入那15个额外的字符真的会减慢你的开发速度吗? 可能不是。 如果你有多行令人困惑,不可避免的样板弹出到处,那么你可以而且应该寻找避免重复自己的方法,例如创建有用的函数,清理类层次结构或使用模板。

但是相同的优化规则适用于编写代码来运行它:优化小事情而效果不大并不能很好地利用时间或精力。

Steve Jessop提出了一个很好的观点。 宏有它们的用途。 如果我可以阐述他的陈述,我甚至会说,支持或反对宏的论据归结为“它取决于”。 如果你没有仔细考虑制作你的宏,你就有可能让未来的维护者的生活变得更加艰难。 另一方面,使用wxWidgets库需要使用库提供的宏来将代码与gui库连接。 在这种情况下,宏降低了使用库的入口门槛,因为魔法的内部与理解如何使用库无关,因此远离用户。 在这种情况下,用户不必理解他们真正不需要知道的事情,并且可以认为这是对宏的“好”使用。 此外,wxWidgets清楚地记录了如何使用这些宏。 因此,请确保您隐藏的内容不是其他人需要了解的内容。

或者,如果仅供您使用,请将自己敲开。

除了其他人提到的维护/理解问题之外,您还将很难打破并单步执行宏代码。

我认为宏可能被接受的一个领域是用常量/文字填充大型数据结构(当它可以节省过多的输入时)。 您通常不会单步执行此类代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM