iT邦幫忙

2024 iThome 鐵人賽

DAY 6
0

Breaking Yo-Yo Hierarchies

簡介

假如你在尋找一個方法的具體實作, 必須在這方法的類別階層裡上上下下尋找.
這種階層稱為Yo-Yo Hierarchies

重構前範例

假設有個畫板應用程式, 其中一項圖案是長方形類別 Rectangle, 他目前有多種子類別繼承來Draw不同的繪畫功能

abstract class Rectangle
{
    public abstract void Draw();
}

class BaseRectangle : Rectangle
{
    public override void Draw()
    {
        //...
    }
}

class DraggableRectangle : BaseRectangle
{
    public override void Draw()
    {
        //...
    }
}

class OrientationRectangle : DraggableRectangle
{
    public override void Draw()
    {
        //...
    }
}

class ColorRectangle : OrientationRectangle
{
    public override void Draw()
    {
        //...
    }
}

class LoggedRectangle : ColorRectangle
{
    public override void Draw()
    {
        //...
    }
}

class RealRectangle : LoggedRectangle
{
    public override void Draw()
    {
        //...
    }
}

重構後範例

上述的長方形, 其實每種特性應該是要獨立出來, 而不是用繼承.
因此, 可建立一個IRectangle 介面, 而需要新功能的則是用裝飾者(decorator)


interface IRectangle
{
    void Draw();
}

abstract class Rectangle : IRectangle
{
}

class DraggableRectangleDecorator : IRectangle
{
    public void Draw()
    {
        //...
    }
}

class OrientationRectangleDecorator : IRectangle
{
    public void Draw()
    {
        //...
    }
}

class ColorRectangleDecorator : IRectangle
{
    public void Draw()
    {
        //...
    }
}

class LoggedRectangleDecorator : IRectangle
{
    public void Draw()
    {
        //...
    }
}

class RealRectangle : IRectangle
{
    public void Draw()
    {
        //...
    }
}

經過這種重構, 每個特性幾乎平行, 需要找具體實作會很容易

為何要重構

太深的繼承階層, 使程式碼的重複使用與可讀性降低.
不重構只會讓階層更高耦合、低內聚.


上一篇
Replace Nested Conditional with Guard Clauses 的重構
下一篇
Replace Method with Method Object 的重構
系列文
程式淨化計畫:痛苦是重構的起源!31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言