2013年12月1日 星期日

University: sorting students a responsibility for Department?

Task 4 的 sorting 該交給哪個物件負責?明顯的選項是Department,因為它認得所有學生。但是,如Matrix例子,我們選擇以其他C function處理linear transformation,目的在讓Matrix維持簡單、易懂。

所以,按照同一個想法,我將先以一個C函數處理這件工作。
先寫測試:

TEST (NameDec, sort){
Department cs("Computer Science","CS");
Student mary("Alan","U20130003", &cs);
Student john("Betty","U20130002", &cs);
Student paul("Carol","U20130001", &cs);

vector<Student *> stus(cs.students());
sort (stus.begin(),stus.end(),nameDec);
CHECK(string("Carol")==stus[0]->name());
CHECK(string("Betty")==stus[1]->name());
CHECK(string("Alan")==stus[2]->name());
}

需要寫Department::students、Student::name、nameDec等函數,其中:

bool nameDec(Student *s1, Student * s2){
return s1->name() > s2->name();
}

為了強調這個函數用於依姓名排序Student,可將它定義為Student的member function。如宣告成一般 method,則需透過
Student物件才能找到這個函數:

Student s(...);

sort (stus.begin(),stus.end(), s.nameDec);

邏輯上有些怪。解決的作法是將它定義成static member function:

class Student {
public:
...
static bool nameDec(Student *s1, Student * s2){...}
};

static 的意義是宣告nameDec為Student class共用。static函數無法取用 instance variable或呼叫非static 之 member function(原因與 this 有關)。

如此,可直接使用該函數

sort (stus.begin(),stus.end(),Student::nameDec);

接著,完成依ID排序。

學習議題: static member function。


L步驟:請試著以user與programmer的角度回顧,增加必要的improvement round。

沒有留言:

張貼留言