2010-08-27 49 views
24

普遍接受的方法來格式化C#代碼似乎如下:如何避免浪費屏幕空間編寫稀疏的C#代碼?

namespace SomeNamespace 
{ 
    namespace SomeSubNamespace 
    { 
     class SomeClass 
     { 
      void SomeFunction() 
      { 
       using (var someFile = new StreamWriter(somePath)) 
       { 
        try 
        { 
         lock(someCriticalSection) 
         { 
          using (var someDisposableThing1 = new DisposableThing()) 
          { 
           DoSomething();        
           using (var someDisposableThing2 = new DisposableThing()) 
           { 
            lock(someOtherCriticalSection) 
            { 
             DoSomethingMore(); 
            } 
           } 
          } 
         } 
        } 
        catch(Exception e) 
        { 
         Log(e); 
        } 
      } 
     } 
    } 
} 

這浪費了大量的屏幕空間,水平和垂直方向。我當然不是第一個注意到的人。我的問題是:您是否和它一起生活,或者您是否開發了不同的格式樣式以避免空白空間過剩?

PS:請注意,我甚至沒有使用單個if語句!

+8

如果它真的困擾你,我建議將代碼分解成不同的方法。 – kemiller2002 2010-08-27 13:12:08

+9

我重構任何傷害我的眼睛直到它看起來很漂亮。但那只是我:) – devnull 2010-08-27 13:12:52

+0

重構+ narrange =美味。 – 2010-08-27 13:34:29

回答

7

我傾向於使用較小的嵌套層次編寫小類,簡短的方法。您不僅可以看到屏幕上的所有內容,而且代碼也更好!

5

我有一個24" 寬屏顯示器。我非常喜歡‘漂亮打印’在回收空間。簡明,擠在一起的代碼難以閱讀和傷害了我的大腦。

+0

+1難以維護,完成後很難讓同齡人拿起。這很噁心。 – 2010-08-27 13:26:48

19
  1. 我不經常看到命名空間以這種方式嵌套 - 也許它發生,而不是我工作的地方
  2. 我生活在一起,大多不寫這種深層次的代碼。具有較短的方法或嵌套較少的方法肯定會減少水平空白問題,並且將方法分解成更小的部分意味着您可以在給定的垂直空間中獲得更重要的信息。
+4

同意。我不認爲我曾經見過像這樣嵌套的命名空間。 – 2010-08-27 13:17:10

+2

我從來沒有見過有人像這樣嵌套命名空間,唯一的原因是這樣做,而不是命名空間SomeNamespace.SomeSubNamespace將添加一個類到每個命名空間,在這種情況下,你有一個文件中的兩個類是一個禁忌,特別是如果兩個類都在不同的命名空間 - 他們的文件應該在不同的文件夾中。 – 2010-08-27 13:24:41

+0

不幸的是我看到過這樣的命名空間。 – 2010-08-27 13:27:27

10

嗯,我買了一臺高清顯示器;)

不過從使用較少的縮進是將一些代碼放到自己的方法除了對付它的唯一途徑。

3

如果我要嘗試/抓住一些東西,我會結合任何相鄰的使用塊。同樣,我會集結命名空間,所以更接近於:

namespace SomeNamespace.SomeSubNamespace 
{ 
    class SomeClass 
    { 
     void SomeFunction() 
     { 
      StreamWriter someFile; 
      try 
      { 
       someFile = new StreamWriter(somePath); 

       lock(someCriticalSection) 
       { 
        using (var someDisposableThing1 = new DisposableThing()) 
        { 
         DoSomething();        
         using (var someDisposableThing2 = new DisposableThing()) 
         { 
          lock(someOtherCriticalSection) 
          { 
           DoSomethingMore(); 
          } 
         } 
        } 
       } 
      } 
      catch(Exception e) 
      { 
       Log(e); 
      } 
      finally 
      { 
       if(someFile != null) 
       { 
        someFile.Dispose(); 
       } 
      } 
     } 
    } 
} 
3

不要認爲它看起來那麼糟糕;) 使短但是功能確實是一個點。特別是,它是很好,如果你可以做的東西一樣更換

if (condition) 
{ 
    // bla 
} 
else 
{ 
    // blub 
} 

通過

void someFunction() 
{ 
    if (condition) 
    { 
    // bla 
    return 
    } 
    // blub 
} 
+0

絕對!!!我討厭看到每個地方嵌套的「if」。 – Dave 2010-08-27 13:22:17

