2009-01-26 52 views
1

我和一位友善的編碼員發生了爭執,他被喬爾的Law of Leaky Abstractions輕度損壞。要說服他使用任何新的框架/工具箱是非常困難的。我試圖提出一個觀點,「只要抽象層次允許低層訪問,抽象就沒有問題」。泄漏抽象律例外

例子:

  • GWT - 谷歌的精湛Java到JavaScript編譯器,具有JSNI - 筆頭 「原生」 的JavaScript,如果你真的想。
  • Hibernate - AFAIK擁有SQLQuery - 編寫原生SQL的方式。
  • 爪哇 - JNI - 如果你錯過C.

是它的聲音? 我錯過了什麼嗎?

感謝

+0

那麼,你的問題到底是什麼?如果這個人不會使用任何框架或工具箱,因爲沒有完美的摘要,那麼這個人的思想就有一些基本的問題。 – BobbyShaftoe 2009-01-26 11:48:18

+0

我試圖驗證我的論點,而不僅僅依賴於我自己的觀點。 – 2009-01-26 11:53:20

+0

這很奇怪。我記得幾年前閱讀過這篇文章,我從來沒有想過Joel在譴責抽象,他只是說他們並不總是像「優雅」的程序員認爲的那樣整潔。在設計抽象時,重要的是要考慮實現可能如何泄露;但抽象仍然是必不可少的......編寫一個不重要的應用程序是一項如此龐大的任務,除非您可以使用抽象來「掩蓋」其他部分,而只關注一個部分,否則無法理解一個龐大的系統。 – 2011-06-23 02:09:21

回答

7

我從閱讀漏抽象的文章了什麼沒有那麼抽象是壞的,但是,你應該讓一個角度來理解引擎蓋下發生的事情,這樣就可以解釋「意外「行爲,並避免它們。

你的朋友在什麼程序?機器語言? :)

1

雖然我認爲每個抽象都是有漏洞的,但這並不一定是壞事。例如,在傳統的普通C(C#,Java,無論)代碼中,你通常使用循環,ifs等從數組中檢索數據。但是這樣你就可以對問題進行過度指定。

SQL,Linq方式同樣的問題的方法更聰明:你只是說你想要什麼,機器會計算出如何去做。這樣它就沒有任何特定的傳統命令順序,可以將工作分解爲不同的cpus,或者重新排序,以便更好地使用緩存等。

所以是的,你對機器給予了一些控制,但是這臺機器比你有一個巨大的優勢:它在用戶/客戶的地方,並且這種方式可以做出按需決定(如使用多核,使用MMX的優勢,無論如何)。

4

喬爾的觀點(據我所知)是通過將複雜性抽象出來,你犧牲了對底層複雜性的更好控制。除了微不足道的情況之外,您最終需要訪問更精細的控制粒度,在此時抽象會被破壞。

因此,所有的抽象是漏水的(幾乎)定義:

  • 如果有複雜的系統,它一定是有原因的(或你應該找到一種方法來刪除它),因此將偶爾有用/至關重要。
  • 通過抽象你正在限制你對底層複雜性的控制。
  • 當這些'偶爾會出現,你將不得不打破抽象。
4

在某種程度上他有一個觀點。傳統的c/unix開發工作到一個足夠簡單的平臺,能夠全面或多或少地理解。現代平臺的數量級要複雜得多,並且瞭解所有層的相互作用如何更難,往往不可行。

泄漏抽象的定律主要適用於框架在管理底層複雜性方面做得不好的情況。框架可以被判斷的一些方式是它的透明度(易於理解幕後發生的事情)以及它能夠摒棄自定義的解決方法來限制其功能。

當一個框架在幕後做了很多複雜的魔術時,診斷和故障排除變得更加困難,通常需要框架底層架構中不成比例的大量專業知識。這意味着從框架獲得的生產力收益將被吸收到培訓和調試代碼的額外工作中。這也使得框架很難學習和使用,這是你的C編程朋友習慣的。

當一個框架阻礙你解決它的限制時,它就成爲開發的一個障礙。當這種情況經常發生時,代碼庫就會被封入或者被越來越多的混亂的黑客所污染,以解決這些問題。這也會導致穩定性和調試問題,例如存在這些缺陷的框架比比皆是。 MFC由於未能隱藏Win32的底層複雜性而相當出名。它還廣泛使用了嚮導,這些嚮導生成的雜亂代碼需要經過手動修改,這首先破壞了代碼生成器的功能。早期的Java GUI工具包(AWT和Swing的早期版本)在桌面應用程序中很少被採用,因爲它們阻礙了開發人員爲應用程序實現本機外觀。由於Swing的這些限制,SWT的構建不在少數。然而,現在Java已經成熟了一點,可以說它的大多數早期罪已經在現代框架中得到修復。 J2EE仍然是一個龐大而複雜的系統,在瀏覽器中開發一個非平凡的用戶界面也是相當重要的任務。精通這個平臺是相當多的工作。然而,這並不能超越人的智慧。