2011-07-10 14 views
3

我知道在同一個類中從一種方法委託給另一種方法是可以的,因爲它減少了代碼重複,但是將調用委託給被認爲是不好實踐的其他類類型?委託類之間的調用不良做法?

例如:

這樣做沒問題。


double Point::GetDistanceFrom(const Point& point) const { 
    return GetDistanceFrom(this->GetX(), this->GetY(), point.GetX(), point.GetY()); 
} 

double Point::GetDistanceFrom(const Point& one, const Point& two) { 
    return GetDistanceFrom(one.GetX(), one.GetY(), two.GetX(), two.GetY()); 
} 

double Point::GetDistanceFrom(double x1, double y1, double x2, double y2) { 
    return std::sqrt(GetDistanceFromSquared(x1, y1, x2, y2)); 
} 

double Point::GetDistanceFromSquared(double x1, double y1, double x2, double y2) { 
    x2 -= x1; 
    y2 -= y1; 
    return (x2 * x2 + y2 * y2); 
} 
double Point::GetDistanceFromSquared(const Point& one, const Point& two) { 
    return GetDistanceFromSquared(one.GetX(), one.GetY(), two.GetX(), two.GetY()); 
} 

但這又如何呢?



double Point::GetDistanceFrom(const Line& line, bool isInfinite) const { 
    if(isInfinite) return line.ptLineDist(line.GetPointOne().GetX(), line.GetPointOne().GetY(), line.GetPointTwo().GetX(), line.GetPointTwo().GetY(), this->GetX(), this->GetY()); 
    return line.ptSegDist(line.GetPointOne().GetX(), line.GetPointOne().GetY(), line.GetPointTwo().GetX(), line.GetPointTwo().GetY(), this->GetX(), this->GetY()); 
} 

而這個?



double Line::GetDistanceFrom(const Point& point, bool isInfinite) const { 
    return point.GetDistanceFrom(*this, isInfinite); 
} 
+1

對於投票結束這個問題的人 - 你會有什麼改進?這個問題是代碼審查和詢問OO校長之間的混合,但我個人認爲它有一個具體的答案。 –

回答

2

被委託給認爲是不好的做法,其他類類型的呼叫?

可能最適用的OO設計規則是encapsulationPoint類不應該真的知道Line上存在ptSegDist方法。但它可以隨意使用其公共接口進行任何操作。

在這種情況下,就好像你可以很容易地交換的責任你是委託:

double Point::GetDistanceFrom(const Line& line, bool isInfinite) const { 
    return line.GetDistanceFrom(*this, isInfinite); 
} 

double Line::GetDistanceFrom(const Point& point, bool isInfinite) const { 
    if(isInfinite) return ptLineDist(GetPointOne().GetX(), GetPointOne().GetY(), GetPointTwo().GetX(), GetPointTwo().GetY(), point.GetX(), point.GetY()); 
    return ptSegDist(GetPointOne().GetX(), GetPointOne().GetY(), GetPointTwo().GetX(), GetPointTwo().GetY(), point.GetX(), point.GetY()); 
} 

在類中調用現有的干將不違反任何OO或封裝規則。在這種情況下,它也需要稍少的代碼。

+0

順便說一句,請注意,我說*現有* getters :)通常創建一個getter開始是不好的,因爲它違反了封裝。但在這個類的情況下,在公共接口上有getter/setter是有意義的。幾何是非常低的水平,因此應該有點像一個簡單的數據結構(公共訪問其定義的頂點,向量等)。 –

2

計算直線和點之間距離的函數不是直線和點都不包含的部分。我會把它變成一個全球性的功能。或者是一些Distance類的靜態方法。實際上,所有其他的GetDistanceFrom函數也應該去那裏。想象一下,你必須計算一個正方形和一個三角形之間的距離。該功能在哪裏去?

+0

我不需要。矩形由四個點組成(通過代理四個線段),三角形由三個點組成。我只是找到矩形的四個點/線與三角形的三個之間的最短距離。 – Casey

+0

+1;我同意將距離計算放在全局函數或距離類中作爲靜態方法是有意義的。這不是唯一的好設計(他現有的設計也很好),但我喜歡它。這將需要許多「共享」功能的組合(真正不屬於任何一種對象類型的功能)並將它們放在一個地方。它也會相當乾淨地支持重疊的參數順序的重載。 @Casey:這是一個比你想象的更大的算法,絕對應該用自己的功能或類。 –

+0

@Casey:你會錯的。一個點和一個三角形之間的距離通常比任何邊界線的距離要短,就像到一個點的距離通常小於到它的任何一個頂點的距離。不管它是多麼容易 - 你仍然需要一些函數來進行計算。 – leftaroundabout