---
# System prepended metadata

title: 拔草囉！

---

# 拔草囉！
### 專案其實就像村莊一樣。你一定要拔掉那些雜草----也就是在你的程式碼庫裡不斷出現的那些小瑕疵

雜草：那些很容易修正，但也很容易被忽略的小問題。它並不會在其他地方引起什麼問題。有所改變的，只是少了些雜草。

有雜草的程式碼
```c=
// @brief Remove duplicate integers from a vector
//
// @param values Integer vector to compress

template <class T>
void compressVector(
	vector<T> & values, 
	bool (* is_equal)(const T &, const T &))
{
	if (values.size() == 0)
		return;

	int iDst = 1;

	for (int iSrc = 1, c = values.size(); iSrc < c; ++iSrc) {
		// Check for unqiue values
		if (!is_equal(values[iDst - 1], values[iSrc]))
		{
			values[iDst++] = values[iSrc];
		}
	}

	values.resize(iDst);
}
```

雜草
1. 程式碼註解跟實作內容不符（我們只刪掉相鄰的重複項目而已）
2. 錯別字

```c=
// @brief Compress sequences of equal values in a vector
// 
// For any sequence of values in the vector considered equal, keep only
// the first value in that sequence, removing the duplicates.
//
// @param values Vector to compress
// @param is_equal Comparison function to use

template <class T>
void compressVector(
	vector<T> & values, 
	bool (* is_equal)(const T &, const T &))
{
	if (values.size() == 0)
		return;

	int iDst = 1;

	for (int iSrc = 1, c = values.size(); iSrc < c; ++iSrc) {
		// Check for unique values
		if (!is_equal(values[iDst - 1], values[iSrc]))
		{
			values[iDst++] = values[iSrc];
		}
	}

	values.resize(iDst);
}
```
雜草
1. 命名：i/c這兩個變數沒有遵循約定慣例(index/count)
2. is_equal應該是isEqual
3. 大括號格式不一至
4. 把多個參數全都放在for語句中

```c=
// @brief Compress sequences of equal values in a vector
// 
// For any sequence of values in the vector considered equal, keep only
// the first value in that sequence, removing the duplicates.
//
// @param values Vector to compress
// @param isEqual Comparison function to use

template <class T>
void compressVector(
	vector<T> & values, 
	bool (* isEqual)(const T &, const T &))
{
	int count = values.size();
	if (count == 0)
		return;

	// Copy values that aren't equal to their predecessor

	int destIndex = 1;
	for (int sourceIndex = 1; sourceIndex < count; ++sourceIndex) 
	{
		if (!isEqual(values[destIndex - 1], values[sourceIndex]))
		{
			values[destIndex++] = values[sourceIndex];
		}
	}

	values.resize(destIndex);
}
```

### 雜草鑑定
- 所發現的問題，安不安全
- 我們基本上就是在不影響功能情況下，提高了程式碼的可讀性和一制性

### 雜草怎長出來的？
- 對於某些程式設計師來說很像雜草的東西，在另一位程式設計師眼中可能是一朵花。
- 對於註解說明感到疑惑，但對程式碼理解沒有足夠信心
- 團隊新成員所寫出來得程式碼（雖然資深程式設計師有能力修改，但也讓新成員少掉一個可以學習專案格式的機會）