不是字符串的东西

2020-08-22 07:50:47

作为程序员,我们有一种集体错觉,认为任何可以表示为字符串的东西都是字符串。这种想法造成了一大堆问题。

让我们以SQL为例。我见过的每种编程语言的每个API都将SQL语句视为字符串。

此API的问题在于,并不是每个字符串都是有效的SQL(有时也不是您真正想要运行的SQL)。

这里的根本问题不是缺乏卫生。问题是SQL被视为字符串。

再来看看JSON的另一个例子。您当然可以通过这样做来实现将项添加到散列中(我希望这段代码会让您感到畏缩):

函数addKeyValue(json,key,value){return json.substr(0,json.length-1)+';,";';+key+';";:";';+value+';";}';;}。

与SQL示例一样,您可以添加转义和清理,但这只是隐藏了真正问题的黑客:

字符串可以是事物的表示,但它不是事物本身。

而且这不仅仅是关于连接字符串。你能找出这个功能有什么问题吗?(见答案)。

字符串的级别较低,因此比它们在较高级别的概念上正确实现有效操作所需的灵活性要高得多。

如果您不再将所有可以表示为字符串的东西都视为字符串,那么您可以省去很多麻烦。

OO和FP样式都允许将某些东西抽象为类型或类。您可以为该对象创建一个封闭的不透明结构,并限制其构建方式。

例如,对于SQL,您可能希望确保它只从静态字符串文字创建。

//允许新建SQL(';SELECT*FROM POSTS WHERE ID=?';);//不允许(例如通过LINT规则)新建SQL(';SELECT*FROM POSTS';+FILTER);

当然,在某些情况下,您需要将其序列化为字符串,才能将其传递到专为使用字符串而设计的API中。在可能的最后时刻执行此操作,并尝试将其限制在代码库中的单个位置。

字符串正在从外部世界进入您的应用程序。不要相信他们看起来是什么样子。尽快将它们转换成正确的东西,并尽可能晚地将它们转换回字符串。

这里有几个库,帮助您获得如何将事物视为…的灵感。事情:

嗨!。我叫亚历克斯。我是Facebook的一名软件工程师,在那里我从事Reaction、Native、Oculus和Messenger的工作。我喜欢思考发展经验。