2009-08-13 28 views
2

我正在從事的一個項目涉及3個不同的系統/平臺。 C#,Java和XSLT。我有一些簡單的算法(只是一堆條件),用僞代碼表示爲:如何將算法導出到其他語言?

if inputParameter1 is equal to 1 
    return "one" 
else if inputParameter2 is equal to 5 
    return "five" concatenated with inputParameter1 
else 
    return "not found" 

這樣簡單的東西。

我試圖找出一個機制,將:

  1. 讓我寫的算法一次
  2. 能夠在每個系統的本地語言(C#,Java的執行算法,並XSL)
  3. 在算法更新時,每個系統(C#,Java和XSL)都始終使用最新版本的算法。

所以在我的例子闡述,在C#的表示應該是:

public string TheMethod(int inputParameter1, int inputParameter2) 
    { 
     if (inputParameter1 == 1) 
     { 
      return "one"; 
     } 
     else if (inputParameter2 == 5) 
     { 
      return string.Concat("five", inputParameter1.ToString()); 
     } 
     else 
     { 
      return "not found"; 
     } 
    } 

和XSLT的表示應該是:

<xsl:template name="TheMethod"> 
    <xsl:param name="inputParameter1" /> 
    <xsl:param name="inputParameter2" /> 
    <xsl:choose> 
    <xsl:when test="$inputParameter1 = 1"> 
     <xsl:text>one</xsl:text> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:choose> 
     <xsl:when test="$inputParameter2 = 5"> 
      <xsl:text>five</xsl:text> 
      <xsl:value-of select="$inputParameter1" /> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:text>Not Found</xsl:text> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

希望你明白我的意思。

我該如何以通用方式表達算法並能夠自動將其轉換爲C#,Java或XSL?

謝謝!

-Mike

回答

4

好了,「答案」這是一個DSL,或者只是一些常見的標記,你再渲染(有趣的是,你可以用XSLT做到這一點)。

但是,通常,恕我直言,實施這是不值得的麻煩,取決於你的算法是多麼複雜,他們會寫多少。

+0

+1提到你可以在XSLT中實現它。 – Matt 2009-08-13 02:28:05

+0

雖然不是我所希望的解決方案,但這是目前爲止的最佳答案 – Mike 2009-11-16 19:28:03

0

這不會產生源代碼,但它使得可以使用邏輯在不同的語言非常少的編碼:

寫一個簡單的XML這樣的:

... 
<case> 
    <InputParam1>1</InputParam> 
    <InputParam2>NULL</InputParam> 
    <answer>one</answer> 
</case> 
... 

然後解析它,並將其存儲在字典/地圖/任何語言或框架具有的哈希表中。因此,將inputparams作爲關鍵字(可能作爲sturct)存儲,並且您可以很快得到答案。對於當參數itselves在返回值被使用(就像在你的榜樣,在「CONCAT部」)的情況下,我會使用的數據的一些特殊語法像

... 
<answer>five$inputparam1$</answer> 
... 

值得一提的是,更多特殊情況下,像這樣的連接,這個解決方案可能會用得越少。

1

從更一般的角度看這個問題,你的目標是隻有一個算法權威版本(即「不要重複你自己」的原則)。

更簡單的解決方案是選擇一種語言(可能是XSL)來實現算法,而不是試圖自動翻譯/導出到不同的編程語言。然後在C#和Java中使用一些XSL工具直接執行算法,傳入任何你喜歡的參數。我以前沒有這樣做過,但我認爲使用正確的第三方工具是可能的(但我懷疑你可以用相反的方法來做,從XSL內執行Java或C#,這就是爲什麼XSL是最佳選擇對於「基礎」語言)。

+0

是的,DRY就是這一點。是的,C#可以運行XSL(這正是我現在正在做的),但它比原生C#算法慢得多。 – Mike 2009-08-13 13:02:01

+0

你如何從C#運行它?它是預編譯的嗎?如果沒有,請查看這些鏈接到.NET的XSLT編譯器(http://msdn.microsoft.com/en-us/library/bb399405.aspx)和Java(http://xml.apache.org/xalan-j /xsltc_usage.html)。 – 2009-08-13 13:18:43

+0

預編譯好的東西(比如C#3.0表達式)將是理想的,但我願意接受任何工作。 – Mike 2009-08-13 17:28:27