2013-07-23 24 views
13

Tôi là một lập trình viên perl trung bình. Tôi không có vấn đề với ngôn ngữ chính nó, nhưng với "tốt" thiết kế đối tượng. Mặc dù tôi có thể hiểu được (hầu hết) các mô-đun CPAN, không có vấn đề nghiêm trọng, tôi không thể tự thiết kế ngay cả hệ thống phân cấp đối tượng đơn giản.Thiết kế Perl/Moose OO, phân cấp gói

Ví dụ - bây giờ phải đối mặt với một ứng dụng thực sự đơn giản (web và giao diện dòng lệnh):

  • học sinh đã xác nhận tải lên một zip-file (những gì chứa một công việc render)
  • giải nén các tập tin đến và đi thư mục mới và kiểm tra nội dung của nó (nên chứa exatly một tập tin commands.txt) và zero hoặc hình ảnh hơn
  • nếu nội dung là OK - di chuyển thư mục đến nơi gọi là: JobRepository (một thư mục)
  • nếu người dùng quyết định chạy công việc hiển thị - gửi công việc từ số JobRepository của mình tới hàng đợi hiển thị toàn cầu (một lần nữa, một thư mục khác)
  • quy trình khác lấy công việc từ hàng đợi (fifo - được thiết kế với IPC::DirQueue) và thực hiện quy trình hiển thị
  • khi hoàn tất, đưa kết quả vào những người sử dụng JobRepository/result thư mục
  • gửi email cho người dùng
  • học sinh có thể tải về các kết quả nén

Trong bash nó là doable với vài "không phức tạp kịch bản "bash - nhưng tôi muốn làm điều đó trong Perl (vì giao diện web) - và muốn thực hành Perlish (Moose) thiết kế đối tượng ...

Và đây bắt đầu vấn đề của tôi.

Đã cố gắng "trực quan" phương pháp phân tích danh từ và tạo hình ảnh tiếp theo.

enter image description here

văn hình ảnh, bởi vì nó là "ngắn" như:

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

, vv

Như bạn có thể thấy, nó thực sự rất đơn giản - nhưng immediatelly phải đối mặt với một số quyết định vấn đề, ví dụ:

  • đối tượng nào nên thực hiện các phương thức unzip/zip/checkJob? Nó thuộc về: JobRepository ot công việc "zips" chính nó?
  • đối tượng nào sẽ gửi email cho người dùng? $user->send_email - đến với tôi ngớ ngẩn, vì chúng tôi gửi email cho người dùng chứ không phải là người dùng cho chính mình ...
  • "ai" sẽ gửi công việc từ JobRepo của người dùng tới RenderQueue? JobRepo->SendJobToRenderQueue hoặc tôi nên gọi một số phương pháp RenderQueue->addJob?
  • những gì đối tượng nên nên sử dụng ISA IPC::DirQueue - (nên là implememtation của RenderQueue)
  • định nghĩa tròn. Người dùng JobRepository, Kho lưu trữ nhiều công việc, nhưng công việc có? một người dùng? (Cần biết để người mà thuộc công việc) - và vân vân ..

Như bạn thấy, không có vai trò, không có đặc điểm ở đây - không có gì - đó là đơn giản ... - nhưng đầy đủ các câu hỏi :(

Ai có thể giúp dọn dẹp đống lộn xộn này? Hệ thống phân cấp gói "tốt" là gì?

Vì vậy, tôi thực sự bị mất và tôi đã bắt đầu thất vọng về bản thân mình. nhưng tôi phải yêu cầu họ ...

  • Làm thế nào để học thiết kế đối tượng tốt cho perl/Moose? (Tôi có thể sẽ không bao giờ sử dụng ngôn ngữ khác)
  • tìm kiếm google về thiết kế đối tượng (và Stackoverflow quá) nhiều lần được trích dẫn là "Gand of Four" sách (và vài cuốn sách khác). Nhưng thường cho Java. Nó là giá trị để mua cho perl/Moose? Hoặc là ở đây một số cuốn sách tốt cho perl/Moose?
  • là một số kỹ thuật tốt về cách kiểm tra thiết kế đối tượng phù hợp?
  • trình tạo mã từ UML có thể không tồn tại đối với Moose - hoặc ở đây có thể sử dụng được và được phân phối lại?
  • đơn giản - làm cách nào để bạn nắm vững phân cấp đối tượng/Vai trò/Đặc điểm, v.v ...? Trong khi tôi đang đọc các ví dụ - Tôi hiểu số $cat->diets :) - nhưng làm chủ được điều gì đó mới - không tốt cho tôi…

Xin lỗi vì tường văn bản. Tôi sẽ rất vui khi nhận được bất kỳ con trỏ nào đến cuốn sách hay bất cứ thứ gì giúp ích cho bạn ...

+1

+1 để thực hiện công việc chuẩn bị tuyệt vời và muốn tôi có thể cung cấp +1 thứ hai để chăm sóc thiết kế đối tượng tốt. – DVK

Trả lời

5

đối tượng nào nên làm phương thức unzip/zip/checkJob?

JobRepository

những gì đối tượng nên gửi email cho người dùng?

RenderQueue

tôi nên gọi một số RenderQueue-> Phương pháp addJob?