+2

不確定這會產生多大的影響,如果'// bla'具有任何顯着的長度,我會認爲它會降低可讀性。雖然我不會-1,因爲我承認這很主觀...... – 2010-08-27 13:30:55

+0

丹:對於我來說// // blub是否具有相當的長度會更重要,因爲那麼你會從很多// blub被縮進一個較低的層次中受益(編輯,首先誤讀你的觀點,我有點同意但是我仍然會稱重它//咕嚕咕嚕的好處。我認爲它使假如//喇嘛是錯誤處理最感,甚至有可能出現// // BLA1等bla2條款) – Nicolas78 2010-08-27 13:39:47

16

讓我來解釋一下這個樣子。如果你碰巧碰到一個嵌套的代碼結構,就像你上面展示的一樣深,那麼問題可能不是格式,而是代碼結構。

你應該考慮一下這個:Refactoring by Martin Fowler

通過extracting methods你不僅是「浪費」了屏幕空間改善,但顯着提高可讀性太;)

另一種解決方案是總是:Alt + Shift + 在Visual Studio中輸入即可進入全屏模式

+1

ALT + SHIFT * * + ENTER切換到全屏模式VS – 2010-08-27 13:32:14

+0

@matthew :thx :)忘記了班次,但現在更正了 – Juri 2010-08-27 13:33:52

+1

Alt + Shift +在VS中輸入;在Eclipse中使用Ctrl + M – 2010-08-27 13:34:43

2

我同意我基本生活的其他答案 - 對於我的團隊,我們要麼有高分辨率顯示器,要麼有雙顯示器(或兩者),所以它不像我們在800x600上開發的那樣。

但有一點要記住的是,如果您使用實際間距,因爲某些開發人員使用2個空格作爲製表符,大約4個,大約6個,因此您的製表符會更好。因此,格式化的代碼在一個開發人員的IDE,它可能不太適合其他人。 (我已經看到了一些可怕的結果。)

VS2010有一個很好的插件來自擴展管理器,叫做生產力工具,它可以檢測到你的文件中有多個製表符和空格混合,並允許你轉換一切到標籤或空格(「修復混合標籤」)。清理文件真的很有幫助(即使它看起來沒有任何作用!)。如果你在團隊之間共享代碼,這很好。

+0

爲什麼downvote?沒有評論 - 有點粗魯。 – 2010-08-27 13:59:07

10

工具>選項>文本編輯器>所有語言>標籤>縮進大小> 1
不是一個很好的解決方案...:P

+3

與我合作的人將他的標籤更改爲2 ...爲他工作 – Martin 2010-08-27 13:24:22

+0

真實的2格式標籤是一個很好的解決方案。 +1 – tenfour 2010-08-27 14:11:35

+0

@Martin - 是的,我通常選擇「插入空格」單選按鈕(並將「製表大小」和「縮進大小」設置爲相同的值)。我討厭那些標籤! :) – SwDevMan81 2010-08-27 16:00:45

1

使用CodeRush, 它會通過你的代碼更好的使導航

你會得到這樣的事情 alt text

3

我已經看到了一個代碼塊的開始行開括號,如:

namespace SomeNamespace { 
    class SomeClass { 
     void SomeFunction() { 
      using (var someFile = new StreamWriter(somePath)) { 
       try { 
        lock(someCriticalSection) { 
         using (var someDisposableThing1 = new DisposableThing()) { 
          DoSomething();        
         } 
        } 
       } catch(Exception e) { 
        Log(e); 
       } 
      } 
     } 
    } 
} 

房地產不多,但我覺得它很醜。

+8

真的很醜。 BLECH。 – 2010-08-27 13:26:03

+2

是的,我最後一位的顧問發佈了這種格式。每當我看着他的東西時,我都想吐。 – 2010-08-27 13:30:19

+0

美麗是在旁觀者的眼中。但這確實是一些令人厭煩的東西。 – 2010-08-27 13:34:47

10

您應該閱讀Bob Martin的Clean Code。它有助於解決這個問題。在這種情況下,SomeFunction()做了不止一件事。把它在自己的方法中做的每件事分開。

​​

另外,不要抓住System.Exception;你永遠不知道什麼會失敗,你不應該試圖捕捉你無法處理的異常。讓他們起死回生並死得可怕。

+9

爲System.Exception +1,我必須一直辯論。 – 2010-08-27 13:28:32

+1

