"Private" và "public" trong thành phần Angular


120

Nếu tôi không thêm tin trước foo, loadBartext, tôi tin rằng họ là công theo mặc định.

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 publicở trong thành phần không?

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

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

Cảm ơn


Để đơn giản, một hàm Riêng tư chỉ có thể sử dụng trong thành phần. Không thể truy cập một chức năng riêng tư từ thành phần khác. Giả sử trong dịch vụ, Nếu một hàm khai báo là Riêng tư thì nó không thể được truy cập từ bất kỳ thành phần nào khác.
Kevin

Câu trả lời:


202

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

Đầu tiên và quan trọng nhất, hãy nhớ rằng đó privatechỉ là một cấu trúc thời gian biên dịch - nó không thể được thực thi trong thời gian chạy (xem ở đâyở đây để thảo luận liên quan). Do đó, vui lòng vô hiệu hóa bản thân bất kỳ quan niệm nào về privateviệc hữu ích theo bất kỳ cách nào cho mục đích bảo mật. Đó đơn giản không phải là những gì nó nói.

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

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

Điều này có thể áp dụng cho tất cả các loại chữ nói chung. Cụ thể, trong Angular, chắc chắn có các trường hợp sử dụng hợp lệ để có các thành viên công khai trên các lớp thành phần: Ví dụ: khi triển khai mẫu vùng chứa / thành phần (hay còn gọi là thông minh / câm ), với những đứa trẻ "câm" tiêm cha mẹ "thông minh" thông qua phương thức tiêm hàm tạo, Điều cực kỳ quan trọng là phải truyền đạt ý định của bạn về những điều mà các thành viên trong nhóm cha mẹ nên và không nên để trẻ chạm vào: Nếu không, đừng ngạc nhiên khi bạn bắt gặp những đứa trẻ ngu ngốc đó đang lừa xung quanh tủ rượu của cha mẹ chúng.

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

Tôi có nên luôn thêm private cho tất cả chúng như bên dưới không?

là một không . Không phải lúc nào bạn cũng nên thêm privatevào bởi vì khi 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.


5
Cảm ơn vì lời 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 thời gian và phương thức phải là riêng tư (= "chỉ sử dụng thành phần này"). Vì vậy, câu trả lời nên mặc định là "CÓ, miễn là anh chàng không cần để lộ tài sản / phương pháp ra bên ngoài". Không? Tại sao kết luận lời giải thích của bạn bằng cách trả lời "không" (nghe giống như "không bao giờ")?
M'sieur Toph '

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

Tôi thường phải sử dụng 'public' khi tôi khai báo một thuộc tính trong phương thức khởi tạo không được sử dụng bên trong lớp, nhưng được sử dụng bên ngoài (tức là bên trong một khuôn mẫu hoặc một thành phần khác).
tuliomarchetto

18

@cedmoore cung cấp một câu trả lời tốt về mục đích riêng tư / công khai. Nhưng có một số điều nữa cần xem xét khi sử dụng các giá trị riêng tư được chèn:

Nếu chúng ta muốn phát ra TypeScript làm đầu ra của quá trình biên dịch AoT, chúng ta phải đảm bảo rằng chúng ta chỉ truy cập vào các trường công khai trong các mẫu của các thành phần của chúng ta **


lại điểm đầu tiên của bạn: Những lỗi đó không liên quan gì đến việc một thành viên là riêng tư hay công khai, chúng chỉ đơn giản chỉ ra rằng một thành viên 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 về việc tham chiếu các thành viên riêng tư trong các mẫu , nhưng không phải vậy. Xem ở đây cho một câu hỏi được
đã rút ra vào

@ Regimoore, bạn nói đú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ên nó sẽ không bao giờ kích hoạt cảnh báo đó. Đối với chính 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 chỉ ra một trường hợp sử dụng khi chúng ở chế độ công khai , 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 trích dẫn).
Lucas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.