Если я не добавляю приватные ранее foo
, loadBar
и text
, я считаю, что они общедоступны по умолчанию.
export class RandomComponent {
@Input() foo: string;
@Output() loadBar = new EventEmitter();
text: string;
}
Есть ли какой-либо вариант использования, когда они находятся public
в компоненте?
Должен ли я всегда добавлять private
для всех из них, как показано ниже, по соображениям инкапсуляции / безопасности ?
export class RandomComponent {
@Input() private foo: string;
@Output() private loadBar = new EventEmitter();
private text: string;
}
Спасибо
typescript
angular
Хунбо Мяо
источник
источник
Ответы:
В ответ на этот вопрос есть что сказать, это первые мысли, которые пришли мне в голову:
Прежде всего, имейте в виду, что
private
это конструкция только во время компиляции - она не может быть применена во время выполнения (см. Здесь и здесь для соответствующего обсуждения). Таким образом, пожалуйста, избавьтесь от любых представлений о том,private
что это может быть полезно в целях безопасности. Дело не в этом.Речь идет об инкапсуляции, и когда у вас есть поле или метод в вашем компоненте, который вы хотите инкапсулировать в нем, давая понять, что к нему нельзя обращаться из другого места, тогда вы обязательно должны это сделать
private
: вот для чегоprivate
: Это сигнализирует о вашем намерении не трогать то, что вы его надели, извне.То же самое касается
public
: это тоже конструкция, предназначенная только для времени компиляции, поэтому тот факт, что члены классаpublic
по умолчанию, пока истинны, имеет ровно нулевое значение во время выполнения. Но если у вас есть член, который вы явно намереваетесь предоставить внешнему миру как часть API вашего класса, вы обязательно должны сделать так,public
чтобы он сигнализировал об этом намерении: вот для чегоpublic
.Все это применимо к Typescript в целом. В частности, в Angular есть определенно допустимые варианты использования общедоступных членов в классах компонентов: например, при реализации шаблона контейнер / компонент (он же умный / тупой ) с «тупыми» дочерними элементами, вводящими «умных» родителей посредством внедрения конструктора, Чрезвычайно важно сообщить о своем намерении относительно того, какие члены родителя должны и не должны касаться детей: в противном случае не удивляйтесь, когда вы поймаете, что эти тупые дети дурачатся в винном шкафу своих родителей.
Итак, мой ответ на ваш вопрос:
категорически нет . Вы не должны всегда добавлять,
private
потому что, поступая так, вы нарушаете цель ключевого слова, потому что оно больше не сигнализирует о каком-либо намерении, если вы помещаете его повсюду: с таким же успехом вы можете не помещать его никуда.источник
@drewmoore дает хороший ответ в том смысле, что частный / публичный сводится к намерению. Но есть еще несколько вещей, которые следует учитывать при использовании введенных частных значений:
@Import() private foo
, илиconstructor(private foo) {}
, и используете толькоfoo
в своем шаблонеисточник