什么是胖接口?

Int*_*ion 2 c++

Ciao,我在电影行业工作,模拟和应用工作室效果.我可以问一下什么是胖界面,因为我听到有人在网上说这个?

编辑:Nicol Bolas 在这里说(我相信非常好的指针)

rel*_*xxx 6

很简单的解释在这里:

Fat Interface方法:除了核心服务(它是瘦接口的一部分)之外,它还提供了一组丰富的服务,可以满足客户端代码的常见需求.显然,对于这些类,需要写入的客户端代码量较小.

我们什么时候应该使用胖接口?如果一个类预计寿命很长,或者一个类预计会有很多客户端,那么它应该提供一个胖接口.


Max*_*sky 6

胖接口 - 一个具有更多成员函数和朋友的接口,而不是逻辑上必需的接口.TC++ PL 24.4.3 源码


Ton*_*roy 5

Maxim 引用 Stroustrup 的术语:

\n
\n

胖接口 - 具有比逻辑上必要的更多成员函数和朋友的接口。TC++PL 24.4.3

\n
\n

Maxim 没有提供任何解释,并且该问题的其他现有答案错误地解释了上述内容(或者没有 Stroustrup 引用该术语本身),因为该接口的含义可以说是具有过多成员的接口。 它不是。

\n

实际上,问题不在于成员的数量,而在于成员是否对所有实现都有意义

\n

这个微妙的方面在 Stroustrup 的术语表中并没有非常清楚地体现出来,但至少在我的旧版本 TC++PL 中 - 很清楚在文本中使用了该术语。一旦理解了差异,术语表条目显然与之一致,但“成员函数和友元数量超过逻辑上必要的数量”是一个测试,应该从逻辑接口的每个实现的角度进行应用。(我的理解也得到了维基百科的支持,无论它的价值如何;-o。)

\n

具体来说,当您有一个跨多个实现的接口,并且某些接口操作仅对某些实现有意义时,那么您就有一个胖接口,您可以在其中要求活动实现执行它不希望执行的操作,并且您必须通过一些“不支持”的发现或报告使界面变得复杂,这很快就会使编写可靠的客户端代码变得更加困难

\n

例如,如果您有一个Shape基类和派生CircleSquare,并考虑添加一个double get_radius() const成员:您可以这样做并拥有它throw或返回一些哨兵值,例如NaN-1如果调用Square- 那么您将拥有一个胖接口。

\n
\n

“Uncle Bob”在接口隔离原则 (ISP)(一种表示避免胖接口的SOLID原则)的背景下(我的黑体字)对其进行了不同的强调:

\n
\n

[ISP] 处理 \xe2\x80\x9cfat\xe2\x80\x9d 接口的缺点。具有 \xe2\x80\x9cfat\xe2\x80\x9d 接口的类是其接口不具有内聚性的类。换句话说,类的接口可以分为成员函数组。每个小组服务于不同的客户群。因此,一些客户端使用一组成员函数,而其他客户端则使用其他组

\n
\n

这意味着您可以拥有所有派生类都以非 noop 行为实现的虚拟函数,但如果通常使用该接口的任何给定客户端仅对其一组函数感兴趣,则仍将接口视为“胖”。例如:如果一个字符串类提供了正则表达式函数,并且 95% 的客户端代码从未使用过其中任何一个,特别是如果 5% 的客户端代码不倾向于使用非正则表达式字符串函数,那么您可能应该将正则表达式功能来自普通文本字符串功能。但在这种情况下,形成 2 组的成员函数功能有明显的区别,当您编写代码时,您会清楚地知道您需要正则表达式功能还是普通的文本处理功能。对于实际的std::string类,虽然它有很多函数,但我认为没有明确的函数分组,在最初只需要说之后,演变出需要使用某些函数(例如begin/ )会很奇怪/ 。我个人并不认为界面“胖”,尽管它很大。endinserterase

\n
\n

当然,这样一个令人回味的术语会被其他人用来表示他们认为应该表示的任何意思,因此网络包含比必要的界面更简单的使用示例也就不足为奇了,正如所证明的那样通过relaxxx答案中的链接,但我怀疑更多的人猜测其含义,而不是“受过教育”关于计算科学文献中先前用法的人......

\n