Home | 簡體中文 | 繁體中文 | 雜文 | 打賞(Donations) | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 知乎專欄 | 視頻教程 | About

1.7. 標準與規範

1.7.1. Release Notes

Release Notes 撰寫說明

當一個項目升級時,需要寫一個文檔紀錄這次變動,內容包括,新增了什麼,更改了什麼,修復了什麼,未解決得問題,改善了什麼,忽略了什麼

常用信息類型

		
New
Changed
Fixed
Unresolved
Improved
Ignore
		
		

例 1.1. Example - Release Notes

			
NEW - xxxxxxxxxxxxx
CHANGED - xxxxxxxxxxxxx
FIXED - xxxxxxxxxxx
UNRESOLVED - xxxxxxxxx
IMPROVED - xxxxxxxxx
			
			

你也同樣可以參考很多開源組織編寫的Release Notes,例如apache, mysql, php 等等

1.7.2. Project directory

一種很蠢目錄規劃:

			project
			project/library
			project/log
			project/tmp
			project/...
		

目錄規劃原則,臨時檔案分離,日誌分離,配置檔案分離;這樣有利於在負載均衡環境中克隆節點。

  • 項目目錄/workspace/project

  • 臨時目錄 /workspace/tmp/

  • 日誌 目錄/workspace/log/

  • 配置檔案/workspace/conf

1.7.3. 版本控制及如何運作

1.7.3.1. 版本庫佈局

版本庫佈局

  1. trunk
  2. branches
  3. tags
  4. releases

多項目版本庫佈局

			
		 	                   /-> branches
		       .---> project 2 ---> trunk
		      / 	           \-> tags
		     /
		    /					/-> branches
repositories -------> project 1 ---> trunk
			\ 					\-> tags
			 \
			  \ 			   /-> branches
			   `---> project 3 ---> trunk
				               \-> tags
				
		

1.7.3.2. 策略

trunk 主幹,作為主幹你要保證他的代碼是可運行的。

branches 分支,代碼來自主幹,可以有很多分支,分支用於多個團隊同步開發,最終要將代碼合併到主幹。例如:branches/member, branches/blog, branches/shop 分別來自不同的團隊

tags 一般用於做快照,一旦建立永不更改

releases 發行本版,代碼來自主幹, 與tags功能一樣,命名更直觀。例如每個月為一個周期,發佈一次代碼 releases/v1.0, releases/1.5

			
                          .-----------------------------------------------------------------------> cart r100 ---> ...
                         /		                                                                          ^
                        .----------------------> blog r3 ---> r4 ... ... r(10) ---> r(n) ---> r(...) --->/---> ...
                       /		                   ^                        \                           /
               .-> branches r1  ---> member r2 ---/---------> r4 ... r(10) --\----> r(14) ---> r(...)--/---> ...
              /                       ^          /                \           \         \             /
repositories ----> trunk    r1  -----/----------/--------------> r(11) ---> r(12) ---> r(15) ---> r(...) ---> ...
              \	                                                                \         \          \
               `-> tags     r1  ------------------------------------------> v1.0.0 r(13)   \          \
                       \                                                                               \
                        `--------------------------------------------------------------> v1.0.1 (r16)   \
                         `--------------------------------------------------------------------------> v1.0.2 r(n)
			
		

			
                                                                            .> unstable 2.1.1
                          		                                           / \
                                              unstable 1.1           unstable 2.1     unstable 3.1
                        		                  ^ \                     ^ \         / \
               .-> branches ---> unstable 1.0 ---/   \   unstable 2.0 ---/   \   unstable 3.0    unstable---> ...
              /                      ^                \            ^          \      ^    \          ^
repositories ----> trunk    --------/-----------------> stable ---/-----> stable ---/---> stable ---/-> stable ---> ...
              \	                                       \                     \              \
               `-> tags     ----------------------------> stable 1.0          \              \
                       \                                                       \              \
                        `-------------------------------------------------------> stable 2.0   \
                         `-------------------------------------------------------------------> stable 3.0
			
		

怎樣訪問版本庫

美工、頁面人員採用WebDav訪問Subversion。Photoshop,Dreamwaver 軟件對WebDav有很好地支持,他們不需要學習如何使用Subversion。

開發者通過Svn客戶端訪問代碼庫,既可以使用開發IDE整合工具也可以使用單獨工具。像TortoiseSVN等等。

1.7.3.3. nightly version

每天晚上做一個快照

1.7.3.4. rc1,rc2,rc4

1.7.3.5. 怎樣寫註釋信息

1.7.3.5.1. Fixed Bug
				svn ci -m "- Fixed bug #53412 (your comment)"
			
1.7.3.5.2. Implemented
				svn ci -m "- Implemented FR #53271, FR #52410 (Building multiple XXXX binary)"
			
1.7.3.5.3. Add
				svn ci -m "- Add Feature #534 (your message)"
			

1.7.4. 代碼審查

Code Review

一對一代碼審查可以提高程序質量.

		

developer neo ---> coding ---> commit --->.
                           /               \
developer zen ---> review '                 \
                                           --->  svn repos
developer neo ---> review .                 /
                           \               /
developer zen ---> coding ---> commit --->`
		
		

1.7.4.1. Coding workflow

1.7.5. Redis Key

Redis Key 使用“:”分割例如

set SMS:CAPTCHA 1234
		

1.7.6. 錯誤編碼

格式 ABCD

A: 編碼

1 用戶錯誤

2 網絡錯誤

3 系統錯誤

