2010-08-03 16 views
3

不久前,我被介紹給Clojure,雖然我沒有完全理解它的所有概念,但它給了我一個替代Java和PHP的OO,我真的想要走向。我認爲Clojure的系統是我的理想。我知道我想盡可能地通知我的PHP編碼風格。我應該遵循什麼原則來在PHP中使用更少的類似Java的對象進行編碼,並且更類似於Clojure的函數式編程原則?

我真的不喜歡PHP中的面向對象,我討厭它常常會導致的樣板量和隱藏的複雜度。與此同時,我可以看到封裝的好處,在這些封裝中,您有多個數據位可以自行修改。也許使用一階函數是允許封裝的主要方式,但除此之外,如何將面向對象的好處轉化爲函數式編程?

現在我遇到的問題的一個部分是如何處理一些相關函數的集合,這些函數可能會被分組到一個類中,以一種讓他們對彼此有用的理智方式。

回答

3

從愛德華·加森在書中'97事情每個程序員都應該知道」在題爲的文章‘應用函數式編程原則一塊’他歸結下來到:

引用透明 http://en.wikipedia.org/wiki/Referential_transparency_(computer_science)

我認爲,任何面向對象的語言在某種程度上可以用一種功能性的風格來編寫,我認爲思考它的最好方法是始終回報一些東西。如果您改變數據結構,則返回應用了變異的數據結構的副本,請勿更改原始數據結構。如果你需要改變一個對象的狀態,那麼要非常明確地這樣做。最後,不要太具體,爲你的方法編寫單元測試,因爲它會迫使你編寫更多更有針對性的方法,當你從這些方法返回時,它們更容易測試。

+0

聽起來很貼切,我試圖找出如何將它翻譯成PHP術語。 我認爲我可能會命令那本書閱讀該部分(以及它的其他部分,這些部分可能不會受到傷害)。 單元測試是一個偉大的觀點,我可以從根本上追求沒有問題。 「不要更改原始數據結構」部分似乎有點棘手在PHP中,因爲我認爲執行一個對象的動作通常通過引用在默認情況下發生在PHP中,雖然也許沒關係?我應該嘗試深入克隆對象以便返回一個全新的副本嗎?並依靠垃圾收集? – Kzqai 2010-08-04 03:24:42

+0

我的PHP非常糟糕,但要回答你的問題,在數據結構中,我會產生一個副本,然後更改數組的值,如下所示:http://pastie.org/1075342數組不是頭等對象在PHP中,它不完全相同,但概念是。再一次,我們的目標是儘可能少地運行,所以第一個問題是:我需要一個對象嗎?但是我將不得不將PHP的實現留給你。 – 2010-08-04 16:30:18

+0

只是將粘貼的代碼存檔以供日後參考: '<?php $ arr = array(「foo」=>「bar」,12 => true); $ arr2 = $ arr; $ arr2 [] =「test」; echo $ arr == $ arr2; #=> false echo $ arr === $ arr2; #=> false ?>' – Kzqai 2010-09-08 15:51:51

1

我不知道php有什麼功能,但據我所知,傳遞函數(和方法)非常可怕,並且有10種方法可以實現,所以它不會很容易。對於一般的諮詢,這裏是一些標準的東西:

  • 不使用類,除非你需要層次
  • 避免全球統計
  • 寫勢在必行庫頂部的功能層
  • 定義高階函數處理數據(如果可能的話)

我不認爲PHP對FP好。這完全違背了「設計」理念。最重要的是要避免所有的PHP,但這並非總是可能的。

+0

嘿,它不是視覺基礎。 – Kzqai 2011-01-03 23:23:17

相關問題