我有一个User::func()
(回调)函数,会被一个模板类(Library<T>
)调用。
在开发的第一轮中,每个人都知道func()
只为这个单一目的服务。
几个月后,大多数成员忘记了func()
是干什么的。
经过一些重构,func()
有时会被某些程序员删除。
起初,我认为这根本不是问题。
然而,在我多次重新遇到这个模式之后,我认为我需要一些对策。
问题
如何优雅地记录它?(可爱&&简洁&&没有额外的CPU成本)
例子
这是一个简化的代码:-
(真实世界的问题分散在10多个库文件&20多个用户文件&40多个函数中。)
Library.h
template<class T> class Library{
public: T* node=nullptr;
public: void utility(){
node->func(); //#1
}
};
User.h
class User{
public: void func(){/** some code*/} //#1
//... a lot of other functions ...
// some of them are also callback of other libraries
};
main.cpp
int main(){
Library<User> li; .... ; li.utility();
}
我的不太好的解决方案
1. 注释/文档
作为第一个解决办法,我倾向于添加这样的注释:
class User{
/** This function is for "Library" callback */
public: void func(){/** some code*/}
};
但是它很快就会变得混乱 - 我必须在每个类的每个“func”中都添加它。
2. 重命名“func()”
在实际情况中,我倾向于像这样给函数名称加前缀:
class User{
public: void LIBRARY_func(){/** some code*/}
};
很明显,但现在函数名非常长。
(特别是当Library
-class有更长的类名时)
3. 带有“func()=0”的虚拟类
我考虑创建一个抽象类作为回调的接口。
class LibraryCallback{
public: virtual void func()=0;
};
class User : public LibraryCallback{
public: virtual void func(){/** some code*/}
};
它给人一种func()
是用于某些相当外部的事情的感觉。:)
然而,我必须牺牲虚拟调用成本(v-table)。在性能关键的情况下,我无法承受。
4. 静态函数
(来自评论中的Daniel Jour的想法,谢谢!)
将近一个月后,这是我如何使用的:
Library.h
template<class T> class Library{
public: T* node=nullptr;
public: void utility(){
T::func(node); //#1
}
};
User.h
class User{
public: static void func(Callback*){/** some code*/}
};
main.cpp
int main(){
Library<User> li;
}
它可能更加清晰,但仍缺乏自我说明。
class Library{}
内部使用T* t
的方式来实现。我承认,在编写Library
时,虚拟类提供了很大的便利。 - javaLoverUser
类(具有不同的func
实现),对吗?如果func
"没有任何用处,因此被删除" 不是显而易见的话......那么也许最好不要将func
作为User
的成员函数,而是作为自由函数或某个“辅助”类的成员。 - Daniel Jour