首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#类设计问题,以使其单元可测试

C#类设计问题,以使其单元可测试
EN

Stack Overflow用户
提问于 2014-08-16 05:28:26
回答 1查看 90关注 0票数 1

我有一个用以下代码解释的场景

代码语言:javascript
运行
复制
namespace SyncDemo
{
    public interface IProcessorA
    {
        void FunctionA(int a);
        void FunctionB(string b);
    }
    public interface IProcessorB
    {
        void FunctionA(int a);
        void FunctionB();
    }
    public interface IRepositoryA
    {
        void Add();
        void Delete();
    }
    public interface IRepositoryB
    {
        void Add();
        Void Delete();
    }

    public class ProcessorA : IProcessorA
    {
        private readonly IRepositoryA _repositoryA;

        public ProcessorA(IRepositoryA repositoryA)
        {
            _repositoryA = repositoryA;
        }

        public void FunctionA(int a)
        {
            //business logic work
            _repositoryA.Add();
        }

        public void FunctionB(string b)
        {
            _repositoryA.Delete();
        }
    }

    public class ProcessorB : IProcessorB
    {
        private readonly IRepositoryA _repositoryA;
        private readonly IRepositoryB _repositoryB;

        public ProcessorB(IRepositoryA repositoryA, IRepositoryB repositoryB)
        {
            _repositoryA = repositoryA;
            _repositoryB = repositoryB;
        }

        public void FunctionA(int a)
        {
            //do the same business logic work as in FunctionA in Class ProcessorA
            _repositoryA.Add();
        }

        public void FunctionB()
        {
            _repositoryB.Delete();
        }
    }

    public class RepositoryA : IRepositoryA
    {
        //this repository is responsible to talk with 'A' data source
        public void Add()
        {
            throw new NotImplementedException();
        }

        public void Delete()
        {
            throw new NotImplementedException();
        }
    }

    public class RepositoryB : IRepositoryB
    {
        //this repository is reponsible to talk with 'B' data source
        public void Add()
        {
            throw new NotImplementedException();
        }

        public void Delete()
        {
            throw new NotImplementedException();
        }
    }
}

有一个常见的功能,在调用存储库之前,我必须在两个处理器中应用相同的业务逻辑。此外,ProcessorA和ProcessorB中还有其他方法直接调用存储库,因为没有要应用的业务逻辑。

我的困境是把通用的业务逻辑功能代码放在哪里。我是应该在静态方法中创建一个具有该通用功能的单独类,还是应该创建一个单独的类,它负责与RepositoryA对话并执行业务逻辑?

任何想法和帮助都是非常感谢的。提前谢谢。

苏约格。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-16 06:33:35

如果你遵循面向对象的设计准则,比如坚实的原则和其他的原则,比如DRY等,你应该知道单一责任原则(SRP),它规定一个类应该只有一个责任(目的),因此只有一个改变的理由。

现在,我不知道您正在工作的具体上下文,但是根据SRP,您必须决定您所谈论的公共功能的责任是否属于一个单独的类。还有几种设计模式,比如模板法模式战略模式,您可以使用它们来构造代码,以遵循不重复原则(DRY)。

对于我自己来说,我首先要检查是否可以消除一个存储库接口和一个处理器接口:它们看起来非常相似,例如,IProcessorB接口在其FunctionB中只有一个额外的string参数,将它与IProcessorA分离开来。您能避免这种情况(可能通过将字符串注入到实现此接口的具体类的构造函数中),从而形成由多个类实现的公共接口吗?例如,这将允许您将装饰图案引入代码中。

总之,这些只是我的猜测,因为我不知道你正在做的具体代码。如果您还有其他问题,请随时提问。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25337216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档