2008-12-23 68 views
5

Hãy xem xét một lớp C++. Khi bắt đầu thực hiện, tôi muốn đọc một tập các giá trị từ một tệp XML và gán chúng cho 7 thành viên dữ liệu của lớp này. Các giá trị đó không thay đổi trong suốt quá trình thực hiện và chúng phải được chia sẻ bởi tất cả các đối tượng/các cá thể của lớp đang được đề cập đến. Các thành viên dữ liệu tĩnh là cách thanh lịch nhất để đạt được hành vi này? (Tất nhiên, tôi không xem xét các biến toàn cục)Tôi có nên sử dụng các thành viên dữ liệu tĩnh không? (C++)

Trả lời

3

Âm thanh như sử dụng tốt các biến tĩnh với tôi. Bạn đang sử dụng những thông số này nhiều hơn như các tham số cố định hơn các biến và các giá trị hợp pháp cần phải được chia sẻ.

3

thành viên tĩnh sẽ hoạt động ở đây và được chấp nhận hoàn toàn. Một tùy chọn khác là sử dụng singleton pattern cho lớp chứa các thành viên này để đảm bảo rằng chúng được tạo/chỉ đặt một lần.

5

Như những người khác đã đề cập, việc sử dụng các thành viên tĩnh trong trường hợp này có vẻ phù hợp. Chỉ cần nhớ rằng nó không phải là dễ dàng; một số vấn đề với dữ liệu chung áp dụng cho các thành viên tĩnh:

  • Bạn không thể kiểm soát thứ tự khởi tạo các thành viên tĩnh của mình, vì vậy bạn cần đảm bảo rằng không có hình cầu hoặc số liệu thống kê nào khác đề cập đến các đối tượng này. Xem this C++ FAQ Question để biết thêm chi tiết và cũng có một số mẹo để tránh sự cố này.
  • Nếu bạn truy cập chúng trong môi trường đa luồng, bạn cần đảm bảo rằng các thành viên được khởi tạo hoàn toàn trước khi bạn sinh ra bất kỳ chủ đề nào.
+0

Các giá trị đang được đặt khi bắt đầu thực thi, do đó, các vấn đề đó không thực sự áp dụng ở đây. –

+0

David, họ sẽ một khi bạn quyết định đặt một đối tượng xml như một đối tượng tĩnh ở đâu đó. cũng có trật tự hủy diệt cũng có liên quan. xem câu trả lời của tôi dưới đây. –

2

giống như cách sử dụng thích hợp các thành viên lớp tĩnh. chỉ cần đừng quên rằng chúng thực sự là các biến toàn cầu với một không gian tên và (có thể) một số bảo vệ. do đó, nếu có khả năng ứng dụng của bạn một ngày nào đó có thể phát triển 'môi trường' riêng biệt hoặc thứ gì đó cần một tập hợp các hình cầu này cho mỗi thứ, bạn sẽ vẽ mình vào một góc.

theo đề xuất của Rob, hãy xem xét sử dụng một singleton, dễ dàng hơn để biến sau này thành một loại biến môi trường được quản lý.

3

Nó không phải là một thiết kế sạch sẽ. Các thành viên lớp tĩnh là trạng thái toàn cục và global state is bad.

Nó có thể không gây rắc rối cho bạn nếu đây là một dự án vừa và nhỏ và bạn không có mục tiêu cao để thử nghiệm tự động, nhưng vì bạn hỏi: có những cách tốt hơn.

Thiết kế gọn gàng hơn là tạo Nhà máy cho lớp và nhờ Nhà máy chuyển bảy biến của bạn cho lớp khi nó tạo cấu trúc. Sau đó, nó là trách nhiệm của nhà máy để đảm bảo rằng tất cả các trường hợp chia sẻ cùng một giá trị.

Bằng cách đó, lớp học của bạn trở nên có thể kiểm tra và bạn đã tách riêng mối quan tâm của mình.

PS. Don'tusesingletonseither.

+2

Bất cứ lúc nào tôi đọc "xxx là xấu", máy dò phóng đại của tôi bắt đầu nhấp nháy. Giống như các áp phích khác, tôi tin rằng việc sử dụng các biến tĩnh này là hoàn toàn hợp lệ. –

