2009-08-21 26 views
6

Tôi hiện đã viết một vài ứng dụng bằng cách sử dụng diễn viên scala và tôi quan tâm đến cách mọi người tiếp cận hoặc xử lý một số vấn đề tôi gặp phải.Viết các ứng dụng với diễn viên Scala trong thực tế

Rất nhiều lớp thư hoặc!?

Tôi có một diễn viên phản ứng với hoạt động của người dùng và phải gây ra điều gì đó xảy ra. Giả sử nó react s tới một tin nhắn UserRequestsX(id). Một vấn đề liên tục tôi có là, bởi vì tôi muốn mô đun hóa các chương trình của mình, một diễn viên đơn lẻ không thể hoàn thành hành động mà không liên quan đến các diễn viên khác. Ví dụ, giả sử tôi cần sử dụng tham số id để truy xuất một loạt các giá trị và sau đó chúng cần được xóa thông qua một số tác nhân khác. Nếu tôi đang viết một chương trình Java bình thường, tôi có thể làm một cái gì đó như:

public void reportTrades(Date date) { 
    Set<Trade> trades = persistence.lookup(date); 
    reportService.report(trades); 
} 

Đơn giản là đủ. Tuy nhiên, việc sử dụng diễn viên này trở nên hơi đau vì tôi muốn tránh sử dụng !?. Một diễn viên phản ứng với thông báo ReportTrades(date) nhưng nó phải yêu cầu PersistenceActor cho các giao dịch và sau đó là ReportActor để báo cáo. Cách duy nhất tôi đã tìm thấy để làm điều này là để làm:

react { 
    case ReportTrades(date) => 
     persistenceActor ! GetTradesAndReport(date) 
} 

Vì vậy mà trong PersistenceActor của tôi, tôi có một khối phản ứng:

react { 
    case GetTradesAndReport(date) => 
     val ts = trades.get(date) //from persietent store 
     reportActor ! ReportTrades(ts) 
} 

Nhưng bây giờ tôi có 2 vấn đề:

  1. Tôi phải tạo các lớp thông báo bổ sung để đại diện cho cùng một yêu cầu (nghĩa là "giao dịch báo cáo"). Trong thực tế, tôi có ba trường hợp này nhưng tôi có thể có nhiều hơn nữa - nó sẽ trở thành một vấn đề theo dõi các số
  2. Tôi nên gọi thông điệp đầu tiên và thứ ba ReportTrades? Thật khó hiểu khi gọi cả hai số ReportTrades (hoặc nếu tôi làm vậy, tôi phải đặt chúng trong các gói riêng biệt). Về cơ bản không có điều như vậy là overloading một lớp học theo loại val.

Tôi đang thiếu cái gì? Tôi có thể tránh điều này không? Tôi có nên bỏ cuộc và sử dụng !? Mọi người có sử dụng một số cấu trúc tổ chức để làm rõ điều gì đang xảy ra không?

+0

Có an toàn khi truy cập cửa hàng liên tục trực tiếp trong "phản ứng" không? Tôi nghĩ bạn không thể chặn các hoạt động.Có lẽ "nhận" là cần thiết cho diễn viên cụ thể đó. –

Trả lời

2

Với tôi, thông báo ReportTrades của bạn đang trộn hai khái niệm khác nhau. Một là một yêu cầu, thứ tự là một phản ứng. Ví dụ: chúng có thể được đặt tên là GetTradesReport(Date)SendTradesReport(List[Trade]). Hoặc, có thể, ReportTradesByDate(Date)GenerateTradesReport(List[Trade]).

+0

Nhưng quan điểm của tôi vẫn đứng vững; Tôi có tất cả các lớp này được sử dụng cho không có gì khác ngoài việc truyền dữ liệu xung quanh. Hôm qua tôi đã viết một số mã theo đó tôi cần phải "trang trí" một yêu cầu với thông tin từ 4 diễn viên riêng biệt. Thậm chí cho phép đặt tên hợp lý, nó là rất nhiều lớp khó hiểu! –

+0

Vâng, các lớp học như vậy không bao giờ được sử dụng chỉ để truyền tải thông tin. Chúng được sử dụng để truyền tải thông tin từ nơi này đến nơi khác cho một mục đích. Nếu bạn đặt tên cho phù hợp, bạn sẽ cải thiện mức độ dễ đọc tổng thể của mã. –

0

Có một số phản đối khi sử dụng reply không? Hoặc đi qua số trades xung quanh? Nếu không, mã của bạn có lẽ sẽ trông giống như

react { 
    case ReportTrades(date) => persistenceActor ! GetTrades(date) 
    case Trades(ts) => // do smth with trades 
} 

react { 
    case GetTrades(date) => reply(Trades(trades.get(date))) 
} 

tương ứng.

+0

Tôi đoán điểm của tôi là tôi không thể chuyển đối tượng 'Trades' trở lại điều phối viên của tôi như * làm thế nào để biết lệnh gốc nào đã được gọi? * Ví dụ, tôi có thể có một số việc cần làm: * DeleteTrades *, * ReportTrades *, * LoadTrades * etc. Điều phối viên sẽ cần nhận một phản hồi như 'SomeTradesToReport',' SomeTradesToDelete' hoặc 'SomeTradesToLoad' (giả sử tôi tránh'!? ') –

Các vấn đề liên quan