2016-05-29 27 views
57

Nếu tôi không thêm tin trước foo, loadBar, và text, tôi tin rằng họ là công theo mặc định."private" và "công cộng" ở góc 2 thành phần

export class RandomComponent { 
    @Input() foo: string; 
    @Output() loadBar = new EventEmitter(); 
    text: string; 
} 

Có trường hợp sử dụng nào khi chúng là public trong cấu phần không?

Vì lý do đóng gói/bảo mật, tôi có nên thêm private cho tất cả chúng như dưới đây không?

export class RandomComponent { 
    @Input() private foo: string; 
    @Output() private loadBar = new EventEmitter(); 
    private text: string; 
} 

Cảm ơn

Trả lời

100

Có nhiều điều để nói trong câu trả lời cho câu hỏi này, đây là những suy nghĩ đầu tiên mà nhảy lên tâm trí tôi:

Trước hết, hãy ghi nhớ rằng private chỉ là xây dựng thời gian biên dịch - nó không thể được thi hành khi chạy (xem herehere để thảo luận có liên quan). Do vậy, vui lòng không tự sử dụng bất kỳ khái niệm nào của private hữu ích theo bất kỳ cách nào vì mục đích bảo mật. Đó chỉ đơn giản là không phải là những gì nó về.

về đóng gói và khi bạn có trường hoặc phương pháp trên thành phần bạn muốn đóng gói, hãy làm rõ rằng nó không được truy cập từ bất kỳ nơi nào khác, bạn hoàn toàn nên làm private: Đó là những gì private là dành cho: Nó báo hiệu ý định của bạn rằng bất cứ điều gì bạn đã đặt nó trên không nên được xúc động từ bên ngoài lớp học.

Tương tự như vậy đối với public: Nó cũng là cấu trúc chỉ có thời gian biên dịch, vì vậy thực tế là các thành viên của lớp là public theo mặc định, trong khi đúng, có chính xác bằng không khi chạy. Nhưng khi bạn có một thành viên mà bạn có ý định để lộ ra thế giới bên ngoài như một phần của API của lớp học, bạn hoàn toàn nên làm cho nó public để báo hiệu ý định này: Đó là những gì public là dành cho.

Tất cả điều này đều áp dụng được cho Typecript nói chung. Ví dụ, khi sử dụng mẫu container/component (còn gọi là smart/dumb), với các con "câm" tiêm cha mẹ "thông minh" thông qua việc xây dựng, nó cực kỳ quan trọng để giao tiếp ý định của bạn về những gì các thành viên trên cha mẹ nên và không nên được xúc động bởi các trẻ em: Nếu không, đừng ngạc nhiên khi bạn bắt những đứa trẻ câm lừa xung quanh trong tủ rượu của bạn.

Vì vậy, câu trả lời của tôi cho câu hỏi của bạn:

nên tôi luôn luôn thêm tin cho tất cả chúng như dưới đây?

là nhấn mạnh no. Bạn không nên luôn luôn thêm private vì làm như vậy bạn đánh bại mục đích của từ khóa, bởi vì nó không còn báo hiệu bất kỳ ý định nào nếu bạn đặt nó ở mọi nơi: Bạn cũng có thể không đặt nó ở bất kỳ đâu.

+3

cảm ơn cho lời giải thích chi tiết! –

+1

Cảm ơn bạn đã giải thích. Nhưng có lẽ tôi hiểu sai: Tôi hiểu rằng hầu hết các thuộc tính và phương thức thời gian phải là riêng tư (= "cho thành phần này chỉ sử dụng"). Vì vậy, câu trả lời nên là "CÓ theo mặc định, miễn là anh chàng không cần để lộ các tài sản/phương pháp để bên ngoài". Không? Tại sao kết luận giải thích của bạn bằng cách trả lời "không" (có vẻ như là "không bao giờ")? –

+0

Tôi hướng dẫn về góc đỏ 2, và tôi đã không tìm ra khi nào tôi nên sử dụng công khai. Có rất nhiều biến thể cho giao tiếp thành phần: https://angular.io/docs/ts/latest/cookbook/component-communication.html# Có lẽ chúng ta chỉ nên sử dụng công khai cho các thuộc tính và phương thức được xác định thông qua Đầu vào đầu vào. Nhưng tôi không chắc chắn. –

6

@drewmoore cung cấp câu trả lời hay ở chế độ riêng tư/công khai.Nhưng có thêm vài điều cần lưu ý khi sử dụng các giá trị riêng tiêm:

  • Cả hai nguyên cảo (noUnusedLocals) và tslint (no-unused-variable) sẽ báo cáo lỗi nếu bạn sử dụng @Import() private foo, hoặc constructor(private foo) {}, và chỉ sử dụng foo trong mẫu của bạn
  • AOT wont work:

Nếu chúng ta muốn phát ra nguyên cảo như đầu ra của quá trình biên soạn AOT chúng ta phải chắc chắn rằng chúng tôi truy cập chỉ PUBLI lĩnh vực c trong các mẫu của thành phần của chúng tôi **

+0

trở lại điểm đầu tiên của bạn: Những lỗi này không liên quan gì tới thành viên ở chế độ riêng tư hoặc công khai, họ chỉ đơn giản chỉ ra rằng một lỗi không được sử dụng. Hai điểm thứ hai của bạn sẽ hợp lệ nếu câu hỏi là về việc tham chiếu các thành viên riêng tư * trong các mẫu *, nhưng nó không phải là. [Xem ở đây để biết câu hỏi] (http://stackoverflow.com/questions/34574167/angular2-should-private-variables-be-accessible-in-the-template/34574732#34574732) – drewmoore

+0

@drewmoore, bạn là đúng, và tôi hiểu rằng họ cho biết họ không được sử dụng. Tuy nhiên, các biến công khai có thể được sử dụng bên ngoài để nó sẽ _never_ kích hoạt cảnh báo đó. Đối với các câu hỏi: "Có trường hợp sử dụng nào khi chúng được công khai trong thành phần không?", Tôi tin rằng điểm thứ hai và thứ ba của tôi ít nhất là cho biết trường hợp sử dụng khi chúng là public_, cụ thể là khi bạn muốn sử dụng chúng trong mẫu (như được chỉ ra trong văn bản được trích dẫn). – Lucas

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