2017-03-31 150 views
0

這是我第一次使用SOLID原則編寫C++代碼。因此我不知道下面的示例代碼是否正確實現了這些原則。我的問題遵循代碼。我是否正確實施SOLID原則?

我非常感謝所有回覆。謝謝!

下面是示例:

class ICustomer 
{ 
public: 
     virtual char* GetName() = 0; 
     virtual char* GetSurname() = 0; 
     virtual char* GetAddress() = 0; 
}; 

class CCustomer : public ICustomer 
{ 
public: 
     virtual char* GetName() 
     { 
       return "Name1"; 
     } 

     virtual char* GetSurname() 
     { 
       return "Surname1"; 
     } 

     virtual char* GetAddress() 
     { 
       return "Address1"; 
     } 
}; 

class IExporter 
{ 
public: 
     virtual void Export() = 0; 
}; 

class CExportToExcel : public IExporter 
{ 
public: 
     virtual void Export() 
     { 
       ICustomer* pCustomer = new CCustomer; 
       printf("%s, %s, %s\n", pCustomer->GetName(), pCustomer->GetSurname(), pCustomer->GetAddress()); 
     } 
}; 

class IShopOwner 
{ 
public: 
     virtual void Execute() = 0; 
}; 

class CShopOwner : public IShopOwner 
{ 
public: 
     virtual void Execute() 
     { 
      IExporter* pExp = new CExportToExcel; 
      pExp->Export(); 
     } 
}; 

void main() 
{ 
     IShopOwner* pOwner = new CShopOwner; 
     pOwner->Execute(); 
} 

問題:

  1. 它是一個有效的實體實施?如果不是,應該如何。
  2. 在樣本ICustomerGetName()GetSurname()GetAddress()。我想要一個額外的信息GetPhoneNumber()。我應該把它放在哪裏?它會發生什麼變化?
  3. 在示例中有CExportToExcel。現在我想要一個額外的類CExportToHTML並使用它。我應該怎麼做?

回答

1

關鍵反饋是通過具體的類構造函數採取的依賴,並把這些依賴關係的接口不是具體的類,所以。在你的對象組成的根,你可以決定哪些實際的具體實施轉嫁創建你的對象,也就是接口的另一個產品實現,或者只是一個測試模擬類,以實現可測試性。它也很適合依賴注入模式和框架。

爲例: 更改CShopOwner類有一個構造函數的IExporter對象,保持該對象的屬性,並使用你的Execute方法內。當你創建你的CShopOwner對象時,在運行時你可以決定接口的具體實現是什麼,以將它傳遞給它。 CExportToHTML

這應該涵蓋你的第一和第三個問題。關於你的第二個問題。如果GetPhoneNumber()ICustomer的所有實現相關,純粹地說你應該創建一個新接口,它繼承自ICustomer,使用一種方法 - GetPhoneNumber() - 而不是更改ICustomer接口,特別是如果它已被客戶端代碼使用,通過改變合同來破壞合同,並可能對現有客戶造成問題。另一方面,如果你評估這種情況和風險,你可以直接更改界面和所有的用戶界面,如果這是你自己的代碼,那將會容易得多。我們已經完成了它:)

+0

類似地'ICustomer'實現應該通過構造函數或屬性注入'CExportToExcel'中。 – niksofteng

+0

是的,正如我在我的答案的第一行中提到的那樣,適用於所有依賴關係。關於您通過屬性獲取依賴項的評論,我不會推薦。理想情況下,依賴關係應該通過對象構造函數進行,並通過Get only屬性公開。 (而不是Get/Set)。這樣,一旦在組合根上創建對象圖,就會知道它不會沿着執行流更改,並且依賴關係將保持只讀狀態。 –

+0

我同意你的看法,而且我一直都喜歡構造函數注入。但是,我們不能否認這樣的事實,即有時候依賴項是可選的,並且您仍然可以在不依賴它的情況下初始化類,因爲您要在該類實例上執行的操作不需要該依賴項。那時應該考慮制定者/財產注入的時間。我很樂意知道你對此的看法。首先讓我+1你的答案,這很有用。 – niksofteng