2014-12-02 15 views
23

Tôi tình cờ gặp một thư viện Dependency Injection rất thú vị có tên là . Sử dụng thật dễ dàng để có thể chèn lượt xem vào hoạt động hoặc đoạn.Butterknife Xem tiêm

class ExampleActivity extends Activity { 
    @InjectView(R.id.title) TextView title; 
    @InjectView(R.id.subtitle) TextView subtitle; 
    @InjectView(R.id.footer) TextView footer; 

    @Override public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.simple_activity); 
    ButterKnife.inject(this); 
    // TODO Use "injected" views... 
    } 
} 

Tuy nhiên nếu sử dụng Dependency Injection những lần xem phải public để Butterknife có thể tiêm nó (sử dụng private lĩnh vực kết quả trong một ngoại lệ fields must not be private or static).

Trong dự án trước đây, tôi luôn làm tất cả các trường thành viên (bao gồm cả chế độ xem) private vì tôi nghĩ đây là cách thực hành tốt nhất (ẩn thông tin, v.v.) Bây giờ tôi tự hỏi có lý do nào không nên làm tất cả lượt xem public? Trong trường hợp này tôi không thể sử dụng nhưng tôi muốn sử dụng nó vì nó đơn giản hóa mã rất nhiều.

+0

Không Guice khá nhiều làm điều tương tự tốt hơn nhưng không làm rối tung mã của bạn? –

+0

Tại sao bạn nghĩ nó làm rối tung mã? – Moonlit

+0

@G_V: Có thể, nhưng google nói không sử dụng nó. Xem http://stackoverflow.com/questions/24194283/does-avoid-dependency-injection-frameworks-in-the-android-memory-guide-apply-t và http://stackoverflow.com/questions/5067681/guice -performance-on-android. –

Trả lời

44

Trước hết, Dao bơ không phải là thư viện tiêm phụ thuộc. Bạn có thể coi nó như là một thư viện giảm soạn từ khi nó thay thế findViewById và các cuộc gọi setXxxListener khác nhau.

Lý do khiến Dao bơ yêu cầu chế độ xem không riêng tư là thực sự tạo mã để đặt trường. Mã mà nó tạo ra cuộc sống trong cùng một gói với lớp của bạn, đó là lý do tại sao trường phải là gói riêng tư, được bảo vệ hoặc công khai. Nếu trường là riêng thì mã được tạo sẽ không biên dịch được vì nó không thể truy cập trường riêng.

Các mã được tạo trông giống như sau:

public static void inject(ExampleActivity target, ExampleActivity source) { 
    target.title = (TextView) source.findViewById(R.id.title); 
    target.subtitle = (TextView) source.findViewById(R.id.subtitle); 
    target.footer = (TextView) source.findViewById(R.id.footer); 
} 

Khi bạn gọi ButterKnife.inject(this) nó ngước lên tạo ra lớp này và gọi phương thức inject với bạn thể hiện của ExampleActivity như cả hai điểm đến cho các lĩnh vực và các nguồn cho findViewById cuộc gọi.

+1

Cảm ơn bạn đã làm rõ. Vì vậy, trong ý kiến ​​của bạn tuyên bố các lĩnh vực gói riêng tư hoặc thậm chí công chúng không được coi là thực hành xấu? Tôi chỉ tự hỏi, bởi vì tôi LUÔN LUÔN tuyên bố lĩnh vực của tôi riêng tư và nó cảm thấy một chút sai lầm đối với tôi. Nhưng đồng thời tôi nghĩ rằng nó không tạo ra nhiều khác biệt ... đúng không? – Moonlit

+8

Tôi nghĩ rằng gói riêng tư là đủ giới hạn trong phạm vi mà nó không phải là một việc lớn. Nếu bạn không thể tin tưởng các lớp khác trong gói của bạn thì bạn có vấn đề khác :) Plus gói-tư nhân cũng được sử dụng để lộ những thứ để kiểm tra các lớp học vì vậy nó khá phổ biến để xem. Mặc dù vậy, tôi sẽ không công khai, bạn vẫn muốn ẩn các trường này như là một chi tiết thực hiện. –

+2

Nó làm cho mã khó đọc và bảo trì hơn nhiều, bằng cách phơi bày những thứ không nên chạm vào. Bạn nên luôn đặt mục tiêu viết mã mà người khác có thể đọc mà không mất hàng giờ để tìm hiểu điều gì đang diễn ra. Điều này là vô ích đối với các biến không nên truy cập bên ngoài trình lấy hoặc thiết lập của chúng, nơi bạn có kiểm tra và các điều khiển khác. –

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