Nên tạo một đối tượng ngầm hay rõ ràng tạo một tập tin?


9

Tôi đang tạo một đối tượng với mục đích duy nhất là đọc trong một tệp có định dạng và tạo một đối tượng khác có định dạng khác.

Là tốt nhất để tạo tệp đầu ra ngầm trong quá trình khởi tạo đối tượng hoặc có một phương thức công khai cho người dùng lựa chọn khi tệp này sẽ được tạo?

Câu trả lời:


12

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);

1
Điều này là tốt Một tùy chọn khác, tương tự, là chỉ thực hiện một đối tượng thực hiện bất kỳ luồng nào mà ứng dụng có và xử lý nó như bất kỳ luồng nào khác.
Steven Evers

3

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 FooConverterlớ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.


2

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.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.