Coding Style

陳哲雋

2015/10/29

聲明:

本內容不進行任何語言、任何語法、命名法以及寫法(如括號位置)之爭論,亦不爭論任何最佳編輯器(我就喜歡Sublime Text,就這樣)

Who am I:

陳哲雋(阿哲)

師大資工 105級

第一屆師大資研社社長

fb.me/one5809

我最喜歡在開頭先來做個調查:

個人開發經驗

合作開發經驗

接手他人code

舊code回顧

(。ŏ_ŏ)你不會想看到:

Ugly code

神秘的變數


a=0
b=14
c=3.141592653589793846
d="y"
e="x"
print("What is:"+a+b+c+d+e+" mean?")
						

	for(a:0..10){
	    for(ana:a..an[a]){
	        an[a*ana] = an[a]*ana;
	    }
	}
						

哇!竟然能回文!

意義不明


if False:
	# never do

if 1 == 1:
	# always do
					

難以辨明

這幾個函式在幹嘛?


		x = a(1,2,3)

		y = b(4,5,6)

		z=c(x,y)+d(x,y)
						

你他X逗我嗎?


funtion turnGreen(object){
	object.color = "yellor"
}
						

純粹賣盟(看出來了嗎?)


namespace{
    enum fruit {a,b};
    volatile fruit juice;
    extern bool orange(fruit);
    run();
}

do{
    orange(juice);}while(1);

template <typename S>class
Henry{
    int i=0;
    S s;
}

					

為甚麼要 Coding Style?

甚麼是漂亮的程式碼?

  • 可讀性
  • 結構性
  • 一致性
  • 簡潔

但最要先考慮的是給誰看

可讀性

通用的命名風格

  • 首字大寫表類別(如class、Object、enum)
  • 變數、函式首字小寫
  • 各語言和開發團隊都有特定的命名法

簡單且清楚的表達意義


class Checklist{
	int numberOfChecklist();
}
						

a = 3.141592653589793846
pi = 3.141592653589793846

class DataObject{ ... }
name = "data"
file_name = "data"
db_name = "database"
						

精確的表達


funtion turnGreen(object){
	object.color = "yellor"
}
						

Widget WidgetSet[];
Widget WidgetArray[];
						

排版


int a=1,b=2,c=3;int getAnswer = a*a*b+a*3;

int a=1,b=2,c=3;
int getAnswer = a*a*b+a*3;
						

x=getNum(1);print(1)
print(x);print(2);print("GO")
print(3);print("step 1, 2, 3 finish")
						

//In C++:
if(!good)
    printf("bad");
    return false;
						

結構性

清楚的分層


//In C++:
if(!good)
    printf("bad");
    return false;
						

//In C++:
if(!good){
    printf("bad");
    if(very_bad){
        // ...
    }
}
return false;
						

相關的放一起,還要注意順序


int foo(int attr){
	int input;
	scanf("%d",&input);

	int version = convert(attr);
	return version + input;
}
						

class MyString{
public:
	MyString();
	~MyString();

	int length();
	char IndexOf(int index) ;
}
						

邏輯


if(a==1){
    //...
}
else if(a==2){
    //...
}
else if(a==3){
	//...
}
						

switch(a){
case1:
    // ...
case2:
    // ...
case3:
    // ...
}
						

一致性

團隊溝通

呈現風格要一致


function fuzz(){
	//...
}

function buzz()
{
	//...
}
						

命名風格要一致


int name_style;
int nameStyle;
int Name_Style;
int name_Style;
int Name_Style;
						

String str;
length(str);
len(str);
						

結構要一致


String str;
length(str);
sizeOf(len);
str.length();
str.size();
str.sizeOf();
						

縮排要一致

tab v.s. space

簡潔

不要複製


doSomethong(1)
doSomethong(2)
doSomethong(3)
doSomethong(4)
doSomethong(5)

for i in range(1,6):
    doSomethong(i)
						

for i in range(1,6):
    # do 1
for i in range(1,6):
    # do 2

for i in range(1,6):
    # do 1
    # do 2
						

注意邏輯


if(true)//...

if(false)//..
						

if(a OR (!a AND b))
if(a OR b)

if(a){
	if(a AND b)//..
}
						

簡化語法


if( expression ){
    return true;
}
else{
	return false;
}

return expression;
						

if(result == true)

if(result)
						

if(str){
    return str.length()==10;
}
else{
    return false;
}

return str && ( str.length()==10 );
						

注意註解


i += 1 ; // i plus 1
						

// use loop to calculate the total
int total = 0;
for(int i=0; i < Max; i+=1){
	total += items[i];
}
						

/*************************************
* This is a pretty comment*
* This look so cool ! *
* But hope it never need to fix what*
* this to comment, and I will not need*
* to fix this....*
***************************************/
						

說了那麼多,其實最重要的是:

想看的人要看得懂

團隊一開始要溝通好

謝謝大家!m(_ _)m