c#interface segregation原理示例混淆
我对编程很新,我很难理解如何有效地应用以下链接中显示的原理(ATM一):
http://www.objectmentor.com/resources/articles/isp.pdf 基本上,它从一个不抱怨ISP(接口隔离原理)的设计开始,然后继续将行为重构为不同的接口. 我的问题是:我们不是使用接口来表达不相关(或不相关)抽象中的共同行为吗? 在接口中封装方法有什么意义,如果不是一个将与将要实现它们的类共享?在哪种情况下,这可能被认为是有用的? 如果我们继续该示例的行,则给出以下代码: public interface ITransaction { void Execute(); } public interface IDepositUi { void RequestDepositAmount(); } public class DepositTransaction : ITransaction { private IDepositUi depositUI; public DepositTransaction(IDepositUi ui) { depositUI = ui; } public virtual void Execute() { /*code*/ depositUI.RequestDepositAmount(); /*code*/ } } public interface WithdrawalUI { void RequestWithdrawalAmount(); } public class WithdrawalTransaction : ITransaction { private WithdrawalUI withdrawalUI; public WithdrawalTransaction(WithdrawalUI ui) { withdrawalUI = ui; } public virtual void Execute() { /*code*/ withdrawalUI.RequestWithdrawalAmount(); /*code*/ } } public interface TransferUI { void RequestTransferAmount(); } public class TransferTransaction : ITransaction { private TransferUI transferUI; public TransferTransaction(TransferUI ui) { transferUI = ui; } public virtual void Execute() { /*code*/ transferUI.RequestTransferAmount(); /*code*/ } } public interface UI : IDepositUi,WithdrawalUI,TransferUI { } 据我所知,为了使用以前的设计,我们应该有类似的东西: UI impui = new IMPLEMENTATIONUI(); // Some UI implementation DepositTransaction dt = new DepositTransaction(Gui); dt.Execute(); 现在,我们不需要IMPLEMENTATIONUI实现每一种方法吗?如果是这样,它不会打破SRP吗? 解决方法
我们不是使用接口来表达不相关(或不相关)抽象之间的共同行为吗?
是的,在SOLID中,接口需要表达共同的行为.您的交易界面就是一个极好的例子. DepositTransaction和WithdrawlTransaction类都依赖于它. ISP(接口隔离原则)希望您将其拆分,因为您可能需要将Transaction对象传递给函数来执行它.所有SOLID原则都是设计的例如: void ExecuteTransaction(Transaction transaction) { transaction.Execute(); } 请注意,此方法不依赖于Transaction接口.这是依赖倒置. 如果您不创建此接口,则需要创建两个不同的方法来执行WithdrawlTransaction或DepositTransaction;相反,您可以使用ExecuteTransaction方法并传入实现Transaction的任何内容. ExecuteTransation(withdrawl_TransactionObject); 要么 ExecuteTransaction(deposit_TransactionObject); 或以后的未来: ExecuteTransaction(unanticipatedNewTypeOf_TransactionObject); 现在,它不会打破SRP吗? 实现UI可能是用户用来与软件交互的内容.用户不会有单一责任,理论上他/她将不得不使用IMPLEMENTATIONUI类所需的所有接口. 我怀疑实现UI将实现所有接口,但它可能会使用所有这些接口来执行事务.要解释“Uncle Bob”Solid Principles,您的用户界面应该充满了易失性代码,而您的界面应该是最不易变的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |