- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为了测试目的,我有一个 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)隔离这些方法(CheckIn
和 Dispose
):
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。
关于c# - 构建器模式 - 带前提条件的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30047580/
我是一名优秀的程序员,十分优秀!