2012-08-31 42 views
7

Ngay bây giờ tôi đang viết mã một ứng dụng và tôi nghĩ rằng phải có một giải pháp tốt hơn cho những gì tôi đang làm ngay bây giờ.C# Cách tốt nhất để giao tiếp giữa các lớp

Tôi có cửa sổ chính để xử lý các cài đặt của chương trình. Sau đó, tôi có thêm các lớp học và cửa sổ. Ví dụ một lớp xử lý ngôn ngữ và một biểu mẫu xử lý đầu vào người dùng cần thiết cho "hàm chính".

Tuy nhiên, cho đến bây giờ tôi luôn phải chuyển cửa sổ chính của mình cho từng lớp này, vì trình xử lý ngôn ngữ có thể thay đổi chuỗi cửa sổ chính. Và hình thức khác cũng có thể chuyển dữ liệu đến cửa sổ chính.

Nếu tưởng tượng sẽ có nhiều lớp hơn và mỗi lớp cần bản sao của cửa sổ chính, điều này sẽ tiêu tốn rất nhiều tài nguyên tùy thuộc vào "kích thước" của cửa sổ chính.

Vì vậy, có cách nào hiệu quả hơn để giao tiếp giữa các lớp này hay không.

+3

Đọc về [loại tham chiếu so với loại giá trị] (http://www.albahari.com/valuevsreftypes.aspx) và đừng lo lắng về việc chuyển biểu mẫu chính vì nó là Loại tham chiếu. –

+0

Thx với mọi người. Wow tôi nên biết rằng nó được thông qua như một tài liệu tham khảo. Nhưng tôi sẽ xem xét tất cả các lời khuyên của bạn;) –

Trả lời

9

Cách thông thường để thực hiện việc này là sử dụng observer pattern, trong đó .NET là events system. Nói đơn giản, các lớp học của bạn đăng ký các sự kiện của nhau và thực hiện hành động khi sự kiện được nâng lên. Như đã lưu ý trong phần chú thích, các tham chiếu truyền qua không phải là bộ nhớ nặng, nhưng nó dẫn đến việc ghép nối chặt chẽ giữa các phần khác nhau của mã của bạn - các địa chỉ mẫu quan sát có vấn đề.

2

Tôi khuyên bạn nên sử dụng Galasoft hoặc Prism triển khai MVVM. Ở đó bạn có thể sử dụng dịch vụ nhắn tin của họ khá dễ sử dụng. Lớp cần thông tin chỉ gửi một tin nhắn đến người đăng ký và lần lượt họ có thể gửi tất cả dữ liệu cần thiết. Tôi nghĩ rằng đây là cách dễ nhất để xử lý giao tiếp.

2

ngoài ans do IVAN cung cấp. Nếu chúng ta xem ở cấp cao hơn mà không có tất cả thuật ngữ đó thì có lẽ bạn nên tạo một lớp tĩnh sẽ là máy chủ như InMemoryStorage và xác định các trường trên đó để lưu thông tin
những gì bạn sẽ có toàn quyền kiểm soát những gì đang được chia sẻ và nhiều thành phần có thể thay đổi nó
hơn nữa bạn có thể xác định getters và setters và nâng cao một sự kiện bất cứ khi nào tài sản được thay đổi để các hình thức hoặc cửa sổ khác nhau (xem) có thể đăng ký thay đổi và hành động tương ứng

3

Một tùy chọn khác là xem xét các lớp học của bạn là dịch vụ. Mã chúng vào một giao diện và sau đó sử dụng dependency injection (aka Inversion of Control) để xây dựng đồ thị đối tượng (Bạn cho biết thùng chứa IoC bạn muốn frmSomething và nó sẽ xác định dịch vụ/lớp nào cần và khởi tạo chúng khi thích hợp).

Điều này có nghĩa rằng:

  • bạn chỉ bao giờ phải mã chống lại một giao diện không phải là một thực hiện
  • mã của bạn là lỏng (Bạn có thể trao đổi một OldTranslator cho một NewTranslator và chừng nào cả hai đều tuân thủ đến cùng một giao diện, không có gì phải thay đổi ngoại trừ cấu hình của vùng chứa)
  • bạn có thể phát triển các tính năng cấp cao dựa trên các dịch vụ chưa được viết và mã của bạn sẽ biên dịch
  • Bạn có thể dễ dàng thay đổi cách ứng dụng của bạn hoạt động, vào thời gian chạy nếu cần, bằng cách thay đổi những lớp/dịch vụ nào được đăng ký trong vùng chứa của bạn.

Hãy xem Unity cho bộ chứa DI do MS hỗ trợ. Castle Windsor là một lựa chọn phổ biến nhưng có nhiều hơn

Cần lưu ý rằng việc chuyển "Bản sao" của cửa sổ chính xung quanh như bạn đã nói không phải là điều xấu - Bạn chỉ thực sự chuyển một tham chiếu (một cách hiệu quả con trỏ) đến cửa sổ chính (vì bất kỳ điều gì phức tạp hơn các nguyên thủy thực sự là các loại tham chiếu). Điều này có nghĩa rằng có rất ít chi phí trên bất kỳ số nào

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