我會有漁夫,釣魚杆,釣魚線,池塘,魚和「天空」(或「環境」)。
在面向對象的土地上,對象通常最終會比你想象的更聰明。漁夫「有一個」(含有)FishingRod。他將FishingLine(FishingRod的一個組成部分)投射到池塘中。池子「看着」天空以確定它是白天還是晚上,然後擲骰子以確定是否應該放魚。
搖出的對象層次結構是一個FishingLine可以有選擇地包含一個Fish,並由一個漁夫擁有的FishingRod擁有。該池塘包含魚,接收FishingLines但不「擁有」他們,也知道但不擁有天空。
方法後面將像以下:
Fisherman.FishingRod - 初始化屬性(或對getter/setter方法)中使用,得到漁夫一個釣竿到FishAt()與池塘。這是可選的;一個漁夫可以創建他自己的釣魚棒,或者他自己可以從一堆釣魚棒中選擇它,而不是給他釣魚棒。 Fisherman.FishAt(Pond) - 告訴漁夫用他的FishingRod將FishingLine發射到池塘中,然後檢索它可能會得到一條魚。
FishingRod.Launch(Pond) - 將FishingRod的FishingLine放入池中。
FishingRod.Retrieve() - 從池中檢索FishingLine,返回一個Fish,這也可能不是什麼。
Pond.StockWith(Fish []) - 爲漁民提供池魚以捕獲釣魚杆。請記住,在OO土地上,所有東西都要麼被賦予它想要的東西,要麼知道如何去做;如果這是你想要遵循的模型,那麼池塘可以很容易地創建魚,但是這裏的用戶故事並沒有說明這是怎麼發生的(通常意味着它超出了故事的範圍)。
Pond.SetFishingLine(FishingLine) - 由FishingRod用於將其FishingLine放入池中。這是合併業務邏輯的「驅動功能」。當這個被調用的時候,池塘應該詢問天空是否是白天,並且可能根據一天中的時間將魚放在釣魚線上。
Sky.IsDay() - 一種方法,如果是白天則返回true,如果是晚上則返回false。
如果您認爲池塘不應該直接知道魚被放在FishingLine上的具體規則,它可以將FishingLine和它的魚[]稱爲「純粹製造」。這種製造「漁業邏輯」將是審查天空並應用規則的人。在開發過程中,這通常是一件好事,因爲這意味着FishingLogic可以在不改變Pond的情況下進行更改,除非FishingLogic需要更多來自Pond(如水溫)。
的各種對象表示各種基本的「模式」在現實生活中的編程:
- 漁夫是一個「演員」,最接近的模擬我們的用戶。像這樣的系統的用戶基本上站在演員的肩膀上,告訴他該做什麼。
- FishingRod是一個「幫手」或「實用工具」。它是「工具」的真實世界模擬,並且包含狀態和業務邏輯的混合,幫助它執行非常具體的任務。
- 此模型中的FishingLine類似於「請求」或「命令」。它的唯一目的是從一個對象到另一個對象,當這種情況發生時,它表示接收者應該採取特定的行動。
- 魚是一種「反應」;對請求的回答。可能有一個,也許不是。
- 池是一個「存儲庫」;它包含了一些東西,並根據一組邏輯處理外部對象對這些東西的請求。
- 天空是一個「國家桶」。它有數據,並通過其接口提供對數據的訪問。
- FishingLogic是一個「純粹的製造」;它與我們正在建模的現實世界中的「名詞」(對象)沒有任何相似之處,它的存在是爲了包含環境規則,或者是在沒有模型對象必須知道的情況下發生的事情(魚如何決定如何掛鉤?)
「最優雅的設計」在很大程度上取決於您的釣魚領域類庫的典型用戶想要做什麼。他們正在製作釣魚電子遊戲嗎?大規模蒙特卡洛模擬與許多模擬試驗研究孵化場枯竭?一個設計可能完全適合於一個用例,但它過於複雜,不適合甚至無法用於其他用例。有些設計對於任何用例都是不利的,但是很難說設計是優雅的而不考慮預期的用途。 – 2010-09-22 21:39:09
好吧,非常好的一點。讓我更新我的問題,以便我可以縮小可能的答案。 – LaBracca 2010-09-22 21:46:56