2008-10-30 35 views
5

Tôi đang làm việc trong Java trên một dự án khá lớn. Câu hỏi của tôi là về cách cấu trúc tốt nhất bộ thuộc tính cho ứng dụng của tôi.Cách tiếp cận đúng với Thuộc tính

Cách tiếp cận 1: Có một số đối tượng Thuộc tính tĩnh có thể truy cập được bởi mọi lớp. (Nhược điểm: sau đó, một số lớp mất tính tổng quát của chúng nếu chúng được đưa ra khỏi bối cảnh của ứng dụng; chúng cũng yêu cầu các cuộc gọi rõ ràng đối với một số đối tượng tĩnh nằm trong một lớp khác và có thể trong tương lai biến mất; cảm thấy đúng, tôi có sai không?)

Cách tiếp cận 2: Có thuộc tính được khởi tạo bởi lớp chính và chuyển sang các lớp ứng dụng khác. (Nhược điểm: bạn kết thúc việc chuyển một con trỏ tới đối tượng Properties cho hầu hết mọi lớp và dường như trở nên rất dư thừa và rườm rà; tôi không như nó.)

Bất kỳ đề xuất nào?

Trả lời

7

Tôi thích sử dụng tiêm phụ thuộc mùa xuân cho nhiều thuộc tính. Bạn có thể xử lý ứng dụng của mình như xây dựng các khối và tiêm các thuộc tính trực tiếp vào thành phần cần chúng. Điều này bảo tồn (khuyến khích) đóng gói. Sau đó, bạn lắp ráp các thành phần của bạn lại với nhau và tạo ra "lớp chính".

Một hiệu ứng phụ tốt đẹp của việc tiêm phụ thuộc là mã của bạn nên dễ kiểm tra hơn.

+0

Thích hợp hơn vì nó không yêu cầu tham chiếu thuộc tính chung. Nó đặc trưng cho các nhu cầu của lớp. – Robin

1

Có vẻ như bạn cần một cấu phần trình quản lý cấu hình. Nó sẽ được tìm thấy thông qua một số loại định vị dịch vụ, có thể đơn giản như ConfigurationManagerClass.instance(). Điều này sẽ đóng gói tất cả những niềm vui. Hoặc bạn có thể sử dụng một khuôn khổ tiêm phụ thuộc như Spring.

Phần lớn phụ thuộc vào cách các thành phần tìm thấy nhau trong kiến ​​trúc của bạn. Nếu các thành phần khác của bạn đang được truyền xung quanh dưới dạng tham chiếu, hãy làm điều đó. Chỉ cần nhất quán.

0

Tôi thường đi cho một đối tượng đơn lẻ nằm trong một dự án chung và chứa một hashtable của chính nó keyed trên không gian tên, dẫn đến một lớp thuộc tính cho mỗi.

Tiêm phụ thuộc cũng là một cách hay để thực hiện.

2

Thực ra, cách tiếp cận 2 hoạt động thực sự tốt.

Tôi đã thử sử dụng đối tượng thuộc tính Singleton trên một dự án gần đây. Sau đó, khi nó đến thời gian để thêm các tính năng, tôi cần phải sửa đổi Singleton, và hối hận phải xác định vị trí mọi nơi mà tôi sử dụng MySingleton.getInstance().

Cách tiếp cận 2 trong việc truyền một đối tượng thông tin toàn cầu thông qua các nhà thầu khác nhau của bạn dễ kiểm soát hơn.

Sử dụng trình đặt rõ ràng cũng giúp ích.

class MyConfig extends Properties {...} 

class SomeClass { 
    MyConfig theConfig; 
    public void setConfi(MyConfig c) { 
     theConfig= c; 
    } 
    ... 
} 

Nó hoạt động tốt và bạn sẽ rất vui khi kiểm soát chặt chẽ chính xác lớp nào thực sự cần thông tin cấu hình.

+0

Tôi nghĩ MyConfig nên chứa đối tượng Thuộc tính thay vì mở rộng nó. Nhưng nó sẽ hoạt động theo một trong hai cách. – ScArcher2

