我是一名C++程序员,最近加入了一家使用大量C的新公司.当他们审查我的代码时,他们认为我过度设计了一些我完全不同意的事情.该公司正在做嵌入式系统中的所有事情,因此我的代码需要内存效率,但我正在做的事情不是CPU密集型的.我想知道你们怎么想我的设计.这是清单.
我有一些需要传递的数组,最终需要传递给一些C代码.我可以在这个地方传递一个指针和一个大小.但是我选择创建一个表示它的类 - 一个具有固定大小(我们知道最大大小)缓冲区的类,以及一个长度应始终<=缓冲区的大小,否则断言.通过这种方式,我可以只使用一个变量而不是两个变量来传递数组,如果将来最大的大小发生变化,我应该可以轻松地更改它.我没有为数组使用动态分配,因为它是嵌入式系统和内存分配可能会失败,我们不使用异常.该类可能少于30行代码,我在很多地方使用它.他们说我过度设计了它.
它们在C中有自己的容器实现.我需要使用其中一个,但我想隐藏所有详细的代码,远离我的主逻辑,所以我为它创建了一个包装类.包装类类似于stl,所以我有迭代器并且它在内部管理内存分配,但与stl不同,它在无法分配更多内存时返回错误代码.他们对这个问题的论点是我是唯一一个使用它的人,因此他们不希望它存在于存储库中.说实话,我发现这很愚蠢.
编辑:下面的类或多或少是我用于第1点的.我想要做的就是有一些东西可以传递而不会一直带着长度.
class A
{
static const MAX_SIZE = 20;
int m_Array[MAX_SIZE];
size_t m_Len;
public:
A(const int* array, size_t len)
{
assert(len <= MAX_SIZE);
memcpy(m_Array, array, len);
m_Len = len;
}
size_t GetLen() const { return m_Len; }
const int* GetArray() const { return m_Array; }
};
Run Code Online (Sandbox Code Playgroud)
首先要做的事情是:你加入了一家新公司,所以你可以期望你需要学会遵守他们的规则.你仍然是"新人",即使它更好,也会对你的"做事方式"产生一些阻力.习惯他们,慢慢融入自己和你的想法.
至于#1,传递指针+大小对于程序员来说无疑是一种痛苦,但它是最节省内存的方式.你的课程没有"过度"设计,但如果MAXSIZE在未来的某个时刻变得非常大,会发生什么?你的所有实例都会占用那么多空间,即使它们不需要.你可能会因为MAXSIZE改变而耗尽空间,即使没有什么需要这么大的空间.
关于#2,它是否是一个不必要的层(或许它更适合改进它们的包装而不是简单地再包装它?),但是这将归结为你如何与它们集成并提出建议.
总而言之,我不会称之为"过度设计",但在嵌入式情况下,您需要非常警惕通用代码以节省自己的努力与节省内存.
你可能是对的,但另一方面,如果公司中的每个人都认为他们不喜欢现有的API,并且每个人都设计了自己的垫片和辅助功能,只有他们使用过,那么维护就会很棘手.
如果您的数组包装器"过度设计",那么我会质疑代码审查者是否认为任何数量的设计都是可接受的.它看起来对我无害[*].我想你可能只是让它成为一个有两个公共成员的结构,并失去了阅读的好处.你的同事对整体的正确性有多敏锐?
我认为2的目标应该是就C API是直接使用C++还是包装来达成共识.如果它应该被包装(并且其参数可能非常强大,使用命名空间和RAII),设计一个每个人都将使用的包装器,并将其指定为"此模块的C++ API"而不是"C++包装器"模块用于这个其他模块".
其他人可能真的更喜欢API,通过更多的OO API或使用STL.遵循他们的约定将使他们最容易维护您的代码,只要他们的约定是坚实的C编程风格.C++是一种多范式语言,"具有有限数量的花里胡哨的C"并不是您习惯的范例.但它是一个有效的范例,如果它是现有代码库使用的那么你必须质疑你的公司现在需要的是一个单人革命,无论多么开明.
[*](API,也就是说.他们可能会怀疑它是否会被价值不合理地传递,以及每个实例是否都必须与最大的实体一样大.这就是你要与审稿人争论的全部内容,但与"过度设计"无关.