2002年的冬天,我在北京聯通出差。剛參加工做,有點小緊張,給電腦接電源,插三孔插座的時候錯位60度,噗哧一下冒起了火花。沒有釀成事故,可是這件事情一直沒能忘記。其實國標的三孔操做在設計規範上已經考慮了這種錯誤,三個插孔的開口方向是不同的。問題出在插座上面,當時用的是萬能接線板,除了國標,歐標和美標也能插進去,所以國標插頭即使錯開60度,用點力氣也能插進去。此後到其餘地區出差,特別留意他們的插座,發現最安全的是歐標,三相插孔的設計兩陰一陽,根本沒有錯位的可能。前端
歐標插頭和插座java
歐標插座還有其餘優勢,好比最多調整90度就能夠對準;插頭做爲總體嵌入插座,不用擔憂金屬部分暴露漏電;圓柱狀金屬頭加球面前端設計,省力且牢固。這些暫且按下不表,今天想談的是程序設計語言中的安全措施。python
程序語言的插座–類型系統c++
最近用python開發過幾個小工具,頗爲趁手。緣由之一是python支持duck typing。能夠把任意類型的對象賦值給變量,運行時系統在訪問到這個對象的時候纔會判斷其類型是否正確。換句話說,實現了類級別的運行時多態(對比一下,C++/JAVA經過接口和虛函數支持函數級的運行時多態,而模板支持類和函數級別的編譯時多態)。安全
首先,不要求提早定義接口。能夠邊思考邊寫代碼,不用在接口部分和實現部分之間來回切換。數據結構
其次,不要求統一的對象界面。實現多態的時候不須要對象都是從統一接口上擴展出來的,對象能夠擁有隻在某些特定分支下會被調用的接口,其餘對象,若是不會命中這些分支,就能夠不用定義這些接口。若是習慣了c++/java,這種風格就是腦殘,可是對快速開發真的頗有效。想象一下,在靜態語言的OOD中,若是原來設計的統一接口知足不了需求,一般意味着概念抽象出了問題。樂觀狀況下,要麼擴展原有接口方法的內涵,並在調用者和被調用者之間從新分佈職責;要麼把沒法涵蓋的部分抽取出來,增長一個接口方法。函數
凡事必有兩面,首先是正確性不易驗證。類型錯誤只有程序運行時才能檢測出來,通電之後才能發現抽頭插錯了,用靜態語言,一樣的錯誤最晚編譯時就能檢查出來。工具
其次是理解代碼費力。閱讀靜態語言,看看數據結構、函數原型(C語言),或者類型/接口定義(C++/JAVA),對程序結構能瞭解個八九不離十。動態語言,非得把對象間的調用代碼讀完,才能把握程序的設計結構。編碼
JAVA是相反風格的表明,典型的「歐標插座」。不支持動態類型,更不支持內存這種「萬能插座」。作一件事情,JAVA只給你一種方法。url
語言設計和程序設計要考慮兩個認知因素,一是方便寫,一是方便讀。動態類型方便寫,靜態類型方便讀。動態語言編寫結構複雜,肯定性要求高的程序仍是面臨挑戰。語言沒有內置「歐標插座」,必然要求語言的使用者自律,尤爲是團隊協做開發時必須遵循一致的設計策略。
提高安全的語言特性
更多閱讀請點擊:鄭州白癜風醫院
更多閱讀請點擊:鄭州牛皮癬醫院
程序設計語言一直在往裏面添加安全特性。好比ANSI C添加對函數原型的支持(最古老的C語言只關心函數名字,不檢查返回值和參數類型,C的連接器如今還保留這樣的設計),const和static修飾符;C++連接器的隱式函數類型檢查,引用類型,類成員的可見性修飾;java對指針的棄用,package,等等。恰當使用這些特性,能夠把錯誤捕獲在編碼階段。
不止是軟件設計
但凡人會犯糊塗的地方,都是「歐標插座」的用武之地。只能單向打開的消防門,電腦機箱裏的各類接線纜接頭,優秀軟件的人機界面等等。程序設計語言和API,本質上是一種抽象的人機界面。程序語言是人和計算機之間的界面,API是人和另一堆代碼的界面。記得讀大學的時候,學校裏有個工業心理學實驗室,主任是如今阿里的王堅,他們的主要方向就是各類人機界面設計問題。