+0

Cách tiếp cận 2 là con đường để đi. Và tôi có thể đề xuất sử dụng [Guice] (http://code.google.com/p/google-guice/) để quản lý sự phụ thuộc. – albertb

+0

Tôi không thấy cách này tốt hơn. Nếu bạn thay đổi MyConfig (như bạn đã làm singleton), bạn vẫn có cùng một vấn đề tái cấu trúc (phụ thuộc vào những gì thay đổi là tất nhiên) của việc thực hiện các thay đổi ở tất cả các nơi nó được tham chiếu. – Robin

2

Nếu các thuộc tính là cần thiết bởi rất nhiều lớp, tôi sẽ đi cho phương pháp tiếp cận 1. Hoặc có lẽ một biến thể trong đó bạn sử dụng mẫu thiết kế Singleton thay vì tất cả các phương pháp tĩnh. Điều này có nghĩa là bạn không phải tiếp tục truyền một số đối tượng thuộc tính xung quanh. Mặt khác, nếu chỉ có một vài lớp cần các thuộc tính này, bạn có thể chọn cách tiếp cận 2, vì những lý do bạn đã đề cập.Bạn cũng có thể muốn tự hỏi mình có khả năng là các lớp bạn viết thực sự sẽ được tái sử dụng và nếu có, thì vấn đề là sử dụng lại đối tượng thuộc tính như thế nào. Nếu không thể sử dụng lại, đừng bận tâm với nó ngay bây giờ và chọn giải pháp đơn giản nhất cho tình huống hiện tại.

0

Tôi cảm thấy thoải mái hơn khi tôi có con trỏ tĩnh đến thuộc tính trong bộ nhớ của mình. một số lần bạn muốn tải lại các thuộc tính trong thời gian chạy hoặc các chức năng khác dễ thực hiện hơn với tham chiếu tĩnh.

chỉ cần nhớ rằng không có lớp nào là một hòn đảo. một lớp có thể tái sử dụng có thể có một lớp máy khách để giữ cho lõi không bị tham chiếu đơn lẻ.

bạn cũng có thể sử dụng giao diện, chỉ cần cố gắng không lạm dụng nó.

0

Phương pháp tiếp cận 2 hoàn toàn tốt hơn.

Dù sao, bạn không nên để tìm kiếm lớp khác thông qua đối tượng cấu hình. Bạn nên tiêm cấu hình được thực hiện trong đối tượng config ouside đối tượng.

Hãy xem apache commons configuration để được trợ giúp về cấu hình Impl.

Vì vậy, trong main() bạn có thể có

MyObject mobj = new MyObject(); 
mobj.setLookupDelay(appConfig.getMyObjectLookupDelay); 
mobj.setTrackerName(appConfig.getMyObjectTrackerName); 

Thay vì

MyObject mobj = new MyObject(); 
mobj.setConfig(appConfig); 

nơi appConfig là một wrapper quanh thư viện cấu hình apache mà làm tất cả những tra cứu của các cơ sở giá trị trên tên của giá trị trong tệp cấu hình.

cách này đối tượng của bạn trở nên rất dễ dàng kiểm chứng.

1

Nếu bạn đang tìm kiếm thứ gì đó nhanh chóng, bạn có thể sử dụng thuộc tính Hệ thống, chúng có sẵn cho tất cả các lớp. Bạn có thể lưu trữ một giá trị String hoặc nếu bạn cần lưu trữ một danh sách 'stuff', bạn có thể sử dụng phương thức System.Properties(). Điều này trả về một đối tượng 'Properties' là một HashTable. Sau đó bạn có thể lưu trữ những gì bạn muốn vào bảng. Nó không đẹp nhưng đó là một cách nhanh chóng để có tài sản toàn cầu. YMMV

0

Chưa thực hiện Java trong một thời gian, nhưng bạn không thể chỉ đưa thuộc tính của mình vào thuộc tính java.lang.System? Bằng cách này, bạn có thể truy cập các giá trị từ mọi nơi và tránh có lớp thuộc tính "toàn cầu".

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