2016年2月27日 星期六

[科技見談]Good Coding Style

1.宣告馬上用,勿宣告一大堆變數再同時assign數值。

2.變數命名長度不超過17個英文字母。

3.記得命名有意義。

4.組合字記得用底線隔開 或是連在一起但第二個單字的開頭大寫。

5.for迴圈少用i,j,k盡量用有意義的單字eventIndex。

6.類別是靜態的切勿用動態動詞命名。

7.類別Abstraction 先宣告一批public,再接續宣告private,且private宣告用指針 切勿透漏 如此才能達到資訊隱藏目的。

8.一行70~80個字元,勿太多。

9.Function 100~200行 勿太多。


Google Python命名規則   轉載自凍仁的筆記

module_namepackage_nameClassNamemethod_nameExceptionNamefunction_name,GLOBAL_CONSTANT_NAMEglobal_var_nameinstance_var_namefunction_parameter_name,local_var_name.

避免使用的命名:

  1. 除了計數器及迭代器之外,不要用單一字母為變數命名。
  2. package 及 module 的名稱中不要包含破折號 "-"
  3. 變數名稱前後不要加上兩個雙底線 (如:__double_leading_and_trailing_underscore__ )。

命名慣例:

  1. "internal" 指 module 內或 class 中的 private 或 protected 的變數。
  2. 要保護 module 變數或函式,可在變數名稱前加上單一底線,若用 from foo import * 時,這些變數不會被 import。(編案:若用 from foo import _var 則還是能使用 _var 變數)。若要在 class 內宣告 private 變數或方法,則在變數名或 方法名之前加上兩個底線 (__),private 的效果是透過 name mangling 達成。(編案: name mangling 本質上只是把變數重新命名,因此使用者若執意要呼叫 private 變數還 是能夠達成。)
  3. 把相關的 class 及 頂層的 function 放在同一個 module 中。你不需要像 Java 般 限制每個 module 只能有一個 class。
  4. 命名 class 時,使用每個單字的字首用單寫 (如:CapWords)。命名 module 時,用 小寫及底線 (如:lower_with_under.py)。雖然某些既有的 module 命名仍使用大寫字 母 (如:CapWords.py),但不建議這麼做,因為當 module 名稱與 class 名稱相同時它 們將難以分辨。(你通常寫 import StringIO 或 from StringIO import StringIO ?)

命名通則:

  1. package: lower_with_under (public)
  2. modules: lower_with_under (public), _lower_with_under (internal)
  3. classes: CapWords (public) _CapWords (internal)
  4. exceptions: CapWords (public)
  5. functions: lower_with_under() (public), _lower_with_under() (internal)
  6. global/class constants: CAPS_WITH_UNDER (public), _CAPS_WITH_UNDER (private)
  7. global/class variables: lower_with_under (public), _lower_with_under (private)
  8. instance variables: lower_with_under (public), _lower_with_under (protected),__lower_with_under (private)
  9. method names: lower_with_under() (public), _lower_with_under() (protected),__lower_with_under() (private)
  10. function/method parameters: lower_with_under
  11. local variables: lower_with_under (public)



何謂Memory Leak?

我們常常會聽到程式開發人員嘴邊老喊著︰記憶體不足。
會發生這個問題,其中可能包含Memory Leak。


維基百科對Memory Leak(記憶體洩漏)做了以下的解釋︰

電腦科學中,內部記憶體泄漏指由於疏忽或錯誤造成程式未能釋放已經不再使用的內部記憶體的情況。
內部記憶體泄漏並非指內部記憶體在物理上的消失,而是應用程式分配某段內部記憶體後,由於設計錯誤,導致在釋放該段內部記憶體之前就失去了對該段內部記憶體的控制,從而造成了內部記憶體的浪費。
Android官方布落格提到︰

A "memory leak" in your code is when you keep a reference to an object that is no longer needed. Sometimes a single reference can prevent a large set of objects from being garbage collected.


以下文章引用自女工程師的美加生活手札的部落格,
裡面提到︰
在電腦世界裡,有一個performance的隱性敵人,它會造成記憶體的使用量隨著時間慢慢增加直到消耗殆盡,這個敵人俗稱Memory Leak (中文翻成記憶體漏洩)。

Memory Leak造成的原因是某個被配置(allocated)的記憶體無法在被參照(referenced),也無法被釋放(released);那塊被配置的 記憶體就有如記憶體孤兒般,無法被系統再使用,所以要看一個程式有否Memory Leak,很簡單的方法就是去看作業系統(For standalone application)或是Application Server(如果是Web Application)的實體記憶體使用圖,如果隨著時間增加,記憶體的使用量呈現明顯增加的趨勢,這個程式就極有可能有潛在的Memory Leak問題。
Memory Leak在C/C++語言中是很常見的人為過失,因為C/C++並沒有自動Garbage Collector (垃圾收集器)的機制,程式設計師必需在使用完資源後,人為釋放資源。雖然在Java、C#有自動Garbage Collector的機制,Memory Leak的機會大幅下降,但仍然不能完全倖免,只要程式設計師不小心仍然會造成Memory Leak。

有些人以為Java有Garbage Collector(GC)就不會有Memory Leak,其實是錯的。如果一個物件仍然有被參照,Garbage Collector是不會回收該物件的。 

比如以下狀況: 

假設你有一個Java程式,裡面你運用了一個宣告為static 的Array A來儲存已經開啟的視窗-JFrame instance。如果使用者開啟了一個視窗W1,W1會被存入Array A中,而當W1關閉後,你沒有把W1從Array A裡移除,這時,雖然W1已被指到null,Garbage Collector卻不會回收W1。
原因很簡單,因為Array A仍保有W1的參照,GC假設W1之後有被使用的機會,所以沒有回收W1。如果這個程式持續開關大量視窗,它所用的記憶體也會呈現增加的趨勢,而造成了典 型的Memory Leak狀況。

解決的方式很簡單,只要在W1被關閉時同時把W1從Array A裡移除即可。

沒有留言:

張貼留言