Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 枚举与接口设计_Oop_Design Patterns - Fatal编程技术网

Oop 枚举与接口设计

Oop 枚举与接口设计,oop,design-patterns,Oop,Design Patterns,我有一个设计问题,要求如下: 编写一个接受参数(“类型”)的生成函数 根据类型,我需要生成一个字符串并返回它。因此,类型有效地改变了生成字符串的方式 我正在考虑两种设计方案: 使用枚举:创建具有以下类型的枚举。然后提供一个generate方法,该方法根据类型执行处理并返回字符串 使用接口:创建具有函数generate()的接口。为每种类型创建实现,以实现generate() 您觉得哪一种更好,原因是什么。尽管方法2遵循OOAD的打开/关闭原则,即您将添加新的接口实现,每次添加新类型时,您都不会修

我有一个设计问题,要求如下:

  • 编写一个接受参数(“类型”)的生成函数
  • 根据类型,我需要生成一个字符串并返回它。因此,类型有效地改变了生成字符串的方式
  • 我正在考虑两种设计方案:

  • 使用枚举:创建具有以下类型的枚举。然后提供一个generate方法,该方法根据类型执行处理并返回字符串
  • 使用接口:创建具有函数generate()的接口。为每种类型创建实现,以实现generate()
  • 您觉得哪一种更好,原因是什么。

    尽管方法2遵循OOAD的打开/关闭原则,即您将添加新的接口实现,每次添加新类型时,您都不会修改现有代码,这是非常安全的方法,因为它不需要测试旧的代码/方法。因此,您的代码将为扩展而打开,但为修改而关闭。然而,如果您要经常添加新类型,那么方法#2是有意义的


    在本例中,我建议使用方法1,因为业务需求非常简单,即根据参数类型生成字符串。因此,在我看来,使用接口将过于工程化(如果不经常添加类型的话)。

    对于这个问题陈述,最好使用一些设计模式,使代码更加健壮和可重用。我将向您推荐策略设计模式。使用接口的是基于抽象的模式

    基本示例:

    public interface IMyStrategy
    {
        string Generate(string someValue);
    }
    
    public class StragegyA : IMyStrategy
    {
        public string Generate(string somevalue)
        {
            return /Implementation/;
        }
    }
    
    public class StragegyB : IMyStrategy
    {
        public string Generate(string somevalue)
        {
            return /Implementation/;
        }
    }
    public class MyStrategyContext
    {
        private readonly IMyStrategy _ImyStrategy;
    
        public MyStrategyContextIMyStrategy(IMyStrategy  myStragegy)
        {
            _ImyStrategy = myStragegy
        }
    
        public string GenerateResult(string someValue)
        {
            return _ImyStrategy .Generate(someValue);
        }
    }
    
    [Test]
        public void GenerateValue()
        {
       var abc = new MyStrategyContext(new StragegyA());
           abc.GenerateResult("hey print");
        }
    

    两者都做:创建一个枚举,该枚举使用
    generate()
    方法实现接口。那你就两全其美了。听起来不错。但是enum在类实现接口方面提供了什么优势呢?这有点像你在这里丢了作业。你的想法是什么?如果是这样的话,很抱歉,但是家庭作业并没有给你选择的答案。我提出了这两种解决方案,并认为如果类型变化不大,第一种方案就足够简单和充分了。第二种方法适用于类型可能发生变化的场景,因此我们依赖于可伸缩性。我发帖子是想看看人们是否还能看到其他好处谢谢你的建议谢谢你的建议。