以下情況是否存在某種設計模式?可選但需要的變量的清潔解決方案
要求:
lat
和lon
總是必需的。place
和/或name
是可選的(可以爲空)。- 當可選變量爲空時,
getPlace()
和getName()
應返回lat
和lon
作爲字符串。
目前的情況似乎有點「骯髒」,所以我想知道是否有「乾淨」的解決方案。我自己找不到答案。
以下情況是否存在某種設計模式?可選但需要的變量的清潔解決方案
要求:
lat
和lon
總是必需的。place
和/或name
是可選的(可以爲空)。getPlace()
和getName()
應返回lat
和lon
作爲字符串。目前的情況似乎有點「骯髒」,所以我想知道是否有「乾淨」的解決方案。我自己找不到答案。
據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
類的一個實例的用戶。
編輯:提供的代碼僅用於顯示兩種(隱式)策略的想法。
需要應用被稱爲約束的模式。簡單地連接兩個<<invariant>>
約束類告訴
{lat and lon are always required}
和
{place and/or name are optional (can be null)}
文本
當可選變量是空的,getPlace()輸出,getName()應返回LAT和lon作爲字符串。
是類的行爲描述的一部分。
作爲一個方面說明:「應該」意味着你可以實施,如果你是一個好人,但如果你忽略它,你不能被打敗。使用「應該」。
我不認爲它回答了這個問題。如果我理解正確,問題是「如何改進當前的設計?」而不是「如何在UML中對當前設計進行建模」。 – sergej
@sergej他問:「以下情況是否有某種設計模式?」並且這是使用的模式(該問題被標記爲UML) –
默認情況下,每個UML屬性有1. UML 2.5規範的第9.5.4節的多樣性表示:
<多重範圍>是屬性的多重性範圍。如果這個術語被省略,則意味着多重1(正好是1)。
這意味着,在您的圖中,所有屬性(lat,lon,place,name)都是強制性的。爲了表明一個屬性是可選的,你可以在屬性類型後附加多重性範圍[0..1]
。
的getPlace和的getName方法的行爲一般不包括在類圖。類圖主要是用來指定結構,而不是行爲。你可以像你一樣包括一個筆記,但是我個人會用純文本來描述這種行爲,而不是在任何圖表中。大多數UML工具允許您爲每個操作編寫純文本描述,並生成包含所有這些描述的文檔。但這只是一種方法。你也可以使用Word或Wiki。
爲什麼每次在getters中檢查,而不是在構造函數中執行一次?你爲什麼不張貼代碼而不是圖紙? –
這樣做可以做到這一點,也許我在想它。沒有代碼,因爲我正在創建一個設計。 – Gilian
然後你不應該考慮做空檢查的方法。你應該建立每種方法的合同,即寫他們的javadoc。但大多數情況下,設計是從代碼中出現的,而不是相反。開始編碼,使用你編碼的類,看看它是否感覺直觀和自然,重構。 –