2009-02-13 32 views
11

語法糖,恕我直言,通常使程序更易讀,更容易理解比編碼從極簡主義的基元。我真的沒有看到好的,考慮周全的語法糖的缺點。爲什麼有些人基本上認爲句法糖是多餘的,最壞的情況是要避免的呢?Syntactic Sugar爲什麼有時被認爲是壞事?

編輯:我不想命名域名,但是自從有人問起,像大多數C++和Java程序員一樣,坦率地說並不在乎他們的語言完全缺乏語法糖。在很多情況下,它並不一定是他們就像語言足以讓缺乏糖值得權衡的其他部位,那就是他們真正不在乎。此外,Lisp的程序員看起來幾乎是得意自己的語言的奇怪符號的(我不會語法調用它,因爲它在技術上是沒有),但在這種情況下,它更可以理解的,因爲它允許Lisp的元編程工具是強大,因爲它們。

+1

你能提供的示例或用例? – spoulson 2009-02-13 21:18:47

+0

我從未聽過這個意見。你能舉一個你談論的那種語法糖的例子嗎? – 2009-02-13 21:19:25

+1

在一個隨機的一面說明,我剛註冊SyntaticSugar.com – mmcdole 2009-02-13 21:47:35

回答

8

語法修飾在某些情況下不愉快的方式進行交互。

一些具體例子:

第一個是C#(或Java)具體而言,自動拳擊和鎖定/同步構建

private int i; 
private object o = new object(); 

private void SomethingNeedingLocking(bool b) 
{ 
    object lk = b ? i : o; 
    lock (lk) { /* do something */ } 
} 

在這個例子中,其可以使用任何對象作爲有幫助鎖構造一個同步點與自動裝箱結合在一起會導致一個可能的錯誤。鎖只是每次都在我的新盒裝實例上進行。有爭議的是,鎖構造是有幫助的,而其他一些特定的構造可以更好地鎖定,但肯定組合仍然有缺陷。

多變量的聲明和指針:

long* first, second; 

一個經典的錯誤(雖然容易被發現)。多個變量的糖不適合指針聲明。

一些構造不需要糖的其他方面引起的問題,一個典型的例子是++運算符。它巧妙地讓你避免編寫

i = i + 1; 

一種廣泛使用的構建體(和一個它本身有缺陷範圍,因爲你必須記住要更新這兩個變量,如果你想使用我改變)。然而,由於這很容易嵌入到其他表達式中,所以prefix和postfix的問題就會擡頭。 在for循環中使用時,這並不重要,評估發生在任何其他評估之外,但在其他地方使用時可能會造成混淆(因爲您可能嵌入了計算的一個非常重要的方面(無論是當前還是應該使用下一個值)變成一個非常小且容易遺漏的表格

以上所有內容(除了編譯器真正應該爲您指定的鎖/盒之外)都是使用情況良好的情況,或者有經驗的程序員可能會認爲「這對我來說非常清楚」,但對於新手程序員或那些轉向不同語法的人來說,存在混淆的可能性。

1

可能是因爲它會導致程序員不知道實際發生在幕後的混亂,這又會導致一些效率低下或寫得不好的代碼。只是猜測,我不認爲它是也是一件「壞事」。

1

語法糖可以使你的程序更容易理解,或者並非如此。如果你爲瑣碎的事情添加語法糖,你只會增加認知負擔,因爲語言變得更加複雜。另一方面,如果你可以添加語法糖來完成某個特定的概念並突出顯示它,那麼你就可以贏。

8

太多不必要的糖只是增加了臃腫的語言。我會給名字命名,但接下來我只會發火。 :)另外,有時候語言會使用語法糖而不是做一個真正的實現。例如,有一種語言應該是無名的,其「泛型實現」僅僅是一小部分語法糖。

0

它更打字和抽象層以上。我更願意使用一種語言,這種語言被設計爲具有更高的抽象水平,然後語法糖被添加到模仿其他語言已經內置的功能的糟糕工作中。

10

語法糖導致癌症分號。艾倫·佩利

這是很難推理語法糖,如果推理髮生不參考上下文。有很多關於爲什麼「句法糖」好壞的例子,並且沒有語境就沒有意義。

您提到語法糖在程序可讀性和易於理解時是好的......我可以反駁說有時候語法糖會影響語言的形式結構,尤其是當語法糖晚了時編程語言設計中的附錄。

我不想從語法糖的角度思考,而是喜歡用設計良好的語言進行思考,以促進可讀性和易理解性以及糟糕的設計語言。

問候,

2

Law of Leaky Abstractions - 過多的糖,你只要使用它,而認識或知道是怎麼回事,這使得越來越難以調試,如果事情確實出問題。這與其說是「語法糖」是一件壞事,只是很多程序員依賴它沒有真正意識到什麼,他們都來自屏蔽,然後如果語法糖過程中遇到問題,他們就完蛋了。

1

就個人而言,我總覺得術語「語法糖」曖昧。我的意思是如果你想獲得技術,除了基本算術,if語句和goto都是語法糖。

我想大多數人的意思,當他們解僱「語法糖」是一種語言功能使複雜的事情過於簡單。這個最臭名昭着的例子是Perl。但因爲我不是一個Perl的專家,我給你(從this question拍攝)就是我的python談論的例子:

reduce(list.__add__, map(lambda x: list(x), [mi.image_set.all() for mi in list_of_menuitems])) 

這是在做簡單的東西可怕了一個明顯的企圖,可怕的錯誤。

這並不是說我雖然上消除這種特點的一面。我認爲這些功能需要謹慎使用。

1

語法通常使語言難以學習,更不用說掌握了。所以,小一點一組語法,學習和嘗試掌握就越容易。這是許多新語言借用流行的現有語言的語法的主要原因。另外,雖然我可以簡單地避免學習某些功能,但由於某種原因,我並不感興趣,但最終我會發現自己正在閱讀其他人的代碼,如所做的那樣,然後我需要去學習該功能只是爲了瞭解他們的代碼。

2

我一直都明白「語法糖」是指任何添加到現有語言中的語法都不會擴展語言的功能。否則,任何不如二進制機器語言直接的東西都可以稱爲語法糖。

儘管它們沒有擴展語言的功能,但它們仍然非常有用。

例如,LINQ是語法糖,因爲它不會爲C#3添加任何C#2中不可能實現的新功能。但是要做與C#2中簡單的LINQ表達式相同的事情,將需要大量更多的代碼來完成,而且更難以閱讀。

換句話說,泛型不是語法糖,因爲你可以在C#2中用C#2做它們不可能的事情,比如創建一個可以包含任何值的集合類,而不用裝箱。

4

廢話。 C和Lisp程序員一直使用語法糖。

例子:

  • a[i]而不是*(a+i)
  • '(1 2 3)而不是(quote 1 2 3)
相關問題