2013-07-23 66 views
13

我是一名普通的perl程序員。我對語言本身沒有問題,但是用「」對象設計。雖然我能理解(大部分)CPAN模塊,但沒有嚴重的問題,我甚至無法設計自己的簡單對象層次結構。Perl/Moose OO設計,包層次結構

實例 - 現在面臨的一個非常簡單的應用程序(Web和命令行界面):

  • 已認證的學生上傳了一個zip文件(什麼包含渲染作業)
  • 解壓縮文件和新的目錄,並檢查它的內容(應包含exatly一個文件commands.txt)和零個或多個圖像
  • 如果內容爲確定 - 移動到地方叫目錄:JobRepository(另一個目錄)
  • 如果用戶決定運行渲染作業 - 從他自己的JobRepository發送工作全局渲染隊列(再次,另一個目錄)
  • 另一個進程從隊列(FIFO - 設計與IPC::DirQueue)主罰工作和執行渲染過程
  • 完成後,把結果到用戶JobRepository/result目錄
  • 發送電子郵件給用戶
  • 學生可以下載壓縮結果

bash它是可行的少「不復雜「bash腳本 - 但我想這樣做在Perl(因爲網絡接口) - 並希望實踐Perlish的(麋鹿)對象設計...

在這裏開始我的問題。

試過「視覺」名詞解析方法並製作下一張圖片。

enter image description here

發佈的圖像,因爲它是 「短」 爲:

package Iren::JobRepo; 
use Moose; 
use warnings; 
has 'Jobs' => (is => 'rw', isa=>ArrayRef[Iren::Job]); 
… 
method AddJob { 
... 
} 

正如你所看到的,這是非常簡單的 - 但immediatelly面臨一些決定問題,例如:

  • 什麼對象應該執行unzip/zip/checkJob方法?它屬於:JobRepository的作業「拉鍊」本身?
  • 什麼對象應該發送電子郵件給用戶? $user->send_email - 來我愚蠢,因爲我們發送電子郵件給用戶,而不是用戶本身...
  • 「誰」應該從用戶的JobRepo發送作業到RenderQueue? JobRepo->SendJobToRenderQueue或我應該撥打RenderQueue->addJob方法?
  • 什麼對象應該應該使用ISA IPC::DirQueue - (應該是RenderQueue的implememtation)
  • 循環定義用戶已有 JobRepository,存儲庫很多Jobs,但Job 有?用戶? (要知道向誰屬於工作) - 等..

正如你所看到的,沒有角色,在這裏沒有性狀 - 什麼 - 這是簡單的... - 但充滿問題:(

任何人都可以幫助清除混亂?什麼應該是「好」包層次?

所以,我真的迷路了,我開始失望自己。但我必須問他們...

  • 如何學習perl/Moose的好對象設計? (我可能永遠不會使用另一種語言)
  • 搜索谷歌關於對象設計(和Stackoverflow太多)被引用了「Gand of Four」書(和其他幾個)。但通常用於Java。 perl/Moose是值得購買的嗎?或者,這裏還有一些perl/Moose的好書嗎?
  • 是一些很好的技巧,如何檢查正確的對象設計?
  • 來自UML的代碼生成器可能不存在爲穆斯 - 或者在這裏的東西可用和推薦?
  • 簡單 - 你如何掌握你的對象層次結構/角色/特徵等...?雖然我正在閱讀的例子 - 我明白$cat->diets :) - 但掌握新的東西 - 對我不利...

對不起,對文本的牆。我會很高興得到任何指向好書或任何什麼有什麼幫助...

+1

+1爲做好準備工作,並希望我可以給第二個+1關心好的對象設計。 – DVK

回答

5

什麼對象應該做unzip/zip/checkJob方法?

JobRepository

什麼對象應該發送電子郵件給用戶?

RenderQueue

我應該叫一些RenderQueue-> addJob方法?

是的,這樣做。 RenderQueue的責任歸屬於RenderQueue,因爲它可以決定是否接受工作。

什麼對象是應使用ISA IPC :: DirQueue

畝。不要繼承,只需委派。

用戶有權JobRepository

這是錯誤的,將其刪除。

但是Job有?用戶?

正確。


爲您設計的最後兩分,將有極大的幫助,如果你畫了UML前ER diagram

8

東西@daxim沒有回答:

  • 如何學習好對象設計的Perl /駝鹿? (我可能永遠不會使用另一種語言)
  • 先學習一般的面向對象設計(你似乎對基礎知識掌握好)
  • 然後瞭解角色。它們有助於在許多情況下簡化您的設計,而不是Java OO的一部分,因此通常不包含在基本的OO文獻中。
  • 對於Perl特定的東西,我會強烈推薦cromatic的「Modern Perl」一書以及他的Modern Perl博客的全部內容。這本書可以買到,但IIRC也可以免費獲得。
  • 此外,要查看哪裏不需要使用OO,但使用Perl的其他功能,強烈建議您閱讀免費的「Higher Order Perl」一書。
  • 確保對於實際編碼,您瞭解高級設計的事情,您可以考慮Moose(Moo)而不是Perl 5的本地OO。 Google針對初學者的「駝鹿演示文稿perl」。
  • 搜索有關對象的設計谷歌(和太#2)很多次,都引用了「四甘德」一書(和其他一些)。但通常用於Java。 perl/Moose是值得購買的嗎?或者,這裏還有一些perl/Moose的好書嗎?
  • 是一些很好的技術,如何檢查正確的對象設計?

坦率地說,檢查的最佳方法是:(1)與第二一雙眼睛和(2)看你怎麼屈尊最多可維護和重用設計評審。每次更新都不需要改變很多設計。我不知道有任何特定的技術/程序方法來檢查。

一個很好的經驗法則是:如果您需要改變某種行爲的方式,或許是大幅度的,那麼您的代碼需要改變多少?最好的設計是使變化最小化的設計。

  • 簡單 - 你如何掌握你的對象層次結構/角色/性狀等..?雖然我讀的例子 - 我明白$ CAT->飲食:) - 但掌握一些新的東西 - 是對我不好...

實踐。理想情況下,找到一個教程/書籍解決的問題,先解決自己,然後看看他們如何解決它。然後發表您的最佳組合的解決方案,以codereview.SE,並詢問是否可以改進:)


循環定義。用戶有JobRepository,倉庫有很多工作,但工作有?用戶? (需要知道誰屬於這份工作) - 等等。

不,你不需要知道工作屬於誰。我解釋了爲什麼幾個星期前 - 一個非常類似的問題在這裏被問到並回答:OO Design Patterns with Perl

簡短版本:在真實的代碼中,如果沒有用戶,你不可能從頭開始工作 - 當你開始工作的時候,你很可能已經開始使用已知的用戶並從那裏獲得作業存儲庫用戶。您無需再重新找到用戶。

+0

+1對於一個難題,真的很好。 – jm666