Có, hãy làm theo cách này. Trách nhiệm rơi vào RenderQueue bởi vì nó một mình có thể quyết định có nên chấp nhận một công việc hay không.

những gì đối tượng nên nên sử dụng ISA IPC :: DirQueue

Mu.Không kế thừa, chỉ cần ủy nhiệm.

Những thành viên có JobRepository

này là sai, loại bỏ nó.

nhưng công việc có? người dùng?

Đúng.


Đối với hai điểm cuối cùng của thiết kế, nó sẽ giúp vô cùng nếu bạn đã vẽ ER diagram trước UML.

8

Stuff @daxim không trả lời:

  • Làm thế nào để học thiết kế đối tượng tốt cho perl/Moose? (Tôi có lẽ sẽ không bao giờ sử dụng một ngôn ngữ khác)
  • Tìm hiểu thiết kế OO chung đầu tiên (bạn dường như có nắm bắt tốt về những điều cơ bản)
  • Sau đó tìm hiểu về vai trò. Chúng giúp đơn giản hóa thiết kế của bạn trong nhiều trường hợp và không phải là một phần của Java OO vì vậy thường không được đề cập trong tài liệu OO cơ bản.
  • Đối với nội dung cụ thể của Perl, tôi rất muốn giới thiệu sách cromatic 'Perl hiện đại' cũng như nội dung đầy đủ của blog Perl hiện đại của anh ấy. Cuốn sách có thể được mua nhưng IIRC cũng có sẵn miễn phí.
  • Ngoài ra, để xem nơi bạn không cần sử dụng OO nhưng sức mạnh khác của Perl, khuyên bạn nên đọc sách "Đặt hàng cao hơn Perl" miễn phí.
  • Hãy chắc chắn rằng để viết mã thực tế, bạn hiểu những điều thiết kế cấp cao, bạn nhìn vào Moose (Moo) thay vì OO gốc của Perl 5. Google cho "moose presentation perl" cho người mới bắt đầu.
  • tìm kiếm google về thiết kế đối tượng (và Stackoverflow quá) nhiều lần được trích dẫn "Gand của Bốn" cuốn sách (và vài người khác). Nhưng thường cho Java. Nó là giá trị để mua cho perl/Moose? Hoặc là ở đây một số cuốn sách tốt cho perl/Moose?
  • GOF cuốn sách chắc chắn là đáng đọc để cải thiện bản thân như một lập trình viên, ngay cả khi một số mẫu trong nó là Javacific.
  • Cụ thể hơn, đọc nó trong ánh sáng của Design Patterns in Dynamic Languages
  • Một viễn cảnh tốt Norvig về Perl và GOF là here
  • Đối với các mẫu thiết kế Perl, xem (hơi ngày) cuốn sách Phil Chow: part 1, part 2.
  • Xem this PerlMonks discussion
  • là một số kỹ thuật tốt như thế nào để kiểm tra thiết kế đối tượng thích hợp?

Thẳng thắn mà nói, cách tốt nhất để kiểm tra là: (1) Thiết kế tổng quan với một cặp thứ hai của mắt và (2) xem như thế nào đoái của bạn giữ lên đến bảo trì và tái sử dụng. Thiết kế tốt KHÔNG cần thay đổi nhiều với mọi cập nhật. Tôi không biết bất kỳ phương pháp kỹ thuật/thủ tục cụ thể nào để kiểm tra.

Nguyên tắc chung là: nếu bạn cần thay đổi cách thức hoạt động, có thể là quyết liệt, bạn cần phải thay đổi bao nhiêu mã? Thiết kế tốt nhất là thiết kế tối thiểu hóa các thay đổi.

  • đơn giản - làm thế nào để bạn làm chủ hệ thống phân cấp đối tượng của bạn/Vai trò/đặc điểm vv ...? Trong khi tôi đang đọc những ví dụ - Tôi hiểu được $ cat-> chế độ ăn :) - nhưng làm chủ một cái gì đó mới - có hại cho tôi ...

Thực hành. Lý tưởng nhất, tìm một vấn đề được giải quyết bằng một hướng dẫn/cuốn sách, tự giải quyết trước, sau đó xem cách họ giải quyết nó. Sau đó, gửi giải pháp kết hợp tốt nhất của bạn để codereview.SE và hỏi xem nó có thể được cải thiện :)


định nghĩa tròn. Người dùng có JobRepository, Kho lưu trữ có nhiều công việc, nhưng công việc có? người dùng? (cần phải biết ai thuộc về công việc) - và cứ thế ..

Không, bạn KHÔNG cần biết công việc thuộc về ai. Tôi đã giải thích lý do tại sao cách đây vài tuần - một câu hỏi tương tự đã được tôi hỏi và trả lời ở đây: OO Design Patterns with Perl.

Phiên bản ngắn: Trong mã thực, bạn sẽ không bao giờ bắt đầu với công việc mà không có người dùng - khi bạn bắt đầu công việc, bạn có thể đã bắt đầu với người dùng đã biết và có kho công việc từ đó người dùng. Bạn không cần phải tìm lại người dùng nữa.

+0

+1 Câu trả lời thực sự hay cho một câu hỏi khó. – jm666