2011-08-02 66 views
2

我正在考慮利用一些空閒時間來設計和實施一門關於正式語言和自動機理論課程的教學工具。我正在試圖確定一個面向對象的實施是否合適,如果是的話,是否任何人都可以對我在下面概述的設計提出高層次的改進建議。用於教授正式語言和自動機的工具OOP設計

在語言學分析中有很多潛在的類。有些(如果我錯過了任何基礎知識,請告訴我)是:語法;非終結;終奌站;生產;正規語法;上下文無關語法;上下文敏感語法;無限制的語法;自動機;州;符號;過渡; DFA; NFA; NFA-LAMBDA; DPDA; PDA; LBA;圖靈機。

問題1:每種語法都應該在實現中獲得自己的類,還是應該用一種方法來確定它是什麼類型的語法(例如,「isRegular()」,「isContextFree ()「等)(更一般地說,在領域模型中,只有行爲方面差別很小的類應該通過實現中的繼承來表示,還是更好地簡單地推送不同種類的行爲到父類?)

問題2:像「符號」,「狀態」,「非終端」等事情得到自己的類在實現中,或者應該是d由他們的容器提名?(更普遍的,應在域模型非常簡單的類來給自己的類中實現 - 例如用於擴展性 - 或者應該說被壓入容器類?)

問題3:應該轉換爲在實現中它自己的類,如果是這樣,我需要將它繼承以支持每種自動機(因爲除了狀態方面的不同之外,它們在轉換期間也會有所不同)?(更普遍,是很好的做法,那裏是一個的孩子和另一個...耦合孩子之間的雙射兩個抽象父類?)

我意識到,在結束那一天,很多這些決定都只是設計決定,但我想知道你們對OOP設計中的最佳實踐的看法。此外,我不只是將「更普遍」的問題作爲純粹的面向對象設計問題提出的問題是,我希望來自具有這種域(語言&自動機)經驗的人的特殊視角。

任何幫助,非常感謝。

回答

2

更普遍,應該只有點不同的域模型類,只有在行爲方面,可以通過繼承的實現表示,...

行爲是不是「唯一」。行爲是對象中最重要的部分。

還是僅僅將不同類型的行爲推入父類更好?

當然不是。這將違反利斯科夫替代原則。
繼承不應該用於「更容易訪問常見的東西」。

父類muss的內容在子類中完全無處不在,避免繼承,如果孩子不符合要求使用構圖。

更一般地說,領域模型中的非常簡單的類應該在實現中被賦予它們自己的類 - 例如,爲了可擴展性 - 還是應該將其推入容器類?

這樣一個取決於「深」你的邏輯是如何去。

通常這是一個好主意,只有當你遇到一些限制時纔開始分解。有些人稱之爲進化設計。

E.g. - 我有「班級不能超過〜200行代碼」,「對象不能超過5-7個其他對象」,「方法不應該超過~10行代碼」,「同樣的邏輯應該只寫一次「等...

另外 - 這很容易低估語義。 if order.isOverdue()if order.dueDate<date.Now()更容易閱讀和理解。引入反映域的概念,大大「人性化」代碼的類 - 提高了抽象層次(認爲「asm vs java」)。

但分解爲分解的緣故導致了不必要的複雜性。
它總是有道理的。

應當轉移是在實現自己的類,如果是這樣,我需要它的子類,以支持各種自動機(自,除了在狀態方面不同,他們也在方面有所不同在轉換過程中發生了什麼)?

只要符合您的域名,沒有任何問題。

抽象的創作是藝術活動是高度依賴於您的域名(例如,從專家的正式語言勸告&自動機可能會受到嚴重過於複雜,如果你的代碼應該要求爲一療程爲忘記作爲教學工具)。

+0

+1一個很好的答案。我很想看看其他人的想法,但是除非有一些不同尋常的東西,否則我很可能會在相當短的時間內接受這一點。 – Patrick87

2

好主意。首先是程序編程,首先是O.O.,稍後再做類似的工作。

答案1:兩者。一些語法或令牌將具有特定的方法或屬性,而其他語法或屬性應該在所有語法中共享。

答案2:他們應該有自己的班級,altought可能會有共同的祖先。

答案3:它可以同時處理,altought定義一個特定的類可能是有用的。我同意存在其他類/對象之間的交集或關聯,但它們很難建模。 「代理」設計模式就是一個例子。

LEX,Bison,yacc的教學語言設計很困難。我「聽說過」ANTLR是教授編譯器相關內容的好設計工具。

你想做什麼?

面向對象的解析器/掃描儀?

已經有一些了,我很難理解如何使用它們。他們中的一些人聲明新語法就像定義新類一樣,但在這種情況下,我發現函數式編程(語法)或邏輯編程(語法)更適合聲明規則。

視覺相關的工具:

http://www.ust-solutions.com/ultragram.aspx

http://www.sand-stone.com/

http://antlr.org/

http://antlr.org/works/index.html

好運;-)

+0

我預想這是不大不小的圖形化工具,幫助學生直觀的語法和自動機(例如,DFA最小化,通過子集構造NFA-LAMBDA到DFA,CFG通過自上而下的解析器PDA,機接受字符串算法等等)。我不認爲與LEX,Bison,yacc和ANTLR競爭是我想通過這個項目努力實現的。真的,只是給學生一種定義這些東西的方法,檢查他們自己的理解,看看算法的工作......這將是很酷的。如果你知道這樣的事情,請告訴我! – Patrick87

+0

檢查鏈接。我記得曾見過一個工具,其中使用了「raildoard圖表」http://en.wikipedia.org/wiki/Railroad_Diagram作爲可視化工具。但是,找不到鏈接 – umlcat

+0

感謝您的鏈接,但我不確定這些是我在找什麼。我真的尋找的東西,學生可以,例如,圖形(或者,最初以文本)定義NFA,點擊一個按鈕,顯示如何製作一個等價的DFA。或者給出一個正則表達式,點擊一個按鈕,並顯示如何構造一個NFA來識別它描述的語言。或者定義一臺圖靈機,並在幾根琴絃上進行測試,以瞭解TM的功能。等等 – Patrick87

2

如果你想要去與現有的解決方案,而不是寫一個,在北卡羅萊納州立大學的一些朋友寫了一個工具,叫做ProofChecker可能適合該法案。

它是用Java編寫的,因此這可能滿足您OO的角度爲好。

+0

+1爲非常相關的鏈接。肯定會檢查這一點,如果可能的話,可能會嘗試在更大的框架中擴展/模擬此操作。你的朋友是否有計劃把這個問題帶到喬姆斯基層次更復雜的層次?感謝好的領導! – Patrick87