2011-12-23 33 views
0

我注意到Java,Python,Perl和Haskell/Clojure對靜態函數的處理有明顯不同。特別是,在不同語言中分離靜態代碼和有狀態代碼的差異

1)靜態函數在不同語言中實現和使用的方式有哪些地方差異?

2)這些語言中的一些對其他語言的靜態和有狀態方法有更「完整」的分離和支持嗎?

例如:

Clojure中,所有功能都基本上,靜態 - 允許極端模塊化組合性,不與對象醚任何東西相關聯。 Clojure函數式編程可以向Java程序員描述,類似於靜態函數。同時,在傳統的慣用Java中,通常存在一種混合體,在這種混合體中,面向對象的特性保持內部狀態,依靠外部靜態方法進行某些常常無狀態的轉換操作。

然後就是腳本世界:我已經注意到在Perl和Python中,區分靜態和有狀態代碼的概念並沒有像過去那樣強調更新(更新:根據評論 - 也許這是由於多線程範式性質)。最後,我們擁有面向對象的PHP-5開發人員,他們在處理靜態和有狀態(對象範圍)函數時似乎與Java開發人員類似地編寫代碼。

對於來自不同背景的不同程序員如何處理靜態功能的差異,其他任何深入的見解都會幫助我通過與我合作的幾個PHP/Perl開發人員來查看代碼。

+2

*(不是你的問題的答案,因此評論)* ...你的問題的公式化使得它聽起來像所有的非靜態方法是有狀態的。這完全不是這種情況:例如,如果您希望可以通過使用這些接口的接口和無狀態實現來編程Java(這只是一個例子,您還可以使用無狀態類擴展無狀態抽象類等) 。我知道使用Java,比如說,主要是不可變對象和無狀態類不是最常見的,但它絕對可以完成。 – TacticalCoder 2011-12-23 00:38:20

+1

「靜態」關鍵字沒有提及任何關於函數有狀態和/或語言不同的內容。靜態的PHP/Java方法可以保持與其他代碼一樣多的狀態。 – deceze 2011-12-23 01:31:51

+0

添加到@deceze,靜態函數可以修改靜態變量。基本上,這意味着全局變量。 – JRideout 2011-12-23 02:01:13

回答

1

相關的區別可能是語言強調的編程範式。 Functional諸如Haskell的語言& Clojure旨在消除副作用並強調決定論;封裝可變性或狀態像單子一樣思考。這與Imperative語言形成對比。 Perl是多範式語言,因此可以實現命令式樣式,如程序和麪向對象編碼,甚至可以模擬功能樣式。

在與命令式程序員合作時,可能需要關注鬆散耦合和無副作用設計模式,例如Dependency Injection