2011-02-02 27 views
5

Về cơ bản, thực hành tốt hơn để lưu trữ một giá trị vào một biến ở lần chạy đầu tiên thông qua hoặc liên tục sử dụng giá trị? Mã này sẽ giải thích nó tốt hơn:Đọc giá trị nhiều lần hoặc lưu trữ dưới dạng biến số lần đầu tiên?

TextWriter tw = null; 
if (!File.Exists(ConfigurationManager.AppSettings["LoggingFile"])) 
{ 
    // ... 
    tw = File.CreateText(ConfigurationManager.AppSettings["LoggingFile"]); 
} 

hoặc

TextWriter tw = null; 
string logFile = ConfigurationManager.AppSettings["LoggingFile"].ToString(); 
if (!File.Exists(logFile)) 
{ 
    // ... 
    tw = File.CreateText(logFile); 
} 

Trả lời

4

Clarity là quan trọng, và DRY (không lặp lại chính mình) là rất quan trọng. Đây là một vi trừu tượng - ẩn một phần nhỏ, nhưng vẫn còn quan trọng, chức năng đằng sau một biến. Hiệu suất là không đáng kể, nhưng tác động tích cực của sự rõ ràng không thể được understated. Sử dụng biến được đặt tên tốt để giữ giá trị khi nó được mua lại.

+0

Để thêm vào điều này, khi bạn có một câu lệnh riêng để gán giá trị, nó giúp gỡ lỗi trong các tình huống lỗi. ví dụ. nếu giá trị của biến không hợp lệ và gây ra lỗi/ngoại lệ, bạn có thể kiểm tra nó trước khi sử dụng nó ở đâu đó. – vamyip

0

giải pháp thứ 2 là tốt hơn cho tôi vì:

  • tra cứu từ điển có chi phí
  • nó dễ đọc hơn

Hoặc bạn có thể có một đối tượng singleton với đó là xây dựng tư nhân mà populates một khi tất cả dữ liệu cấu hình bạn cần.

0

Thứ hai sẽ là lựa chọn tốt nhất.

Hãy tưởng tượng tình huống tiếp theo này. Cài đặt được cập nhật bởi các chủ đề khác và trong một số chủ đề, vì giá trị cài đặt không bị khóa, các thay đổi cho một giá trị khác. Trong tình huống đầu tiên, việc thực thi của bạn có thể thất bại, hoặc nó sẽ được thực hiện tốt, nhưng mã đã kiểm tra một tập tin của một số tên, và sau đó lưu bất cứ điều gì vào một tập tin mà không phải là một trong những kiểm tra trước đây. Quay lại đầu trang | Điều này quá tệ, phải không?

Một lợi ích khác là bạn không truy lục giá trị hai lần. Bạn nhận được một lần, và bạn sử dụng bất cứ nơi nào mã của bạn cần phải đọc toàn bộ thiết lập.

0

Tôi chắc chắn, điều thứ hai dễ đọc hơn. Nhưng nếu bạn nói về hiệu suất - không tối ưu hóa ở giai đoạn đầu và không có hồ sơ.

0

Tôi phải đồng ý với những người khác. Khả năng đọc và DRY là quan trọng và chi phí của biến là rất thấp xem xét rằng thường bạn sẽ chỉ có các đối tượng và không thực sự lưu trữ các điều nhiều lần.

Có thể có ngoại lệ với các đối tượng đặc biệt hoặc lớn. Bạn phải ghi nhớ câu hỏi nếu giá trị mà bộ nhớ cache của bạn có thể thay đổi ở giữa và nếu bạn muốn hoặc không (hầu hết các lần thứ hai!) Để biết giá trị mới trong mã của bạn! Trong ví dụ của bạn, hãy nghĩ xem điều gì có thể xảy ra khi ConfigurationManager.AppSettings ["LoggingFile"] thay đổi giữa hai cuộc gọi (do logic truy cập hoặc chuỗi hoặc luôn đọc giá trị từ một tệp từ đĩa).

Resumee: Khoảng 99% bạn sẽ muốn phương pháp thứ hai/bộ nhớ cache!

0

IMO sẽ phụ thuộc vào những gì bạn đang cố gắng lưu vào bộ nhớ cache. Caching một thiết lập từ App.conig có thể không được như benefiial (ngoài khả năng đọc mã) như bộ nhớ đệm kết quả của một cuộc gọi dịch vụ web qua kết nối GPRS.

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