清除可选但必需变量的解决方案

时间:2015-11-20 12:28:39

标签: design-patterns uml

以下情况是否存在某种设计模式?

Current design

要求:

    始终需要
  • latlon
  • place和/或name是可选的(可以为null)。
  • 当可选变量为空时,getPlace()getName()应将latlon作为字符串返回。

目前的情况对我来说似乎有点“脏”,所以我想知道是否有“干净”的解决方案。我自己找不到答案。

4 个答案:

答案 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)

您可以将可选项与所需变量分开并使用 多态性以避免在getName()getPlace()中进行空值检查。 可能类似于以下内容:

enter image description here

答案 3 :(得分:1)

默认情况下,每个UML属性的多重性为1. UML 2.5规范的第9.5.4节说:

  

&lt; multiplicity-range&gt; 是Property的多重范围。如果省略该术语,则表示多重性为1(正好为1)。

这意味着,在图表中,所有属性(lat,lon,place,name)都是必需的。要指示属性是可选的,您可以在属性类型后追加多重范围[0..1]

class Location

getPlace和getName方法的行为通常不包含在类图中。类图主要用于指定结构,而不是行为。您可以像往常一样包含注释,但就个人而言,我会用纯文本而不是任何图表来描述这种行为。大多数UML工具允许您为每个操作编写纯文本描述,并生成包含所有这些描述的文档。但这只是一种方法。您也可以使用Word或Wiki。