В ООП мне учили, что ваши объекты должны только выставлять своих членов через геттеры и не должны допускать прямой мутации.Angular2 - свойства только для чтения
Глядя на некоторые приложения Angular2, я всегда вижу, что эта концепция нарушена.
export class TodoService {
todos: Array<TodoData> = [];
addTodo(todo: string) {
this.todos.push({
text: todo
});
}
}
В коде выше, нет никакой гарантии, что TODO не будет добавлен в других, чем метод addTodo
способов (например, вызывая todoService.todos.push({text: ''})
или даже путь перезаписи всего массива Todos).
Я всегда стараюсь, чтобы устранить эти возможности нарушения, что делает мои услуги в конечном итоге выглядит примерно так:
export class MyService {
private _myPrimitive: boolean;
get myPrimitive(): { return this._myPrimitive; }
private _myArray: Array<number>;
get myArray(): Array<number> { return this._myArray.splice(0); }
private _myObject: MyObject;
getMyObject(): MyObject { return JSON.parse(JSON.stringify(this._myObject)); }
private _onMyEvent = new Subject<Event>();
get onMyEvent: Observable<Event> { return this._onMyEvent.asObservable(); }
}
Я не вижу этот стиль кодирования в любых приложениях Angular2. Это не просто уродливо, но и медленно, когда дело доходит до обнаружения изменений (стрельба JSON.parse(JSON.stringify(object)
после того, как каждое событие «mousemove» очень дорогое), поэтому, очевидно, я делаю что-то неправильно.
Мой вопрос:
Есть более изящные способы достижения только для чтения behaivour от внешнего
MyService
.Почему нет такой фокусировки на скрытии ненужной логики в Angular2, чем на других языках ООП, таких как Java/C#/PHP.
Почему вы клонируете '_myObject'? Если они построены таким образом, то они должны быть неизменными, не так ли? –
@ GünterZöchbauer Это правда, вы могли бы создать неизменяемый 'myObject', но иногда вам нужно хранить данные с открытыми полями.Также обратите внимание, что неизменяемость - это не то же самое, что доступно только для чтения (кто-то еще может перезаписать «myObject»). Клонируя это, я делаю простую защитную копию (http://www.javapractices.com/topic/TopicAction.do?Id=15), потому что я не хочу, чтобы она была модифицирована извне. Таким образом, объект не будет изменен через общедоступные поля/методы. –
Вы можете использовать сборщики, где классы разрешают только модифицировать с помощью этого построителя. Только когда у вас есть ссылка на этот строитель, вы можете обновлять свойства. Если у вас много таких классов, удобно использовать генерацию кода для таких классов со сборщиками. –