企業應用程序更好嗎?捕獲System.Exception,記錄它並保存或發送以支持或讓用戶處理.NET異常消息,他們甚至不費心去閱讀和應用程序崩潰? – Grozz 2010-08-27 13:58:41

+0

@Grozz如果捕獲系統異常並將其記錄下來,則可能在日誌中損壞了狀態;更別提開發人員有義務檢查日誌了。隨着一個可怕的異常突然出現並讓用戶發瘋,在應用程序中發現問題並不容易,因爲這些問題在開發中找不到。 – 2010-08-27 14:01:10

1

除了別人在這裏所說的,我做的一件事是減少效果,就是使用比例間隔字體。文字更具可讀性,但差別不大。它也迫使你使用標籤在空間對齊(這當然是爲什麼好主給我們標籤首先)

我個人使用漫畫無傷害MS,但這真的驅動同事瘋狂....

+0

我們有豐富的水平空間,這是高端的垂直空間。使用比例間隔字體會使代碼看起來很古怪,難以閱讀。也許這是因爲我很久以前就開始編碼了,因爲在比例間隔字體之前(在文本模式以外的視頻模式可用之前)。 – Tergiver 2010-08-27 14:14:33

+0

哈哈漫畫。其實我已經嘗試了比例字體,他們並沒有我期望的那麼煩人。但是這是一些習以爲常的事情,而且目前我的工作中有太多依賴單間隔對齊的東西看起來很漂亮。我沒有任何代碼太寬的問題。 – tenfour 2010-08-27 14:16:12

+0

該OP特別提到了水平井和垂直空間。 @Tergiver,我在這些顯示器上已經有6年的時間了。 – 2010-08-27 14:34:45

3

using語句是非常方便的,但是如果代碼變得難於閱讀,你也離不開它:

namespace SomeNamespace.SomeSubNamespace 
{ 
    class SomeClass 
    { 
     void SomeFunction() 
     { 
      StreamWriter someFile = new StreamWriter(somePath); 
      DisposableThing someDisposableThing1 = null; 
      DisposableThing someDisposableThing2 = null; 

      try 
      { 
       lock (someCriticalSection) 
       { 
        someDisposableThing1 = new DisposableThing(); 
        DoSomething(); 
        someDisposableThing2 = new DisposableThing(); 
        lock (someOtherCriticalSection) 
        { 
         DoSomethingMore(); 
        } 
       } 
      } 
      catch (Exception e) 
      { 
       Log(e); 
      } 
      finally 
      { 
       // requires SafeDispose extension method 
       someFile.SafeDispose(); 
       someDisposableThing1.SafeDispose(); 
       someDisposableThing2.SafeDispose(); 
      } 
     } 
    } 
} 
1

一些總體思路:

  • 結合的命名空間塊爲一體。如果可以的話,
  • 收集using聲明到一個地方。
  • 如果你不是一個狂熱者「即使單個語句需要附上{} s!」,您可以擺脫usingtry..catch塊之間的括號。
  • 想想是否真的需要嵌套lock,或者最外層的lock就足夠了。

這些可以結果在下面的代碼(留意,你假設的例子代碼的含義可能不完全保留):

namespace SomeNamespace.SomeSubNamespace 
{ 
    class SomeClass 
    { 
     void SomeFunction() 
     { 
      using (var someFile = new StreamWriter(somePath)) 
      try 
      { 
       lock(someCriticalSection) 
       { 
        using (var someDisposableThing1 = new DisposableThing()) 
        using (var someDisposableThing2 = new DisposableThing()) 
        { 
         DoSomething();        
         DoSomethingMore(); 
        } 
       } 
      } 
      catch(Exception e) 
      { 
       Log(e); 
      } 
     } 
    } 
} 

(你甚至可以移動兩個using s到如果您的代碼允許,您可以進一步替換using語句,並在finally塊中顯式調用Dispose,如其他答案中的建議。)

+0

感謝您的有趣迴應。儘管有一點小小的評論:由於性能和避免死鎖,通常鎖的範圍必須儘可能小。因此,似乎不太可能組合多個互斥體。 – 2010-08-30 10:38:10

+0

_ @ Dimitri:_也許我不明白'鎖',以及我應該:我可以看到鎖保持儘可能短的點;然而,我不明白你爲什麼需要內部鎖,因爲外部鎖已經確保代碼一次只能由一個線程執行......而且,外部鎖的持續時間是*不是*通過移除內鎖來增加。 - 我在這裏錯了什麼? – stakx 2010-08-30 10:49:46