2008-12-17 17 views
1

對不起,如果有人想要改變它的話,不要這麼刻薄的標題。另外請注意,我已經詢問了question這類事情,但這個更多的是關於如何攻擊它,因爲我的攻擊看起來似乎並不正確。你會如何攻擊這個多態性字符串建設問題

我有一個問題,建立一個字符串發送到一個OLE對象以正確的順序使用另一個問題中的多態性方法。

OLE對象只能接收和接收一個字符串,所以我在做的是圍繞所有常用命令構建一個包裝,併爲它們提供更多的.NET感覺。

我跑得很快的問題是我的包裝必須發送很長的時間,並有可選位,然後突然將一個方法,只設置一個名稱爲一個大的字符串構建方法,如果只是一些命令只是設置一個名字,當然這會發生在整個地方,因爲有很多命令。

現在,爲了有一個良好的包裝,我想能夠讓我從包裝本身併成一個生成器對象移動字符串建築邏輯客場收官串建設進程。
我試圖通過使用多態性來攻擊這個問題,當我有一個構建器對象時,效果很好。僅用於構建一種類型的命令字符串。詳情請參閱其他帖子。

對不起,對於這篇較長的文章,我會立即開始討論。

主要問題是有很多命令字符串必須建立,這意味着更多構建器對象
所以我真的很想有一個通用的字符串生成器,可以建立與命令的任何列表的字符串,但前提條件是他們必須在正確的順序即使用戶設置他們在錯誤的順序。

你會如何處理這個問題?

回答

1

我認爲你已經結束了複雜的事情,最終會創建太多的類。

我認爲問題不在於構建字符串,而在於如何爲.net調用方提供一個很好的接口。正因爲有許多可能的參數並不意味着你需要爲他們創造了大量的課程,至少在每個參數中可能的變化都不是很複雜的,也就是說,如果值是有還是沒有的話,並且有可選單位。然後你陷入這個混亂的需要知道命令的部分命令需要的命令等等。

也許我會爲命令的可能參數創建一個類,讓一個調用者設置它們的任何一個像這樣,並且該類負責在一個大(醜陋的?)字符串連接中生成字符串。

例如,我會從這樣的事情開始,並且隨着你走,我會根據命令的不同部分的相似性重新添加一些方法來重構字符串連接。

class CommandArgs 
{ 
    private double? _Position_x = null; 
    private double? _Position_y = null; 
    private String _Position_units = null; 
    private double? _Width = null; 
    private String _Width_units = null; 
    private double? _Height = null; 
    private String _Height_units = null; 

    // maybe there's a better tuple-like type for this. 
    public double[] Position 
    { 
     set 
     { 
      if (value.length != 2) throw new ArgumentException("argh!"); 
      _Position_x = value[0]; 
      _Position_y = value[1]; 
     } 
    } 
    public string Position_Units 
    { 
     set 
     { 
      _Position_Units = value; 
     } 
    } 
    public double Width 
     set 
     { 
      _Width = value; 
     } 
    } 
    public double Height 
     set 
     { 
      _Height = value; 
     } 
    } 
    public string Width_Units 
     set 
     { 
      _Width = value; 
     } 
    } 
    public string Height_Units 
     set 
     { 
      _Height = value; 
     } 
    } 
    // .... 
    public override string ToString() 
    { 
     return 
      (_Position_x != null ? string.Format(" Position ({0},{1})",_Position_x, _Position_y) : "") 
      + (_Height != null ? string.Format(" Height {0}") 
        + (_Height_Units != null ? string.Format(" Units {0}", _Height_Units) : "") 
      + (_Width != null ? string.Format(" Width {0}") 
        + (_Width_Units != null ? string.Format(" Units {0}", _Width_Units) : "") 
     // ... 
     ; 
    } 
} 

如果你喜歡你可能喜歡做方法而不是屬性,所以你可以同時設置值和單位。

我可能會重構與下面的方法立刻道:

private string FormatUnits(string units) 
{ 
    return units == null ? "" : string.Format(" Units {0}", units); 
} 
private string FormatSingleValueArgument(string argName, object argValue, string units) 
{ 
    if (argValue == null) return ""; 
    return string.Format(" {0} {1}", argName, argValue) + FormatUnits(units); 
} 

使得該toString()方法是這樣的:

  return 
      (_Position_x != null ? string.Format(" Position ({0},{1})",_Position_x, _Position_y) : "") 
      + FormatSingleValueArgument("Height", _Height, _Height_Units) 
      + FormatSingleValueArgument("Width", _Width, _Width_Units) 
     // ... 
     ; 

那麼也許做位置樣的參數類似的方法,如果有幾個。

+1

正試圖避免必須做一堆if語句和空檢查,你給的例子將爲這種情況工作,但它仍然會與我已經包裝的其他一些陳述非常複雜。 – 2008-12-17 02:42:15