+1

Trạng thái toàn cầu chủ yếu là xấu nếu nó thay đổi. Thay đổi trạng thái toàn cầu, điều này là, hoạt động tốt. –

+0

Chỉ cần đọc liên kết của bạn; nó nói rằng Singletons (và tình trạng tương đương gần như toàn cầu) không làm hại bất cứ điều gì nếu chúng chứa dữ liệu bất biến, mà đây là. –

0

Miễn là bạn nghĩ về khả năng thử nghiệm và bạn có cách khác để đặt biến tĩnh ngoài đọc trong tệp, ngoài ra bạn không dựa vào dữ liệu không thay đổi trong toàn bộ thời gian thực hiện của quá trình - bạn nên khỏe.

Tôi đã nhận thấy rằng việc viết các bài kiểm tra khi bạn thiết kế mã giúp bạn giữ mã tốt và có thể tái sử dụng được.

1

Có, các trình dữ liệu tĩnh là những gì bạn tìm kiếm.Nhưng bạn phải quan tâm đến thứ tự khởi tạo/hủy diệt của các biến tĩnh của bạn. Không có cơ chế trong C++ để đảm bảo rằng các biến tĩnh của bạn được khởi tạo trước khi bạn sử dụng chúng trên các đơn vị dịch. Để an toàn, hãy sử dụng mẫu trông giống như mẫu đơn và được biết là khắc phục vấn đề đó. Nó hoạt động vì:

  1. Tất cả các đối tượng tĩnh được xây dựng hoàn chỉnh sau khi hoàn thành bất kỳ trường hợp xml_stuff nào.
  2. Thứ tự hủy diệt các đối tượng tĩnh trong C++ là hoàn toàn trái ngược với việc hoàn thành xây dựng của chúng (khi hàm tạo của chúng kết thúc thực thi).

Code:

class xml_stuff { 
public: 
    xml_stuff() { 
     // 1. touch all members once 
     // => 2. they are created before used 
     // => 3. they are created before the first xml_stuff instance 
     // => 4. they will be destructed after the last xml_stuff instance is 
     //  destructed at program exit. 
     get_member1(); 
     get_member2(); 
     get_member3(); 
     // ... 
    } 

    // the first time their respective function is called, these 
    // objects will be created and references to them are returned. 
    static type1 & get_member1() { static type1 t; return t; } 
    static type2 & get_member2() { static type2 t; return t; } 
    static type1 & get_member3() { static type1 t; return t; } 
    // ... all other 7 members 
}; 

Bây giờ, các đối tượng được trả về bởi xml_stuff :: get_memberN() có giá trị toàn bộ cuộc đời của bất kỳ trường hợp xml_stuff, bởi vì bất kỳ của những thành viên đã được xây dựng trước khi bất kỳ trường hợp xml_stuff. Sử dụng các thành phần dữ liệu tĩnh thuần túy, bạn không thể đảm bảo rằng, bởi vì thứ tự tạo trên các đơn vị dịch được để lại không xác định trong C++.

2

Vào đầu thực hiện Tôi muốn đọc một tập hợp các giá trị từ một tập tin XML và gán chúng đến 7 của thành viên dữ liệu của lớp này. Những giá trị không thay đổi trong toàn bộ quá trình thực hiện và chúng phải được chia sẻ bởi tất cả các đối tượng/trường hợp của lớp học được đề cập.

Câu in đậm là dấu đầu dòng ở đây. Miễn là tuyên bố đó giữ, việc sử dụng các biến tĩnh là OK. Điều này sẽ được thực thi như thế nào?

Thật khó. Vì vậy, nếu để sử dụng của bạn ngay bây giờ tuyên bố là luôn luôn đúng, đi trước. Nếu bạn muốn giống nhau từ một số nhà phát triển tương lai (hoặc bạn) sử dụng các lớp của bạn sai (như đọc một tệp XML khác trong chương trình), thì hãy làm một cái gì đó giống như những gì Rasmus Farber nói.

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