1. Tĩnh so với cá thể
Tôi nghĩ rằng có những hướng dẫn rất rõ ràng về thiết kế OO tốt và những gì không. Vấn đề là thế giới blog làm cho khó phân tách cái tốt và cái xấu. Bạn có thể tìm thấy một số loại tài liệu tham khảo hỗ trợ ngay cả thực tiễn tồi tệ nhất bạn có thể nghĩ đến.
Và thực tế tồi tệ nhất tôi có thể nghĩ đến là Nhà nước toàn cầu, bao gồm cả những thống kê mà bạn đề cập và Singleton yêu thích của mọi người. Một số trích đoạn từ bài viết kinh điển của Misko Hevery về chủ đề này .
Để thực sự hiểu các phụ thuộc, các nhà phát triển phải đọc mọi dòng mã. Nó gây ra Hành động ma quái ở khoảng cách xa: khi chạy các bộ thử nghiệm, trạng thái toàn cầu bị đột biến trong một thử nghiệm có thể khiến thử nghiệm tiếp theo hoặc song song bị lỗi bất ngờ. Phá vỡ sự phụ thuộc tĩnh bằng cách sử dụng tiêm phụ thuộc thủ công hoặc Guice.
Hành động ma quái ở khoảng cách là khi chúng ta chạy một thứ mà chúng ta tin là bị cô lập (vì chúng ta không chuyển bất kỳ tài liệu tham khảo nào) nhưng các tương tác bất ngờ và thay đổi trạng thái xảy ra ở các vị trí xa của hệ thống mà chúng ta không nói cho đối tượng biết. Điều này chỉ có thể xảy ra thông qua nhà nước toàn cầu.
Có thể bạn chưa từng nghĩ về nó theo cách này trước đây, nhưng bất cứ khi nào bạn sử dụng trạng thái tĩnh, bạn đang tạo các kênh liên lạc bí mật và không làm cho chúng rõ ràng trong API. Spooky Action at a distance buộc các nhà phát triển phải đọc từng dòng mã để hiểu các tương tác tiềm năng, làm giảm năng suất của nhà phát triển và gây nhầm lẫn cho các thành viên nhóm mới.
Điều này có nghĩa là bạn không nên cung cấp các tham chiếu tĩnh cho bất cứ thứ gì có một số trạng thái được lưu trữ. Nơi duy nhất tôi sử dụng statics là cho các hằng số liệt kê, và tôi có những hiểu lầm về điều đó.
2. Các phương thức có tham số đầu vào và giá trị trả về so với phương thức không có
Điều bạn cần nhận ra là các phương thức không có tham số đầu vào và không có tham số đầu ra được đảm bảo khá nhiều để hoạt động trên một số trạng thái được lưu trữ bên trong (nếu không, chúng đang làm gì?). Có toàn bộ ngôn ngữ được xây dựng trên ý tưởng tránh trạng thái lưu trữ.
Bất cứ khi nào bạn đã lưu trữ trạng thái, bạn có khả năng cho các tác dụng phụ, vì vậy hãy chắc chắn rằng bạn luôn sử dụng nó một cách cẩn thận. Điều này ngụ ý rằng bạn nên thích các chức năng với đầu vào và / hoặc đầu ra được xác định.
Và trên thực tế, các hàm đã xác định đầu vào và đầu ra dễ kiểm tra hơn nhiều - bạn không phải chạy một hàm ở đây và nhìn qua đó để xem điều gì đã xảy ra và bạn không phải đặt thuộc tính ở đâu đó khác trước khi bạn chạy chức năng được thử nghiệm.
Bạn cũng có thể sử dụng loại chức năng này một cách an toàn . Tuy nhiên, tôi sẽ không làm thế, vì nếu sau này tôi muốn sử dụng một triển khai khác của chức năng đó ở đâu đó, thay vì cung cấp một thể hiện khác với cách triển khai mới, tôi không có cách nào để thay thế chức năng.
3. Chồng chéo so với khác biệt
Tôi không hiểu câu hỏi. Lợi thế của 2 phương pháp chồng chéo là gì?
4. Riêng tư so với công chúng
Đừng phơi bày bất cứ điều gì bạn không cần phải phơi bày. Tuy nhiên, tôi cũng không phải là một fan hâm mộ lớn của tư nhân. Tôi không phải là nhà phát triển C #, mà là nhà phát triển ActionScript. Tôi đã dành rất nhiều thời gian cho mã Flex Framework của Adobe, được viết vào khoảng năm 2007. Và họ đã đưa ra một số lựa chọn thực sự tồi tệ về việc làm cho riêng tư, điều này khiến cho nó trở thành một cơn ác mộng khi cố gắng mở rộng Lớp học của họ.
Vì vậy, trừ khi bạn nghĩ bạn là một kiến trúc sư giỏi hơn các nhà phát triển Adobe vào khoảng năm 2007 (từ câu hỏi của bạn, tôi sẽ nói rằng bạn có một vài năm nữa trước khi bạn có cơ hội đưa ra yêu cầu đó), bạn có thể muốn mặc định được bảo vệ .
Có một số vấn đề với các ví dụ mã của bạn, điều đó có nghĩa là chúng không được kiến trúc tốt, vì vậy không thể chọn A hoặc B.
Đối với một điều, có lẽ bạn nên tách việc tạo đối tượng của bạn khỏi việc sử dụng nó . Vì vậy, bạn thường không có new XMLReader()
quyền của bạn bên cạnh nơi nó được sử dụng.
Ngoài ra, như @djna nói, bạn nên gói gọn các phương thức được sử dụng trong Trình đọc XML của bạn, để API (ví dụ ví dụ) của bạn có thể được đơn giản hóa thành:
_document Document = reader.read(info);
Tôi không biết C # hoạt động như thế nào, nhưng vì tôi đã làm việc với một số công nghệ web, tôi nghi ngờ rằng bạn sẽ không thể trả lại tài liệu XML ngay lập tức (ngoại trừ có thể là một lời hứa hoặc loại tương lai đối tượng), nhưng tôi không thể cho bạn lời khuyên về cách xử lý tải không đồng bộ trong C #.
Lưu ý rằng với cách tiếp cận này, bạn có thể tạo một số triển khai có thể lấy tham số cho chúng biết vị trí / cái gì cần đọc và trả về một đối tượng XML và trao đổi chúng dựa trên nhu cầu dự án của bạn. Ví dụ: bạn có thể đang đọc trực tiếp từ cơ sở dữ liệu, từ cửa hàng địa phương hoặc, như trong ví dụ ban đầu của bạn, từ một URL. Bạn không thể làm điều đó nếu bạn sử dụng một phương thức tĩnh.