我的团队没有任何经验丰富的JS开发人员,但是我们正在Node编写一个库,并得到了一个真正的JS开发人员的建议:"我们应该使js更加模块化 - 不要污染全局命名空间并使其更具可读性对新人说,"并告诉我们做以下事情:
module.exports = (function(){
return {
nameToExpose: functionToExpose
...
};
})();
Run Code Online (Sandbox Code Playgroud)
而不是
module.exports.nameToExpose = functionToExpose;
Run Code Online (Sandbox Code Playgroud)
有什么意义,如果有的话?后者不会制作任何本地声明,这些声明将由IIFE确定,即使它确实如此,它们将是模块文件的本地声明,而不是整个程序的全局声明require().
关于这个网站的一些谷歌搜索和挖掘并没有找到关于这个特定问题的任何答案,尽管我已经读过很多其他IIFE的解释(并且在上面的评论中总结了这些解释).一些测试肯定会发现后者实际上没有放入functionToExpose全局命名空间,尽管它的原始名称记录在函数类型本身中.
我需要配置Kafka 从不删除日志.看看他们的文档,我看到两种控制它的参数:
"log cleaner",在http://kafka.apache.org/documentation.html#compaction中描述.设置似乎可以log.cleaner.enable = false防止清理程序删除或压缩日志.
"日志保留"机制,在http://kafka.apache.org/documentation.html#configuration下描述log.retention.<time scales>.似乎设置log.retention.ms = -1信号无限保留.
我的问题是:
这两种机制之间有什么关系,这些只有两种,上述设置是否足以防止日志被删除?
我的问题,在最后一段,需要(在我看来)一些解释性设置.基本上,我想知道你是否可以避免使用模板而不是你创建所有你想成为的模板类而是从一个声明你将要使用的虚方法的基类继承,其中包括一个内存分配函数,当实现时,将返回指向派生(非基础)类型的指针.
C++似乎没有"通用基类"的概念,一切都是隐式派生的; 我想这个类定义如下:
class universal_base
{
};
Run Code Online (Sandbox Code Playgroud)
当然,现在我已经定义了它,我可以让我的所有类都来自它.然后,由于多态性,universal_base我传递的任何引用或指针将与模板参数基本相同:
template <typename T>
class C
{
T &x;
int f(T &y);
C(T &z): x(z + 1) {}
};
class C
{
universal_base &x;
int f(universal_base &y);
C(universal_base &z): x(z + 1) {}
};
Run Code Online (Sandbox Code Playgroud)
不同之处在于,在第一种结构中,表达式z + 1不能保证有效; 你只需告诉用户T必须超载operator+.在第二个结构中,我可以添加一个虚拟的运算符universal_base:
// in universal_base
public:
virtual universal_base& operator+(const universal_base &x) = 0;
Run Code Online (Sandbox Code Playgroud)
并使用typeid和dynamic_cast在实现中使争论正确.这样,编写格式错误的代码是不可能的,因为如果你没有实现,编译器会抱怨operator+.
当然,这样就无法声明非引用类型的成员:
class C: public universal_base
{ …Run Code Online (Sandbox Code Playgroud)