2015-11-20 65 views
2

以下情況是否存在某種設計模式?可選但需要的變量的清潔解決方案

Current design

要求:

  • latlon總是必需的。
  • place和/或name是可選的(可以爲空)。
  • 當可選變量爲空時,getPlace()getName()應返回latlon作爲字符串。

目前的情況似乎有點「骯髒」,所以我想知道是否有「乾淨」的解決方案。我自己找不到答案。

+0

爲什麼每次在getters中檢查,而不是在構造函數中執行一次?你爲什麼不張貼代碼而不是圖紙? –

+0

這樣做可以做到這一點,也許我在想它。沒有代碼,因爲我正在創建一個設計。 – Gilian

+3

然後你不應該考慮做空檢查的方法。你應該建立每種方法的合同,即寫他們的javadoc。但大多數情況下,設計是從代碼中出現的,而不是相反。開始編碼,使用你編碼的類,看看它是否感覺直觀和自然,重構。 –

回答

1

您可以將可選變量與必需變量分開,並使用 多態性來避免getName()getPlace()中的空值檢查。 也許像下面這樣:

enter image description here

+0

這看起來很不錯。但是,如何定義地點和名稱?就像一個'LocationWithNameAndPlace'類。然後這個類應該有變量和方法,但這意味着如果我是正確的代碼的冗餘 – Gilian

+0

@Gilian你可以從'LocationWithName'和'LocationWithPlace'派生'LocationWithNameAndPlace',不會有冗餘。什麼是用來實現它的編程語言? – sergej

+0

語言是Java。 – Gilian

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類的一個實例的用戶。

編輯:提供的代碼僅用於顯示兩種(隱式)策略的想法。

3

需要應用被稱爲約束的模式。簡單地連接兩個<<invariant>>約束類告訴

{lat and lon are always required} 

{place and/or name are optional (can be null)} 

文本

當可選變量是空的,getPlace()輸出,getName()應返回LAT和lon作爲字符串。

是類的行爲描述的一部分。

作爲一個方面說明:「應該」意味着你可以實施,如果你是一個好人,但如果你忽略它,你不能被打敗。使用「應該」。

+0

我不認爲它回答了這個問題。如果我理解正確,問題是「如何改進當前的設計?」而不是「如何在UML中對當前設計進行建模」。 – sergej

+0

@sergej他問:「以下情況是否有某種設計模式?」並且這是使用的模式(該問題被標記爲UML) –

1

默認情況下,每個UML屬性有1. UML 2.5規範的第9.5.4節的多樣性表示:

<多重範圍>是屬性的多重性範圍。如果這個術語被省略,則意味着多重1(正好是1)。

這意味着,在您的圖中,所有屬性(lat,lon,place,name)都是強制性的。爲了表明一個屬性是可選的,你可以在屬性類型後附加多重性範圍[0..1]

class Location

的getPlace和的getName方法的行爲一般不包括在類圖。類圖主要是用來指定結構,而不是行爲。你可以像你一樣包括一個筆記,但是我個人會用純文本來描述這種行爲,而不是在任何圖表中。大多數UML工具允許您爲每個操作編寫純文本描述,並生成包含所有這些描述的文檔。但這只是一種方法。你也可以使用Word或Wiki。