Helpex - Trao đổi & giúp đỡ Đăng nhập
18

Ok, hãy xem xét thành ngữ phổ biến này mà hầu hết chúng ta đã sử dụng nhiều lần (tôi giả sử):

class FooBarDictionary
{
    private Dictionary<String, FooBar> fooBars;

    ...

    FooBar GetOrCreate(String key)
    {
        FooBar fooBar;

        if (!fooBars.TryGetValue(key, out fooBar))
        {
            fooBar = new FooBar();
            fooBars.Add(key, fooBar);
        }

        return fooBar;
    }
}

Nó có bất kỳ loại tên thành lập nào không?

(Có, nó được viết bằng C #, nhưng nó có thể được chuyển "dễ dàng" sang C ++. Do đó, thẻ đó.)

18 hữu ích 5 bình luận 4.6k xem chia sẻ
5
5 hữu ích 2 bình luận chia sẻ
9

Tôi luôn luôn gọi các chức năng như vậy obtainSomething().

9 hữu ích 0 bình luận chia sẻ
9

Nó phụ thuộc vào lý do tại sao bạn làm điều đó - thành ngữ mà tôi đã thấy được gọi là ghi nhớ, lưu vào bộ nhớ đệm, khởi tạo theo yêu cầu, tạo trong lần sử dụng đầu tiên. Thông thường tôi gọi phương thức "ensureFoo" thay vì "GetOrCreate"

9 hữu ích 0 bình luận chia sẻ
1

Tôi không chắc chắn về tên chương trình tổng thể cho mô hình cấp cao, nhưng Perl có hành vi tuyệt vời này được gọi là Autovivification - cụ thể là, tự động tạo ra băm (bản đồ) chính có giá trị không xác định khi bạn đang truy vấn giá trị của không tồn tại quan trọng trong việc băm .

1 hữu ích 0 bình luận chia sẻ
0

Trong C # ...

... Tôi có một DefaultsDictionary <> làm được điều này. Như một phần thưởng

  • bạn có thể chỉ định giá trị mặc định hoặc chức năng gốc để tạo giá trị cho các khóa bị thiếu:
  • nó đi kèm với chuyển đổi ngầm từ IDictionary <> (gói từ điển)
  • nó đi kèm với các phương thức mở rộng để biến bất kỳ từ điển nào thành DefaultsDictionary <> một cách nhanh chóng

Mã đầy đủ:

Các tiện ích mở rộng .AsDefaultingcó thể được sử dụng để sử dụng một IDictionary<>cách rõ ràng bất kỳ từ điển nào làm từ điển mặc định, vì vậy bạn có thể chọn sử dụng bất kỳ từ điển nào (thậm chí ví dụ: lấy từ API của bên thứ ba) làm từ điển mặc định và vùng chứa bên dưới sẽ được cập nhật với bất kỳ từ điển nào 'tự động vivified' mặt hàng.

Sử dụng nó như

IDictionary<string, MyItem> dict = LoadFromDatabase();

// using a fixed value
SomeFunc(dict.AsDefaulting(defaultItem));

// using an independent generator function
var defaulting = dict.AsDefaulting(() => new MyItem { Id = System.Guid.NewGuid() });

// using a keydepedent generator function
var defaulting = dict.AsDefaulting(key => LazyLoadFromDatabase(key));

Một số trường hợp thử nghiệm

bao gồm:

0 hữu ích 2 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ c# c++ design-patterns idioms , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading