Dav*_*lle 5 api naming-conventions
我正在编写一个用于创建几何形状的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,那么这样的方法名称对您来说是否合适?您对如何使方法名称更加清晰有建议吗?
Jas*_*yon 14
您可以将圈子方法更改为
Circle.FromCenterAndRadius(...)
Circle.FromBoundingBox(...)
Circle.FromWidthAndHeight(...)
Run Code Online (Sandbox Code Playgroud)
这意味着你以一种简洁的方式从不同的表现形式创建圈子......
egl*_*ius 11
任何不支持命名参数的语言都可以.如果语言支持命名参数,我更喜欢简短的Create,只有明显的参数名称.
对于具有命名参数的语言,您将:
Circle.Create(
centerX = cx,
centerY = cy,
radius = r
);
Run Code Online (Sandbox Code Playgroud)
另一个更复杂的选择,就是一个流畅的界面(但可能太多了):
circleBuilder.Center(cx,cy).Radius(r)
circleBuilder.Center(x,y).Width(w).Height(y)
circleBuilder.BoundWith().Left(x1,y1).Right(x2,y2)
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
我的第一直觉是拥有更多类型,这将允许更直观的方法重载.
// 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);
Run Code Online (Sandbox Code Playgroud)
和Point一样,你可以定义Distance(允许不同的单位)
如果这种风格适合你,请考虑为什么需要工厂方法而不是构造函数.
Circle c = new Circle(new Point(cx,xy), r);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
489 次 |
| 最近记录: |