Computer science 为什么取消引用不是为了安全而设计的?

Computer science 为什么取消引用不是为了安全而设计的?,computer-science,Computer Science,今天,我(再次)取消了对一个未定义对象属性的引用,导致了服务器的严重崩溃。解决这个问题包括编写我最不喜欢的样板代码之一,turning if(foo.bar.baz.id){… 进入 if(foo&&foo.bar&&foo.bar.baz&&foo.bar.baz.id){… 因为在边缘情况下,baz恰好是null,这引发了一个异常 所以我的问题是:为什么取消对null/undefined的引用会出现这样的问题?为什么foo.bar.baz.something/code>在foo/bar//b

今天,我(再次)取消了对一个未定义对象属性的引用,导致了服务器的严重崩溃。解决这个问题包括编写我最不喜欢的样板代码之一,turning

if(foo.bar.baz.id){…

进入

if(foo&&foo.bar&&foo.bar.baz&&foo.bar.baz.id){…

因为在边缘情况下,
baz
恰好是
null
,这引发了一个异常

所以我的问题是:为什么取消对null/undefined的引用会出现这样的问题?为什么
foo.bar.baz.something/code>在
foo
/
bar
/
/
baz
未定义的时候不安全地返回
undefined
呢?我理解技术上的原因,并且对语言设计为什么感兴趣?有没有安全的取消引用的语言引用?是不是有一个真正的CS原因来解释为什么没有,或者只是传统(继承的形式C和它的老朋友)

我能想到一个原因,那就是有更多的“类型检查”-动作中的样式逻辑与解引用一样经常执行,可以大大降低语言的速度。但是,我也认为,通过在赋值/if/etc运算符中进行适当的异常处理,可以解决大多数问题,这样解引用就可以按原样继续进行,“更高级别”操作员负责处理偶尔出现的“Oopise”

我能想到的另一个原因是,对于如何处理这个问题,实现某种规则集是过于固执己见的语言设计决策


我非常感谢任何CS人员对这个问题的解释。

您所描述的不是延迟的合理性/安全性,而是我所说的意思,即如果一个操作不以空值n作为输入,其结果就是n,而不进行任何计算

也许你更熟悉C#或the中的术语。
就操作而言,即使是一元行为

由于性能原因,像C这样的语言没有空传播,在任何遵从之前添加分支会大大降低速度。
其他语言的定义也不同,因为它们有不同的用途(例如,SQL用于数据,需要使用空标记)或不同的历史记录(Objective-C来自SmallTalk,其中对象没有被延迟,而是发出信号,因此向任何对象发送消息都是无效的,并且不起任何作用)


空检查的负担并没有因为空传播而减轻,甚至更糟。
有时很方便,但大多数情况下它违反了“快速失败”的规则

是否承认。
解决方案是使用Haskell或java或C++中的或C++中的。 Null不是值,也没有类型,而上面的所有解决方案都是值且有类型。
与模式匹配或模式匹配的近似值相结合,它们使用起来非常流畅,非常适合于自我记录代码。

它们也可以安全使用(对于语言的类型系统允许的情况)

首先想到的是性能问题:如果访问成员字段隐式地验证了所有包含的对象都是有效的,那么OOP与非OO编程相比本质上是慢的(如果一个字段的值是从另外两个字段计算出来的,那么整个对象的有效性将至少检查三次)。而这可以优化(通过每次操作只检查对象的有效性一次,除非使用了该语言的
volatile
或等效语言),并不是所有的编译器都能同样熟练地进行优化。“有没有安全的解引用语言?”-是的。