5.3.2 明确命名空间所有权

当你选择了一个子命名空间下进行开发,请告知父命名空间的负责人(你懂得)。假设你开始了一个项目是sloths下的hats,请确保这个Sloth项目的负责人知道是你在用sloth.hats。
外部代码和内部代码使用不同的命名空间。
“外部代码”指的是你的代码体系以外的可独立编译的代码,比如你用了一个外部库在 foo.hats.* 下,那你自己的内部代码就不应该再在其下面了,否则会导致产生冲突和难以维护。

foo.require('foo.hats');

/**
 * 错 -- 不要这样做
 * @constructor
 * @extend {foo.hats.RoundHat}
 */
foo.hats.BowlerHat = function() {
};

如果你需要在外部命名空间中定义新的API,那你应该通过显式的方法导出公共API函数。自身内部的代码需要使用这些API时,可以直接通过内部命名来调用,一是为了保持一致性,二是能让编译器更好的优化代码。

foo.provide('googleyhats.BowlerHat');

foo.require('foo.hats');

/**
 * @constructor
 * @extend {foo.hats.RoundHat}
 */
googleyhats.BowlerHat = function() {
  ...
};

goog.exportSymbol('foo.hats.BowlerHat', googleyhats.BowlerHat);