我画着图,FluentAPI她自己就生成了
在 Newbe.ObjectVistor 0.3 版本中我们非常兴奋的引入了一个紧张刺激的新特性:使用状态图来生成任意给定的 FluentAPI 设计。
开篇摘要
在非常多优秀的框架中都存在一部分 FluentAPI 的设计。这种 API 设计更加符合人类自言语言描述。使得代码更加具备可读性。
在 Newbe.ObjectVistor 0.3 版本中,我们设计引入了一种使用状态图来自动生成 FluentAPI 代码的机制。极大了简化了 FluentAPI 实现所需要的脑力劳动。
本篇我们将通过一些示例,来了解一下当前版本中该特性的主要效果。
整数累加 FluentAPI
假如,我们现在需要实现下面这样效果的一个 API:
[Test]
public void SumList()
{
var sumBuilder = new SumBuilder(new List<int>());
var re = sumBuilder
.AddNumber(1)
.AddNumber(2)
.AddNumber(3)
.Sum();
re.Should().Be(6);
}
这个 API 使用 FluentAPI 的方式来表述一个累加的过程。
为了实现这个 API 设计,在 Newbe.ObjectVisitor 0.3 中,使用下面这样一个状态图标记表述这个 API 设计:
stateDiagram
[*] --> AddNumber : AddNumber(int number)
AddNumber --> AddNumber : AddNumber(int number)
AddNumber --> [*] : Sum() return int
这实际上是 mermaid 状态图标记。转换为图形即为下面这个效果。不需要过多的解释就可以理解:
有了这个状态图之后,使用 Newbe.ObjectVisitor 中的 FluentApiDesignParser
和 FluentApiFileGenerator
便可以生成如下代码。
using System;
using System.Collections.Generic;
using System.Linq;
namespace Newbe.ObjectVisitor.Tests.SumBuilderFluentApi
{
public class SumBuilder : Newbe.ObjectVisitor.IFluentApi
, SumBuilder.ISumBuilder_AddNumber
{
private readonly List<int> _context;
public SumBuilder(List<int> context)
{
_context = context;
}
#region UserImpl
private void Core_AddNumber(int number)
{
throw new NotImplementedException();
}
private int Core_Sum()
{
throw new NotImplementedException();
}
#endregion
#region AutoGenerate
/// 此处省略了自动生成的固定代码部分,请到仓库中查看
#endregion
}
}
有了这个模板之后,只要实现 Core_AddNumber
和 Core_Sum
,一个符合预期设计的 FluentAPI 就完成了!
累加后累乘
现在,我们稍微改变一下需求。上节我们实现的是一个 1+2+3 这样的累加效果。现在我们需要一个 (1+2+3)*(4+5+6)*(7+8+9+10) 这样的效果。
示例的调用代码如下:
[Test]
public void MultipleSumList()
{
var builder = new MultipleSumBuilder(new List<List<int>>());
var re = builder
.AddNumber(1)
.AddNumber(2)
.NextFactor()
.AddNumber(3)
.Sum();
re.Should().Be(9);
}
为了实现这个效果,我们修改一下状态图,增加一条新的规则,得到:
stateDiagram
[*] --> AddNumber : AddNumber(int number)
AddNumber --> AddNumber : AddNumber(int number)
AddNumber --> AddNumber : NextFactor()
AddNumber --> [*] : Sum() return int
如图: