Câu trả lời:
Nếu bạn đang làm việc với ngôn ngữ hỗ trợ ngôn ngữ đó, tôi sẽ cung cấp phương thức Lưu có luồng. Bằng cách đó, người dùng có thể lưu dữ liệu bất cứ nơi nào họ muốn.
Phải mất 20 giây để viết hơn là chỉ lưu vào một tệp, nhưng nó dễ hiểu bởi một lập trình viên, và tại trang gọi điện thì rất rõ điều gì thực sự xảy ra.
Cách bạn mô tả nó (một đối tượng đọc đầu vào và xuất ra tệp khác) có vẻ kỳ lạ. Mục đích của việc xây dựng một đối tượng làm mọi thứ trong quá trình xây dựng là gì?
Bạn sẽ gọi nó theo cách này?
var stuff = DoStuff();
new SaveFileWeirdClass(stuff);
return;
Đối với bất kỳ triển khai hợp lý nào của SaveFileweirdClass tôi sẽ không mong đợi tác dụng phụ nào từ việc tạo ra nó. Đọc một tập tin - tốt. Tạo một tập tin? Không.
Đối với tôi nó có vẻ rõ ràng hơn theo cách này:
var stuff = new StuffReader(); //Better name needed...
string filePath = this.whatever;
using(Stream stream = new FileStream(filePath))
stuff.Save(stream);
Nếu bạn muốn thực hiện nó trong lớp, hãy tạo nó trong quá trình khởi tạo. Trì hoãn bước đó thực hiện hai điều xấu: Đầu tiên, nó bổ sung thêm một bước rõ ràng cho người gọi, người sẽ không tạo đối tượng ở nơi đầu tiên trừ khi họ có ý định sử dụng nó để tạo đầu ra. Thứ hai, nó thêm ít nhất hai điểm trong đó mã trong lớp phải đưa ra quyết định về việc tệp có mở hay không và xử lý điều kiện đó: một lần khi bạn đi viết đầu ra và một lần trong khi hủy khi bạn đóng nó. Điều này có nghĩa là bạn phải thực hiện kiểm tra đó trong mỗi lần viết, điều này có thể gây lãng phí nếu bạn làm nhiều việc trong số đó.
Cá nhân, tôi sẽ không làm và lựa chọn làm cho người gọi chuyển các thẻ xử lý tệp được mở trước cho hàm tạo. Tạo tệp bên trong lớp loại trừ việc cung cấp cho người gọi các tùy chọn để thực hiện những việc như đặt quyền hoặc, nếu ghi vào thiết bị, thực hiện khởi tạo dành riêng cho thiết bị. Nếu bạn muốn có một phiên bản của FooConverter
lớp hoạt động trên các tệp và thực hiện thao tác tạo, hãy gói nó trong một FooFileConverter
.
Rõ ràng.
Bạn muốn đảm bảo rằng bạn không dựa vào các quy tắc hiệu ứng phụ thông minh có thể phá vỡ trong các bản phát hành trong tương lai hoặc trên các kiến trúc không phổ biến. Tất nhiên, bạn nên có một tệp mặc định mà người dùng có thể ghi đè nếu họ chọn.
Ngoài các đối số khác cho một phương thức rõ ràng: Nếu bạn thực hiện công việc trong hàm tạo, thì bạn buộc mọi người dùng trong lớp của bạn thực hiện xử lý ngoại lệ chỉ để tạo đối tượng. Điều này có thể dẫn đến rất nhiều mã soạn sẵn.
Xem /programming/6086334/is-it-good-practice-to-make-the-constructor-throw-an-exception để thảo luận về điều đó.