我正在编写一个用于创建几何形状的API,并且在编写我的方法时遇到了一些困难.
我们来看一个简单的例子:创建一个圆圈.我们大多数人可能熟悉像这样的方法graphics.drawEllipse(x, y, w, h)
.要绘制圆,您需要知道左上角坐标以及圆的宽度和高度.
我的API旨在让开发人员可以轻松地使用各种信息绘制形状,而无需进行大量的数学运算 - 这对于圆形来说是微不足道的,但对于其他形状则更为复杂.例如,您还应该能够根据其中心坐标和半径或左上角和右下角坐标绘制圆.
所以我有一个Circle
类工厂方法,如:
?那只是邪恶吗?Circle.createWithCenterAndRadius(cx, cy, r)
Circle.createWithBoundingBox(x1, y1, x2, y2)
Circle.createWithWidthAndHeight(x, y, w, h)
如果您要使用此API,那么这样的方法名称对您来说是否合适?您对如何使方法名称更加清晰有建议吗?
您可以将圈子方法更改为
Circle.FromCenterAndRadius(...) Circle.FromBoundingBox(...) Circle.FromWidthAndHeight(...)
这意味着你以一种简洁的方式从不同的表现形式创建圈子......
任何不支持命名参数的语言都可以.如果语言支持命名参数,我更喜欢简短的Create,只有明显的参数名称.
对于具有命名参数的语言,您将:
Circle.Create( centerX = cx, centerY = cy, radius = r );
另一个更复杂的选择,就是一个流畅的界面(但可能太多了):
circleBuilder.Center(cx,cy).Radius(r) circleBuilder.Center(x,y).Width(w).Height(y) circleBuilder.BoundWith().Left(x1,y1).Right(x2,y2)
Center返回仅允许Radius或Width的中间类的实例.并且BoundWith返回仅允许Left的一个.
我认为你的描述方法没有任何问题 - 它们是紧凑的,并准确描述了正在发生的事情.图书馆的用户对您的方法的功能毫无疑问,对于维护程序员也是如此.
如果您真的担心暴露大量工厂方法(例如使用属性类的工厂方法),您也可以在此处应用一些设计模式.您可以拥有一个CircleProperties类,其属性包括CenterX,CenterY,Radius,(bool)UseCenterX,(bool)UseCenterY等,然后将其传递给公共工厂方法,该方法将确定要使用的(私有)工厂方法.
假设C#:
var circleProperties = new CircleProperties() { CenterX = 10, CenterY = -5, Radius = 8, UseCenterX = true, UseCenterY = true, UseCenterRadius = true }; var circle = Circle.Create(circleProperties);
我的第一直觉是拥有更多类型,这将允许更直观的方法重载.
// instead of Circle.createWithCenterAndRadius(cx, cy, r) Circle.create( new Point(cx,xy), r); // instead of Circle.createWithBoundingBox(x1, y1, x2, y2) Circle.create( new Point(x1,y1), new Point(x1,y1) ); // or even... Circle.create( new Box(p1,p2)); // instead of Circle.createWithWidthAndHeight(x, y, w, h) Circle.create( new Point(x,y), w, h);
和Point一样,你可以定义Distance(允许不同的单位)
如果这种风格适合你,请考虑为什么需要工厂方法而不是构造函数.
Circle c = new Circle(new Point(cx,xy), r);