加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c#interface segregation原理示例混淆

发布时间:2020-12-16 07:07:45 所属栏目:百科 来源:网络整理
导读:我对编程很新,我很难理解如何有效地应用以下链接中显示的原理(ATM一): http://www.objectmentor.com/resources/articles/isp.pdf 基本上,它从一个不抱怨ISP(接口隔离原理)的设计开始,然后继续将行为重构为不同的接口. 我的问题是:我们不是使用接口来表达不
我对编程很新,我很难理解如何有效地应用以下链接中显示的原理(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,您的用户界面应该充满了易失性代码,而您的界面应该是最不易变的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读