一千萬個為什麽

搜索

如何在不使用靜態或單例的情況下改進此代碼?


我曾經為我的DAL類使用靜態或單例。但是,我讀到一些文章說單身人士是邪惡的,應該避免。因此我嘗試重寫我的代碼,如下所示: public class CustomerBLL { private CustomerHelper helper = new CustomerHelper(); private CustomerDAL dal = new CustomerDAL();

public void Method1(string param)
{
    dal.Method1(param);
}

public void Method2(string param)
{
    dal.Method2(param);
}

public void MethodA(int param)
{
    helper.MethodA(param);
}

}

如何改進此代碼?它看起來不對勁。

最佳答案

我相信一些概括應該是輕率的。即說單身人一般是邪惡的並不準確,因為在某些情況下,辛格爾頓是一個合適的(也許是唯一的)解決方案。是的,我確實認為這是過度濫用的模式之一。在完成這項工作之後,我開始回答你的問題。 從您提交的代碼示例中可以清楚地看出, CustomerBLL 沒有業務邏輯,只是在數據訪問和其他幫助程序類之上充當Façade。外墻本質上應該是無國籍的。 話雖如此,我將根據可測試性和解耦要求提供兩種選擇。 如果你想讓你 CustomerBLL 可測試並將其與 CustomerHelper 和 CustomerDAL 具體結果分開並用抽象代替它們,那麽一個好的設計增強將會將 CustomerHelper 和 CustomerDAL 依賴項註入 CustomerBLL 類,它允許您模擬和存根數據訪問和幫助程序類並專註於測試使用 CustomerBLL 類的其他代碼模塊。當然,通過提取接口來實現這一點。

下面是一個示例,說明如果我們通過構造函數註入依賴項,代碼將如何顯示,請註意您的CustomerBLLFaçade將是一個實例類,即不會公開靜態方法。 public class CustomerBLL { private readonly ICustomerHelper _helper; private readonly ICustomerDAL _dal;

//default constructor initializes the concrete dependencies public CustomerBLL() :this(new CustomerHelper(), new CustomerDAL()) {}

//constructor to inject stubbed dependencies for testing purposes public CustomerBLL(ICustomerHelper customerHelper, ICustomerDAL customerDal) { _helper = customerHelper; _dal = customerDal; }

public void Method1(string param)
{
    _dal.Method1(param);
}

public void Method2(string param)
{
    _dal.Method2(param);
}

public void MethodA(int param)
{
    _helper.MethodA(param);
}

}

public interface ICustomerDAL { void Method1(string s); void Method2(string s); }

public interface ICustomerHelper { void MethodA(int i); }

internal class CustomerDAL : ICustomerDAL { public void Method1(string s) { }

public void Method2(string s)
{
}

}

internal class CustomerHelper : ICustomerHelper { public void MethodA(int i) { } }

另一方面,可測試性根本不是一個問題,那麽你可以通過靜態方法以程序的方式使用CustomerBLL作為外觀(盡管我更喜歡可測試性方法,但並不是每個人都喝茶) 。

在這裏您註意到我刪除了包含對Helper和DAL類的引用的私有字段,因為我們想要宣傳CustomerBLLFaçade是無狀態的。 public class CustomerFacade { public static void Method1(string param) { new CustomerDAL().Method1(param); }

public static void Method2(string param)
{
    new CustomerDAL().Method2(param);
}

public static void MethodA(int param)
{
    new CustomerHelper().MethodA(param);
}

}

我已經看到並使用了這兩種方法,根據我的拙見,它們都是有效的,具體取決於使用場景。總的來說,我贊成可測試設計和解耦模塊,這就是我提出第一種方法的原因。

轉載註明原文: 如何在不使用靜態或單例的情況下改進此代碼?

猜你喜歡