以下情况是否存在某种设计模式?
要求:
lat
和lon
。place
和/或name
是可选的(可以为null)。getPlace()
和getName()
应将lat
和lon
作为字符串返回。目前的情况对我来说似乎有点“脏”,所以我想知道是否有“干净”的解决方案。我自己找不到答案。
答案 0 :(得分:3)
您需要应用的模式称为约束。只需将两个<<invariant>>
约束附加到您的课堂上
{lat and lon are always required}
和
{place and/or name are optional (can be null)}
文字
当可选变量为null时,getPlace()和getName()应该将lat和lon作为字符串返回。
是班级行为描述的一部分。
作为旁注:“应该”意味着你可以实施,如果你是一个好人,但如果你忽略它,你不能被打败。使用“必须”。
答案 1 :(得分:2)
根据JP Nizet的评论,您可以将Location
实现为不可变对象,并提供两种工厂方法:
class Location
{
private readonly double lat;
private readonly double lon;
private readonly string place;
private readonly string name;
// Hide the constructor and only allow creation using the factory methods
// Alternative: Only provide factory method with lat and lon parameters and make this constructor public
private Location(double lat, double lon, string place, string name)
{
this.lat = lat;
this.lon = lon;
this.place = place;
this.name = name;
}
// Factory methods
public static Location Create(double lat, double lon)
{
return new Location(lat, lon, lat.ToString(), lon.ToString());
}
public static Location Create(double lat, double lon, string place, string name)
{
return new Location(lat, lon, place, name);
}
public double getLat()
{
return this.lat;
}
public double getLon()
{
return this.lon;
}
public string getPlace()
{
return this.place;
}
public string getName()
{
return this.name;
}
}
现在由用户决定使用什么策略来创建Location
类的实例。
编辑:仅提供代码以显示两种(隐含)策略的想法。
答案 2 :(得分:1)
答案 3 :(得分:1)
默认情况下,每个UML属性的多重性为1. UML 2.5规范的第9.5.4节说:
&lt; multiplicity-range&gt; 是Property的多重范围。如果省略该术语,则表示多重性为1(正好为1)。
这意味着,在图表中,所有属性(lat,lon,place,name)都是必需的。要指示属性是可选的,您可以在属性类型后追加多重范围[0..1]
。
getPlace和getName方法的行为通常不包含在类图中。类图主要用于指定结构,而不是行为。您可以像往常一样包含注释,但就个人而言,我会用纯文本而不是任何图表来描述这种行为。大多数UML工具允许您为每个操作编写纯文本描述,并生成包含所有这些描述的文档。但这只是一种方法。您也可以使用Word或Wiki。