php - 強類型語言 - 靜態類型




弱類型語言有哪些好處(和缺點)? (5)

靜態類型的優點是在編譯時捕捉到了所有錯誤類型,不能達到運行時間。 例如,如果您有一個靜態類型的類或接口作為函數參數,那麼您不會無意中傳入錯誤類型的對象(沒有明確的錯誤轉換,也就是說)。

當然,這不會阻止你傳入正確類型的錯誤對象,也不會阻止你賦予它正確的功能但卻做錯了事情的接口的實現。 而且,如果你有100%的代碼覆蓋率,比如說PHP / Python /等人,誰在乎你是在編譯時還是在運行時發現錯誤呢?

就我個人而言,我已經在靜態打字的語言中度過了快樂的時光,而在沒有語言的情況下,我也開始玩樂了 這個問題很少是決定性的問題,因為我從來不需要在兩種語言之間進行選擇,而不是那種類型的打字,通常還有更重要的事情需要擔心。 我發現,當我使用靜態類型語言時,我故意“依賴編譯器”,試圖以這樣的方式編寫代碼,如果它錯了,它將不會編譯。 例如,有一些重構可以通過在一個地方進行修改來完成,然後修復所有導致的編譯錯誤,直到重新編譯。 通過多次運行一個完整的測試套件來做同樣的事情可能不是很實際。 但是對於IDE來說,在其他語言中自動化相同的重構,或者為了快速完成測試,這並不是什麼新聞,所以這是一個什麼是方便的問題,而不是什麼可能的問題。

除了便利性和編碼風格偏好之外,合法關注的人是那些正確處理代碼正確性的人。 我的無知印像是,靜態類型演繹可以完成大多數(但不是全部)明確的靜態類型的工作,並且可以節省鍵盤上相當多的磨損。 因此, 如果靜態輸入強迫人們以一種更易於證明的方式編寫代碼, 那麼從該POV中就可能得到一些東西。 我說“如果”:我不知道,也不是大多數人都證明他們的靜態類型代碼。

即時更改變量類型等

我認為這是可疑的價值。 (Python / Django)總是很誘人:

user = request.GET['username']
# do something with the string variable, "user"
user = get_object_or_404(User,user)
# do something with the User object variable, "user"

但是,真的,同一個名字應該用於一個函數內的不同事物嗎? 也許。 可能不會。 對於靜態類型語言中的其他內容,“重用”,例如,整數變量也不是大規模的鼓勵。 希望不必考慮簡潔的描述性變量名稱,可能95%的時間不應該重寫對明確代碼的要求。

順便說一句,通常類型意味著隱式類型轉換發生,而類型意味著他們不會。 通過這個定義,就算術類型而言,C是弱類型的,所以我認為這不是你的意思。 我認為人們普遍認為完整的強類型比幫助更麻煩,而“完全弱類型”(任何東西都可以轉換成其他類型)在大多數語言中都是荒謬的。 因此,在代碼變得太難以理解之前,有多少隱含的轉換是可以容忍的。 在C ++中也可以看到決定是否實現轉換操作符和非顯式的一個參數構造函數的難度。

我是PHP的忠實粉絲,顯然是一種非常弱的語言。 我意識到一些好處包括動態地改變變量類型的一般獨立性等。

我想知道的是缺點。 你能從C這樣的強類型語言中得到什麼,否則你不能從像PHP這樣的弱類型語言中獲得? 還有類型設置(比如double($ variable)),有人可能會認為,即使是弱類型的語言也可以像強類型語言一樣行事。

所以。 弱型。 我沒有包括哪些好處? 更重要的是,有什麼缺點?


弱和強是負載條款。 (你想成為一個弱語言程序員?)動態和靜態更好,但我想大多數人寧願是一個動態的程序員而不是一個靜態的程序員。 我會打電話給一個混雜的語言(這不是一個加載的術語;))

PHP:

