Tôi đang viết các lớp "phải được sử dụng theo một cách cụ thể" (tôi đoán tất cả các lớp phải ...).
Ví dụ, tôi tạo fooManager
lớp, yêu cầu gọi, nói , Initialize(string,string)
. Và, để đẩy ví dụ xa hơn một chút, lớp học sẽ trở nên vô dụng nếu chúng ta không lắng nghe ThisHappened
hành động của nó .
Quan điểm của tôi là, lớp tôi đang viết yêu cầu các cuộc gọi phương thức. Nhưng nó sẽ biên dịch tốt nếu bạn không gọi các phương thức đó và sẽ kết thúc với một FooManager mới trống. Tại một số điểm, nó sẽ không hoạt động, hoặc có thể sụp đổ, tùy thuộc vào lớp và những gì nó làm. Lập trình viên thực hiện lớp của tôi rõ ràng sẽ nhìn vào bên trong nó và nhận ra "Ồ, tôi đã không gọi Khởi tạo!", Và nó sẽ ổn thôi.
Nhưng tôi không thích điều đó. Điều tôi lý tưởng muốn là mã KHÔNG biên dịch nếu phương thức không được gọi; Tôi đoán điều đó đơn giản là không thể. Hoặc một cái gì đó sẽ ngay lập tức được nhìn thấy và rõ ràng.
Tôi thấy mình gặp rắc rối với cách tiếp cận hiện tại mà tôi có ở đây, đó là:
Thêm một giá trị Boolean riêng trong lớp và kiểm tra mọi nơi cần thiết nếu lớp được khởi tạo; nếu không, tôi sẽ đưa ra một ngoại lệ với nội dung "Lớp học chưa được khởi tạo, bạn có chắc là bạn đang gọi .Initialize(string,string)
không?".
Tôi khá ổn với cách tiếp cận đó, nhưng nó dẫn đến rất nhiều mã được biên dịch và cuối cùng, không cần thiết cho người dùng cuối.
Ngoài ra, đôi khi còn nhiều mã hơn khi có nhiều phương thức hơn là chỉ Initiliaze
gọi. Tôi cố gắng giữ cho các lớp học của mình không có quá nhiều phương pháp / hành động công khai, nhưng điều đó không giải quyết được vấn đề, chỉ giữ cho nó hợp lý.
Những gì tôi đang tìm kiếm ở đây là:
- Cách tiếp cận của tôi có đúng không?
- Có một cái tốt hơn?
- Các bạn làm / khuyên gì?
- Tôi đang cố gắng giải quyết một vấn đề không? Tôi đã được các đồng nghiệp nói rằng đó là lập trình viên kiểm tra lớp trước khi thử sử dụng nó. Tôi tôn trọng không đồng ý, nhưng đó là một vấn đề khác tôi tin.
Nói một cách đơn giản, tôi đang cố gắng tìm ra một cách để không bao giờ quên thực hiện các cuộc gọi khi lớp đó được sử dụng lại sau đó hoặc bởi người khác.
XÁC NHẬN:
Để làm rõ nhiều câu hỏi ở đây:
Tôi chắc chắn KHÔNG chỉ nói về phần Khởi tạo của một lớp, mà là cả đời. Ngăn chặn các đồng nghiệp gọi một phương thức hai lần, đảm bảo họ gọi X trước Y, v.v ... Bất cứ điều gì cuối cùng sẽ là bắt buộc và trong tài liệu, nhưng tôi muốn mã và đơn giản và nhỏ nhất có thể. Tôi thực sự thích ý tưởng về Asserts, mặc dù tôi khá chắc chắn rằng tôi sẽ cần kết hợp một số ý tưởng khác vì Asserts sẽ không phải lúc nào cũng có thể.
Tôi đang sử dụng ngôn ngữ C #! Làm thế nào mà tôi không đề cập đến điều đó?! Tôi đang ở trong môi trường Xamarin và xây dựng các ứng dụng di động thường sử dụng khoảng 6 đến 9 dự án trong một giải pháp, bao gồm các dự án của PCL, iOS, Android và Windows. Tôi đã là một nhà phát triển trong khoảng một năm rưỡi (kết hợp giữa trường học và công việc), do đó những câu hỏi đôi khi lố bịch của tôi. Tất cả những điều đó có lẽ không liên quan ở đây, nhưng quá nhiều thông tin không phải lúc nào cũng là điều xấu.
Tôi không thể luôn đặt mọi thứ bắt buộc trong hàm tạo, do hạn chế về nền tảng và việc sử dụng Dependency Injection, có các tham số khác ngoài Giao diện bị loại khỏi bảng. Hoặc có thể kiến thức của tôi không đủ, điều này rất có thể. Hầu hết thời gian không phải là vấn đề Khởi tạo, nhưng nhiều hơn
Làm thế nào tôi có thể chắc chắn rằng anh ấy đã đăng ký vào sự kiện đó?
Làm thế nào tôi có thể chắc chắn rằng anh ấy đã không quên "dừng quá trình tại một số điểm"
Ở đây tôi nhớ một lớp tìm nạp quảng cáo. Miễn là chế độ xem hiển thị Quảng cáo hiển thị, lớp sẽ tìm nạp quảng cáo mới mỗi phút. Lớp đó cần một khung nhìn khi được xây dựng nơi nó có thể hiển thị Quảng cáo, rõ ràng có thể đi vào một tham số. Nhưng một khi chế độ xem không còn, StopFetching () phải được gọi. Nếu không, lớp sẽ tiếp tục tìm nạp quảng cáo cho một chế độ xem thậm chí không có ở đó và điều đó thật tệ.
Ngoài ra, lớp đó có các sự kiện phải nghe, ví dụ như "AdClicky". Mọi thứ đều hoạt động tốt nếu không được lắng nghe, nhưng chúng tôi mất theo dõi các phân tích ở đó nếu vòi không được đăng ký. Quảng cáo vẫn hoạt động, vì vậy người dùng và nhà phát triển sẽ không thấy sự khác biệt và các phân tích sẽ chỉ có dữ liệu sai. Điều đó cần phải được tránh, nhưng tôi không chắc làm thế nào nhà phát triển có thể biết họ phải đăng ký vào sự kiện tao. Tuy nhiên, đó là một ví dụ đơn giản, nhưng ý tưởng là có, "hãy chắc chắn rằng anh ta sử dụng Hành động công khai có sẵn" và vào đúng thời điểm tất nhiên!
initialize
muộn sau khi tạo đối tượng? Liệu ctor có quá "mạo hiểm" theo nghĩa nó có thể ném ngoại lệ và phá vỡ chuỗi sáng tạo?
new
nếu đối tượng không sẵn sàng sử dụng. Dựa vào một phương pháp khởi tạo chắc chắn sẽ quay trở lại ám ảnh bạn và nên tránh trừ khi thực sự cần thiết, ít nhất đó là kinh nghiệm của tôi.