gpt4 book ai didi

c# - 构建器模式 - 带前提条件的方法

转载 作者:行者123 更新时间:2023-12-01 21:43:26 26 4
gpt4 key购买 nike

为了测试目的,我有一个 Factory产生 Product使用Builder 。每个Product可以有一个状态( Available/InUse/Disposed/等)。我需要在各个州生产产品。

我的问题是,为了让我生成 Product比方说,Disposed状态,首先需要是 InUse (必须使用 new ProductBuilder().CheckIn().Dispose().Build(); 而不仅仅是 new ProductBuilder().Dispose().Build(); 创建它)

我如何(或者必须?)为构建器方法强制执行此前提条件并保持圈复杂度为 1(因此不需要进一步测试) 。

不想使用类似if (product.Status == Product.INUSE) {...}的东西和 throw exceptions对于每种可能的情况(不同的状态需要不同的前提条件)。

由于构建器是私有(private)的,我是否需要强制执行此操作?我是否只依靠程序员知道需要调用方法的顺序,并在每个构建器方法之前添加一些注释?我要选择不同的模式(哪个?)。

public static class ProductFactory
{
private class ProductBuilder
{
private Product product;

public ProductBuilder()
{
product = new Product {Status = product.AVAILABLE};
}

public ProductBuilder Dispose()
{
product.Status = product.DISPOSED; return this;
}

public ProductBuilder CheckIn()
{
product.Status = product.INUSE; return this;
}

public Product Build()
{
return product;
}
}

public static Product CreateAvailable()
{
return new ProductBuilder().Build();
}

public static Product CreateInUse()
{
return new ProductBuilder().CheckIn().Build();
}

public static Product CreateDisposed()
{
return new ProductBuilder().CheckIn().Dispose().Build();
}
}

最佳答案

首先,您必须跨多个接口(interface)隔离这些方法(CheckInDispose):

public interface IBaseBuilder
{
Product Build();
}

public interface IProductBuilder : IBaseBuilder
{
ICheckedInProductBuilder CheckIn();
}

public interface ICheckedInProductBuilder : IBaseBuilder
{
IDisposedProductBuilder Dispose();
}

public interface IDisposedProductBuilder : IBaseBuilder
{

}

这样,给定一个初始的IProductBuilder:

  • 您只能按特定顺序调用 CheckIn -> Dispose
  • 一旦调用CheckIn,就无法再次调用
  • 一旦调用Dispose,就无法再次调用
  • 您还可以随时调用Build来创建产品。

为了使事情更容易实现,您可以让一个类实现所有三个接口(interface),并使用主 IProductBuilder 接口(interface)将其注入(inject)到其客户端中。或者,您可以让不同的类实现接口(interface)。我将把它作为练习。

作为一个现实世界的例子,这种技术广泛应用于 Moq 和 FluentAssertions实现流畅的 API。

相关:Making my class 'fluent'

关于c# - 构建器模式 - 带前提条件的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30047580/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com