4 應用伺服器錯誤

5 應用程序錯誤

6 緩存錯誤

7 資料庫錯誤

8 搜索引擎

B 編碼

0 成功

1 失敗

剩餘 C D 用戶自行編碼

1.7.7. HTML 標準

1.7.7.1. 校驗

https://html5.validator.nu/?doc=https%3A%2F%2Fwww.netkiller.cn%2Findex.html	
		

1.7.7.2. XHTML/HTML

1.7.7.3. CSS

1.7.7.4. Script

1.7.8. 編碼風格

https://code.google.com/p/google-styleguide/
http://lxr.linux.no/linux/Documentation/CodingStyle
http://perldoc.perl.org/perlstyle.html
http://www.gnu.org/prep/standards/
	

1.7.8.1. java 編程規範

1.7.8.1.1. Spring Data JPA
			
	@Autowired
	private TableRepostitory tableRepostitory;
	
	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	@PersistenceContext 
	private EntityManager entityManager; 
			
			

1.7.8.2. php 檔案

http://www.php-fig.org

1.7.8.2.1. 格式與 編碼

使用 UNIX 風格換行, 請在你的編輯器內調整

UNIX (LF或"\n")
MAC OS (CR 或"\r")
Windows CRLF \r\n
			

源碼檔案使用 UTF-8

有些IDE環境 UTF-8 BOM

1.7.8.2.2. 循環嵌套

if, while, for, foreach, do ... loop, switch... 等的嵌套必須小於等於3層

如下面的例子,可讀性極差。

if (xxx){
	if (xxx){
		if(xxx){
			if(xxx){
				if(xxx){

				}
			}
		}
		if(xxx){
			if(xxx){
			}
		}
	}
	if (xxx){
		if(xxx){
			if(xxx){
			}
		}
		if(xxx){
			if(xxx){
			}
		}
	}
}
			

加以改造

func aaa(p){
	if(p){
		if(xxx){
		}
	}
}
func bbb(b){
	if(b){
		if(xxx){
			if(xxx){

			}
		}
	}
}

if(xxx){
	aaa(xxx)
}
if(b){
	bbb(b)
}			
1.7.8.2.3. 取出行尾的空格以及多餘的換行符

一個空格占用一個位元組,換行符Window是兩個位元組\r\n, Unix與Mac占用一個位元組

1.7.8.2.4. php 標籤

禁止這樣使用

			
<?
...
?>
			
			

正確的使用方法

			
<?php
...

or

<?php
...
?>
			
			
1.7.8.2.5. 頭部註釋
			
<?php
/**
 * Project Name
 *
 * @author     $Author: netkiller $
 * @copyright  Copyright (c) 2012 Company
 * @version    $Id: chapter.coding.xml 584 2013-05-15 05:13:17Z netkiller $
 */

<?php
/**
 * Project Name
 *
 * @author     $Author: netkiller $
 * @license    GNU General Public License 2.0
 * @version    $Id: chapter.coding.xml 584 2013-05-15 05:13:17Z netkiller $
 */
			
			

1.7.8.3. String

雙引號要處理字元串轉義,性能上不如單引號,如果你不需要轉義字元串,或者字元串中不含原轉譯字元,建議你使用單引號

print("string")
		

每次輸出會檢索特殊字元串如: \r, \n, \t, \0xFF 等等

print('string')
		

1.7.8.4. Database

使用pdo_mysql替代mysql

錯誤的寫法,通過字元串連結拼接sql語句極容易出現注入漏洞

$sql = "select * from table where id=".$id;
$sql = "select * from table where id='".$id."'";
$sql = "INSERT INTO fruit(name, colour) VALUES ('".$name."', '".$colour."')";
		

正確的寫法

$sql = "select * from table where id=?";
$sql = "INSERT INTO fruit(name, colour) VALUES (?, ?)";
		
		
$sql = <<<____SQL
     CREATE TABLE IF NOT EXISTS `ticket_hist` (
       `tid` int(11) NOT NULL,
       `trqform` varchar(40) NOT NULL,
       `trsform` varchar(40) NOT NULL,
       `tgen` datetime NOT NULL,
       `tterm` datetime,
       `tstatus` tinyint(1) NOT NULL
     ) ENGINE=ARCHIVE COMMENT='ticket archive';
____SQL;
		
		
1.7.8.4.1. 結果集使用注意事項

返回資料庫查詢結果有幾種形式

數組形式

			
Array
(
    [0] => banana
    [1] => yellow
)

Array
(
    [NAME] => banana
    [COLOUR] => yellow
)
			
			

對象形式

Object
(
	Obj->NAME
	Obj->COLOUR
)
			

正確的使用方式

print($row[name])
print($row->name)
			

錯誤的使用使方式

print($row[0])
			

避免使用 "*"查詢,一會影響性能,二增加頻寬開銷

$sql = "select * from tab where status=0 limit 1";
			

如果程序使用$row[1]讀取結果,有可能當資料庫結構改變,增加欄位,欄位順序發生變化,輸出數據都會出錯

1.7.8.4.2. 索引

下面的例子,不會使用索引

$sql = "select id, name, created from tab where id != 100";
			
EXPLAIN select * from members where id != '1010';			索引失效
EXPLAIN select count(*) from members where id != '1010';	索引有效
			
1.7.8.4.3. 緩存

			

下面的例子,數據不會緩存查詢結果

$sql = "select id, name, created from tab where created=now()";
			

1.7.9. 安全

1.7.9.1. Interface

1.7.9.2. SQL注入