2012-01-03 15 views
5

Tôi thường tạo các ứng dụng yêu cầu lưu trữ dữ liệu và dữ liệu này được sử dụng trên toàn bộ chương trình. Mặc dù vậy, nó không nhiều, vì vậy tôi thường sử dụng NSUserDefaults để tải/lưu dữ liệu này. Tuy nhiên, mã lưu/tải, cùng với việc đóng gói/giải nén dữ liệu, chiếm không gian, và tôi nghĩ việc chuyển mã này sang các phương thức tái sử dụng bên trong một singleton toàn cầu sẽ là một ý tưởng tốt. Dường như nó đã hoạt động tốt.Có sử dụng singleton làm lớp quản lý dữ liệu không?

Mặc dù vậy, gần đây tôi đã đọc rất nhiều về các tệ nạn của những người độc thân và các đối tượng toàn cầu, và tôi bắt đầu có những suy nghĩ thứ hai. Mọi người thường nói rằng việc sử dụng các singletons hầu như luôn luôn là một dấu hiệu của thiết kế kém. Đối với hầu hết các phần, tôi không đồng ý (tôi nghĩ rằng sử dụng đơn giản như thế này là một mẫu thiết kế tốt), nhưng tôi chắc chắn không có chuyên gia về vấn đề này.

Vì vậy, đang sử dụng đơn lẻ ngay cả theo cách đơn giản như thế này không tốt? Nếu vậy, lựa chọn nào tốt hơn?

+1

Không, không tệ, không tệ chút nào. Xin lưu ý rằng một số lớp iOS SDK do Apple cung cấp được triển khai dưới dạng tệp đơn. Mà không phải là để nói rằng mã Apple là mã tự động tốt, nhưng nó mạnh mẽ ngụ ý rằng mô hình singleton không phải là không có phẩm chất cứu chuộc. – aroth

Trả lời

3

Tôi chắc chắn không đồng ý rằng người độc thân là ác. Họ đôi khi bị lạm dụng có lẽ nhưng trong một số trường hợp chỉ là hoàn hảo cho công việc. Trong một số ứng dụng, bạn nên có một số loại trình quản lý dữ liệu chung. Mẫu đơn được sử dụng rộng rãi trong bản thân SDK (đại biểu ứng dụng, người quản lý được chia sẻ, trung tâm mặc định, v.v.). Thông thường, đây không phải là các trình đơn "thuần túy", như trong bạn có thể truy cập một cá thể được chia sẻ nhưng cũng có thể tạo các cá thể mới nếu cần.

Câu hỏi bạn cần tự hỏi là liệu có thể truy cập vào một cá thể người quản lý dữ liệu từ bất cứ đâu vào bất cứ lúc nào, nếu không thì không phải là đơn lẻ. Tuy nhiên, nếu bạn đang sử dụng các trình đơn trong môi trường đa luồng, bạn cần phải lo lắng về các điều kiện chủng tộc (có thể một luồng sửa đổi một tài nguyên trong khi một luồng khác đang truy cập tài nguyên), tài liệu này có giải thích tốt về cách tốt nhất để đạt được điều này trong Cocoa .

Hãy để tôi cố gắng giải thích bằng ví dụ - Đang sử dụng một số mã từ trò chơi tôi đã viết. Giả sử bạn có một lớp học GameMap và lớp học Tile. GameMap đại diện cho lưới 2 chiều của các đối tượng Tile.

GameMap *gameMap = [[GameMap alloc] init]; 
NSArray *theTiles = gameMap.tiles; 

Trường hợp của GameMap sở hữu lưới ô xếp và tạo lát khi bản đồ trò chơi được tạo. Không cần singleton.

Bạn có thể nói "nhưng tôi chỉ có một GameMap cùng một lúc, thỏa thuận lớn là gì?". Điều gì về tải trò chơi đã lưu hoặc tải cấp mới? Điều đó trở nên dễ dàng như:

// In whatever class object owns the game map 
self.gameMap = [[GameMap alloc] initWithSaveData:saveData]; 

Kết luận, tạo một thể hiện của một lớp có mã để quản lý các trường hợp khác. Giữ ít toàn cầu nhất có thể và mã của bạn sẽ có thể mở rộng và duy trì được nhiều hơn.

+0

Cảm ơn, đó cũng là ý kiến ​​của tôi về mọi thứ. Tôi chỉ cần một chút xác nhận rằng mẫu đơn không phải là tất cả điều ác, vì sau tất cả những gì tôi đã đọc trên đó, có vẻ như chúng là thứ gì đó có thể tránh được bằng mọi giá. –

+0

, rất vui được trợ giúp. tôi đã làm trường hợp của tôi ở trên. Nó giống như quyền này, rượu được cho là xấu cho sức khỏe nhưng nó tốt để uống trong chừng mực. Điều tương tự ở đây. –

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