garbage_out = garbage_in * 3; // garbage_in was not initialized yet
"hello world" + 2; // does this make sense?

允許未初始化的變量很難從拼寫錯誤中找到錯誤。 允許對不相關類型的操作也幾乎總是一個應該報告的錯誤。 大多數解釋的動態語言不允許這些事情是有原因的。 你可以有動態類型的語言,而不允許垃圾。


許多書都是關於這類事情的。 有一個固有的權衡; 用一種微弱的語言,很多的煩惱就不復存在了。 例如,在Python中,你不必擔心用int分隔float ; 將一個int添加到list ; 鍵入函數的參數(你知道,OCaml有特殊的+。運算符來添加float因為(+)int s發送到int s!); 忘記一個變量可以是空的......這些問題簡直就消失了。

在他們的地方來了一個新的運行時錯誤:Python的[0]*5給,等待它, [0,0,0,0,0] ! 對於強大的打字煩惱,OCaml通過編譯器捕捉了許多錯誤, 這正是為什麼它是好的。 這是一個折衷。


請參閱此表 ,其中顯示了應用於各種類型(例如0"0"NULL""的空對或其他主體值對的PHP ==運算符的結果。 運營商是不可交換的,至少可以說表格是非常不直觀的。 (不是說公平地詢問一個字符串是否等於一個數組是不太合理的 - 但是你可以用一種弱類型的語言來實現,這就是陷阱,如果語言試圖“幫你。)


一段時間以來,我一直使用強類型(如Java)和弱類型(如JavaScript)語言。 我發現,弱類型語言的便利性對於小型應用程序來說是很好的。 不幸的是,隨著應用程序規模的擴大,管理變得不可能。 有太多的事情需要記住你的頭,你必須開始根據你的IDE和編譯器越來越多,或者你的代碼停下來。 那就是強類型語言開始變得更有用 - 應用程序變得非常大。

在弱類型JavaScript中不斷驅使我的兩個例子是使用外部庫,沒有完全記錄和重構。

外部庫:當處理強類型語言時,庫本身的代碼提供自我文檔。 當我創建一個Person類型的變量時,IDE可以檢查代碼並告訴它有一個getFirstName(),getLastName()和getFullName()。 在弱類型語言中,情況並非如此,因為變量可以是任何東西,具有任何類型的變量或函數,並且函數參數也可以是任何東西(它們沒有明確定義)。 因此,開發人員不得不嚴重依賴文檔,網絡搜索,討論論壇和他們過去使用的記憶。 我發現可能需要花費幾個小時的時間在JavaScript中查找外部庫,而使用Java我只需要點擊“。”。 鍵,它會彈出我所有的選項與附加文件。 當你遇到沒有100%完全記錄的圖書館時,使用弱類型語言可能會感到非常沮喪。 我最近發現自己在函數“draw”中問“什麼是論證”的陰謀? 當使用jqplot,一個相當好,但沒有完全記錄的JavaScript庫。 在最終放棄尋找替代解決方案之前,我不得不花一兩個小時通過源代碼。

重構:使用強類型語言,我發現自己能夠通過更改需要更改的文件,然後修復編譯器錯誤來快速重構。 一些工具甚至可以通過點擊一個按鈕來重構。 用弱類型的語言,你必須做一個搜索,然後更換小心,然後測試,測試,然後再測試一些。 你很少確定你已經發現並修復了你所破壞的一切,特別是在大型應用程序中。

對於簡單的需求和小的應用程序,這兩個問題是微不足道的。 但是,如果你正在使用一個具有數百或數百萬行代碼的應用程序,那麼弱類型語言將會使你變得瘋狂。

我覺得很多開發者對此感到不安,把它變成一種情緒化的討論,因為我們有時會想到,有一個對的,一個錯的方法。 但是每種方法都有其優點和缺點。 一旦你意識到你把情緒放在一邊,為你現在所需要的選擇最好的。





types