Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在提出这些观点时,很少有人理解取舍或替代方案,而且他们的理解力不成比例。分析了人们在代码演化过程中遇到的一些麻烦,并合理地导出了解决这些问题的新设计方法。让我们稍后再回到是否有负面影响的问题,但首先值得一提的是,所讨论的问题通常很小且不常见:非成员函数只是设计可重用代码的一个小方面,在企业规模的系统中,我所做的工作就是简单地编写与非成员函数相同的代码,这很少足以使非成员可重用。对于他们来说,表达算法是非常罕见的,这些算法既复杂到值得重用,又不紧密地绑定到他们设计的类的特定部分,奇怪到几乎无法想象其他类会支持相同的操作和语义。通常,您还需要模板参数,或引入基类来抽象所需的操作集。两者在性能方面都有重大影响,即内联与外联、客户端代码重新编译_C++_Class Design - Fatal编程技术网

C++ 在提出这些观点时,很少有人理解取舍或替代方案,而且他们的理解力不成比例。分析了人们在代码演化过程中遇到的一些麻烦,并合理地导出了解决这些问题的新设计方法。让我们稍后再回到是否有负面影响的问题,但首先值得一提的是,所讨论的问题通常很小且不常见:非成员函数只是设计可重用代码的一个小方面,在企业规模的系统中,我所做的工作就是简单地编写与非成员函数相同的代码,这很少足以使非成员可重用。对于他们来说,表达算法是非常罕见的,这些算法既复杂到值得重用,又不紧密地绑定到他们设计的类的特定部分,奇怪到几乎无法想象其他类会支持相同的操作和语义。通常,您还需要模板参数,或引入基类来抽象所需的操作集。两者在性能方面都有重大影响,即内联与外联、客户端代码重新编译

C++ 在提出这些观点时,很少有人理解取舍或替代方案,而且他们的理解力不成比例。分析了人们在代码演化过程中遇到的一些麻烦,并合理地导出了解决这些问题的新设计方法。让我们稍后再回到是否有负面影响的问题,但首先值得一提的是,所讨论的问题通常很小且不常见:非成员函数只是设计可重用代码的一个小方面,在企业规模的系统中,我所做的工作就是简单地编写与非成员函数相同的代码,这很少足以使非成员可重用。对于他们来说,表达算法是非常罕见的,这些算法既复杂到值得重用,又不紧密地绑定到他们设计的类的特定部分,奇怪到几乎无法想象其他类会支持相同的操作和语义。通常,您还需要模板参数,或引入基类来抽象所需的操作集。两者在性能方面都有重大影响,即内联与外联、客户端代码重新编译,c++,class-design,C++,Class Design,也就是说,如果操作是按照公共接口实现的,那么在更改实现时,通常需要更少的代码更改和影响研究,并且作为非好友非成员系统地执行这些更改和影响研究。但有时,它会使初始实现更加冗长,或者在其他方面不那么理想和可维护 但是,作为一个试金石测试——这些非成员函数中有多少与它们当前适用的唯一类位于同一个头中?有多少人希望通过模板(即内联、编译依赖项)或基类(虚拟函数开销)来抽象参数以允许重用?两者都不鼓励人们将它们视为可重用的,但如果不是这样,类上可用的操作是非本地化的,这可能会挫败开发人员对系统的看法:开发

也就是说,如果操作是按照公共接口实现的,那么在更改实现时,通常需要更少的代码更改和影响研究,并且作为非好友非成员系统地执行这些更改和影响研究。但有时,它会使初始实现更加冗长,或者在其他方面不那么理想和可维护

但是,作为一个试金石测试——这些非成员函数中有多少与它们当前适用的唯一类位于同一个头中?有多少人希望通过模板(即内联、编译依赖项)或基类(虚拟函数开销)来抽象参数以允许重用?两者都不鼓励人们将它们视为可重用的,但如果不是这样,类上可用的操作是非本地化的,这可能会挫败开发人员对系统的看法:开发人员常常不得不自己解决一个相当令人失望的事实——“哦,那只适用于类X”

一句话:大多数成员函数都没有潜在的可重用性。许多公司代码并没有被分解成干净的算法和数据,因为前者有可能被重用。这种划分在未来20年里是不必要的、没有用的,或者可以想象是没有用的。它与get/set方法非常相似——它们在某些API边界上是必需的,但是当代码的所有权和使用被本地化时,它们可能会构成不必要的冗长


就我个人而言,我并没有一种“要么全有,要么全无”的方法,但我会根据这两者是否有任何可能的好处,即潜在的可重用性和接口的局部性来决定如何创建成员函数或非成员函数。

OpenCV库就是这样做的。它们有一个cv::Mat类,用于显示3D矩阵(或图像)。然后,它们在cv名称空间中具有所有其他函数


OpenCV库是一个巨大的库,在它的领域中得到了广泛的重视。

我也经常这样做,这似乎是有意义的,而且它绝对不会导致缩放问题。(尽管我目前的项目只有40000个LOC)事实上,我认为它使代码更具可伸缩性——它精简了类,减少了依赖性。 它有时要求您重构函数,使其独立于类的成员,从而经常创建一个更通用的助手函数库,您可以轻松地在其他地方重用这些函数。我还要提到的是,许多大型项目的一个常见问题是类的膨胀,我认为首选非成员、非友元函数也有帮助。

首选非成员、非友元函数进行封装,除非您希望隐式转换用于类模板、非成员函数(在这种情况下,你最好让他们成为朋友):

也就是说,如果您有一个类模板
type

那么,以下操作就不起作用了:

auto t = convertible_to_type<int>{};
foo(t);  // FAILS: cannot deduce type T for type
auto t=convertible_to_type{};
foo(t);//失败:无法为类型推断类型t

由于无法推断
T
,因此函数
foo
将从重载解析集中删除,即:找不到函数,这意味着隐式转换不会触发。

为什么它不能在大规模下正常工作?其唯一效果是对代码应用更多的结构,这通常是一件好事不幸的是,大多数大规模C++代码不是真正用C++编写的,而是在C的旧MISHASH和“C类”中编写的。。我能想到的最好的例子是Boost库。@jalf我不知道,但在小项目中运行良好的东西并不总是可以放大。只是寻找信息。@Michael Petrotta,praxis标签有什么问题?它是一个精确的术语,在软件工程中使用,准确地描述了我正在寻找的东西。也许你可以n建议一个替代品?@ergosys:当我查找这个词时,我发现唯一的定义是“应用想法或理论的过程”。我认为,这并不是这个问题的合适标签,就像“事实”、“错误”、“错误”或“编程”这样的词一样-太宽泛了。这个词对你来说意味着什么吗?不管怎样,我只是在整理-请随意再添加标记。好了,伙计们,你说服了我。我实际上认为应该有一个抽象标记的晶格,你可以连接到一个标记本体中,但这肯定是meta的一个主题。尽管我不喜欢string类有这么多的集合hods,存在
std::basic_string::*
方法是有原因的:它们将请求转发到
std::char_traits
,该方法使用可能更优化的字符串操作,如CISC处理器的操作,或真正快速的
strlen()
。需要做的是
template<class T>
struct convertible_to_type {
  operator type<T>() { }
};
auto t = convertible_to_type<int>{};
foo(t);  // t is converted to type<int>
template<class T>
void foo(type<T> a) {}
auto t = convertible_to_type<int>{};
foo(t);  // FAILS: cannot deduce type T for type