2010年12月6日 星期一

用OO思考加減乘除的作法!?

在OO的世界裡, 什麼都能用Object來實現, 但也許會有人說, 下面的程式很好

 

int main() {
    int a = 0, b = 0;
    char op = 0;
    cout << "Please input the operation: +, -, *, /" << endl;
    cin >> op;
    cout << "Please input the first number ==> ";
    cin >> a;
    cout << "Please input the second number ==>";
    cin >> b;

    int result = 0;
    if(op == '+') {
        result = a+b;
    } else if(op == '-') {
        result = a-b;
    } else if(op == '*') {
        result = a*b;
    } else if(op == '/') {
        result = a/b;
    } else {
        // error!!
    }
    cout << "Result: " << result << endl;
}

很好, 這程式其實沒什麼大問題, 而且寫得很清楚(因為是我寫的!!XD), 但..沒有錯的程式就代表是好程式嗎?在以前可能是, 因為這code好懂又沒錯, 直到OO世界之後, 這樣的code不但不好, 而且充滿了不可知的後果!!為什麼說不可知呢??如

試想一下, 這時只果我想再加入一個operation時怎麼做, 就叫做%好了, 取出果個除數的餘數, 這時要改動的code有多少呢?

想一下好像又不難, 在if else再加一個就好了不是嗎??對, 這是其中之一的解答, 但確不是最好的解答..如果你是一個OOP的程式設計師, 你肯定馬上就發現這樣的修改太麻煩了..所以你會這麼寫..

class IOperation abstract {
public:
    virtual double GetResult() = 0;
    void SetNum1(double num1) {
    m_dNum1 = num1;
}
    void SetNum2(double num2) {
    m_dNum2 = num2;
}
protected:
    double m_dResult;
    double m_dNum1;
    double m_dNum2;
};

寫到此, 大概也就知道+有自己的兩個元素, -也有, /也有, *也有, 所以要再加一個%也不是什麼難事, 只要繼承就好, 所以, 再簡單的程式, 也有可以使用OOD的地方, 別再小看OO了, 另外這個方法, 其實也是design pattern裡的工廠模式, 只要有一個factory, 就可以create出任何的+-*/方法, 這樣一來對於client, 他只要input 三個東西, 就可以得到結果, 不用去考慮裡面的實作..也算是一種很好的應用...

沒有留言: