JavaScript RORO 模型:
RORO:即函数的参数和返回值都为单个对象。
编写可读性更好的函数的方法
代码的可读性很重要。开发人员花很多时间阅读代码:其他人的代码,我们自己的代码,我们从未见过的代码,等等。以一种尽可能易读的方式编写代码可以帮助团队中的每个人节省大量时间。可读性有时需要在性能上做一些权衡,但我尽量尽量保持可读性。
我非常喜欢Javascript的一个模式是RORO模式,即接收对象、返回对象。该模式的要点如下:函数应该始终接受一个对象作为其参数,并始终返回一个对象作为其结果。然后我们将解构参数和返回,以获得更有表现力的方式来知道函数的进出。接收对象作为我编写的所有函数的标准是我在学习Python并获得kwargs的经验后开始做的事情,我非常喜欢它,因为它使它很容易知道
考虑下面的函数调用:
const item = await getItemFromCollection(54391, 'shop');
这是我尝试避免写的函数类型。这个函数有一个足够描述性的名称,我们可以假设它将从集合中获取一个项。然而,剩下的信息是什么意思呢?我们可以试着做一些有根据的猜测;54391看起来像一个id, shop可能是一个集合的名称。但我们不能肯定这两种方法,为了完全理解接口,我们必须在代码库中找到函数声明。
async function getItemFromCollection(id, collectionName) {
// do something
}
所以我们必须遍历代码库,我们找到了函数,但这花了一些时间。如果我们使用RORO模式编写这个函数,就可以消除这样做的需要。
async function getItemFromCollection({ id, collectionName }) {
// do something
};
const item = await getItemFromCollection({ id: 54391, collectionName: 'shop' });
通过解构参数对象,我们在声明函数时的语法在很大程度上是相同的。然而,以后在调用函数时,我们现在有了传递命名参数的方法。仅仅通过读取函数调用,我们就确切地知道不同的参数应该是什么,不需要再去查找函数的声明位置来获得上下文。参数的上下文现在是调用本身的一部分,我发现这样可读性更强,而且不需要再去翻阅源码或文档。
我开始采用这种模式的一个主要原因是,我非常不喜欢传入布尔参数。
类似这样:
someFunctionCall(false);
布尔函数提供的信息很少,看到很多人这样处理:
const variableNameDescribingBooleansPurpose = false;
someFunctionCall(variableNameDescribingBooleansPurpose);
someFunctionCall(/* comment describing the booleans purpose*/ false)
最好的解决方案是传入一个对象并进行解构。将直接传递到函数调用本身的内容的描述联系起来,这样就不需要做任何额外的事情来让你的代码具有很好可读性。
someFunctionCall({ booleanPurpose: false });
现在,这个模式有两部分。到目前为止,我们已经接触了接收对象部分,但仍然剩下返回对象。这与我们之前讨论过的类似;我们的函数会返回对象然后我们会立即进行解构以获得我们想要的数据。它的好处在于,它赋予了我们的函数一种某些语言拥有但Javascript本身并不支持的能力:一次返回多个项。
async function runProcess({ processName }) {
// run process on your server
// maybe you decide to cache the results of this process running
return { result, wasCached };
};
// destructuring off the result we can now have multiple items return from our function
const { result, wasCached } = await runProcess({ processName });
if (wasCached) {
// run another process
}
得到返回的对象比接收对象少得多。多个返回项非常好,但是我们会发现我们编写的应用只涉及到一个东西。在这种情况下,当您可以像往常一样将返回值存储在一个变量中时,需要对返回值进行解构,这是一项额外的工作。
我们发现其实在应用中最有用的部分是命名参数。我发现函数更容易阅读;特别是在处理多参数函数或接受布尔值的函数时。多个返回项也不错,但在更小众的情况下发挥作用。最终,这个模式是为了使我们的Javascript函数更加灵活。在学习了Python和Go并看到这些语言为它们的函数做了一些很好的事情之后,我开始采用这种编程风格。从其他来源获取灵感是学习和提高的好方法!
总结
整篇文章读下来,是在推荐我们:函数的入参和出参都是用Object形式设计,这样方便我们对函数的理解,降低阅读代码的成本,我个人也是偏向于这类方法,在特别是在写复杂应用的时候,这种形式的有点非常突出,值得一试!