You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/09-classes/04-private-protected-properties-methods/article.md
+19-19Lines changed: 19 additions & 19 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,5 @@
1
1
2
-
# Приватные и защищённе методы и свойства
2
+
# Приватные и защищённые методы и свойства
3
3
4
4
Один из важнейших принципов объектно-ориентированного программирования -- разделение внутреннего и внешнего интерфейсов.
5
5
@@ -19,17 +19,17 @@
19
19
20
20

21
21
22
-
Множество деталей. Но мы можем пользоваться ею ничего об этом не зная.
22
+
Множество деталей. Но мы можем пользоваться ею, ничего об этом не зная.
23
23
24
-
Кофеварки довольно надежны, не так ли? Мы можем пользоваться ими годами, и если чтото пойдёт не так - отнесём в ремонт.
24
+
Кофеварки довольно надежны, не так ли? Мы можем пользоваться ими годами, и если что-то пойдёт не так - отнесём в ремонт.
25
25
26
26
Секрет надёжности и простоты кофеварки -- все детали хорошо отлажены и *спрятаны* внутри.
27
27
28
-
Если мы снимем защитную крышку с кофеварки, то пользоваться ею будет гораздо сложнее (куда нажимать?) и опасно (может привести к поражению электрическим током).
28
+
Если мы снимем защитный кожух с кофеварки, то пользоваться ею будет гораздо сложнее (куда нажимать?) и опаснее (может привести к поражению электрическим током).
29
29
30
30
Как мы увидим, в программировании объекты похожи на кофеварки.
31
31
32
-
Но, чтобы скрыть внутренние детали, мы будем использовать не защитную крышку, а специальный синтаксис языка и соглашения.
32
+
Но, чтобы скрыть внутренние детали, мы будем использовать не защитный кожух, а специальный синтаксис языка и соглашения.
33
33
34
34
## Внутренный и внешнией интерфейсы
35
35
@@ -42,7 +42,7 @@
42
42
43
43
Внутренний интерфейс используется для работы объекта, его детали используют друг друга. Например, трубка кипятильника прикреплена к нагревательному элементу.
44
44
45
-
Но снаружи кофеварка закрыта защитной крышкой, так что никто этого не может до этого добраться. Детали скрыты и недоступны. Мы можем использовать их функции через внешний интерфейс.
45
+
Но снаружи кофеварка закрыта защитным кожухом, так что никто не может добраться до сложных частей. Детали скрыты и недоступны. Мы можем использовать их функции через внешний интерфейс.
46
46
47
47
Итак, всё, что нам нужно для использования объекта, это знать его внешний интерфейс. Мы можем совершенно не знать, как это работает внутри, и это здорово.
48
48
@@ -53,15 +53,15 @@
53
53
- Публичные: доступны отовсюду. Они составляют внешний интерфейс. До этого момента мы использовали только публичные свойства и методы.
54
54
- Приватные: доступны только внутри класса. Они для внутреннего интерфейса.
55
55
56
-
Во многих других языках также существуют «защищённые» поля: доступные только внутри класса и тех, которые его расширяют. Они также полезны для внутреннего интерфейса. В некотором смысле они более распространены, чем приватные, потому что мы обычно хотим, чтобы наследующие классы получали доступ к внутренним полям для правильного выполнения расширения.
56
+
Во многих других языках также существуют «защищённые» поля, доступные только внутри класса или для дочерних классов. Они также полезны для внутреннего интерфейса. В некотором смысле они более распространены, чем приватные, потому что мы обычно хотим, чтобы наследующие классы получали доступ к внутренним полям для правильного выполнения расширения.
57
57
58
58
Защищённые поля не представлены в JavaScript на уровне языка, но на практике они очень удобны, поэтому их эмулируют.
59
59
60
60
В следующей главе мы будем делать кофеварку на JavaScript со всеми этими типами свойств. Кофеварка имеет множество деталей, мы не будем их моделировать для простоты примера (хотя могли бы).
61
61
62
62
## Защищённое свойство "waterAmount"
63
63
64
-
Давайте для начала создадим простой класс Кофеварка:
64
+
Давайте для начала создадим простой класс для описания кофеварки:
65
65
66
66
```js run
67
67
classCoffeeMachine {
@@ -81,7 +81,7 @@ let coffeeMachine = new CoffeeMachine(100);
81
81
coffeeMachine.waterAmount=200;
82
82
```
83
83
84
-
Прямо сейчас своства`waterAmount` и `power` публичные. Мы можем легко получать и устанавливать им любое значение извне.
84
+
Прямо сейчас свойства`waterAmount` и `power` публичные. Мы можем легко получать и устанавливать им любое значение извне.
85
85
86
86
Давайте изменим свойство `waterAmount` на защищённое, чтобы иметь больше контроля над ним. Например, мы не хотим, чтобы кто-либо устанавливал его ниже нуля.
Этот случай идеально подходит для кофеварки: мощность никогда не меняется.
127
127
128
-
Доя этого нам нужно создать только геттер, а сеттер не создавать:
128
+
Для этого нам нужно создать только геттер, а сеттер не создавать:
129
129
130
130
```js run
131
131
classCoffeeMachine {
@@ -178,7 +178,7 @@ new CoffeeMachine().setWaterAmount(100);
178
178
```smart header="Защищённые поля наследуются"
179
179
Если мы унаследуем `class MegaMachine extends CoffeeMachine`, ничто не защитит нас от доступа к `this._waterAmount` или `this._power` из методов нового класса.
180
180
181
-
Таким образом защищённые методы конечно же наследуются. В отличие от приватных полей, в чем мы убедимся ниже.
181
+
Таким образом защищённые методы, конечно же, наследуются. В отличие от приватных полей, в чём мы убедимся ниже.
182
182
```
183
183
184
184
## Приватное свойство "#waterLimit"
@@ -270,7 +270,7 @@ class CoffeeMachine extends CoffeeMachine() {
270
270
}
271
271
```
272
272
273
-
Во многих случаях такое ограничение слишком жестко. Если мы расширяем `CoffeeMachine`, у нас может быть законная причина для доступа к внутренним методам и свойствам. Поэтому в большинстве случаев используются защищённые свойства, даже если они не поддерживаются синтаксисом языка.
273
+
Во многих случаях такое ограничение слишком жёсткое. Если мы расширяем `CoffeeMachine`, у нас может быть законная причина для доступа к внутренним методам и свойствам. Поэтому в большинстве случаев используются защищённые свойства, даже если они не поддерживаются синтаксисом языка.
274
274
275
275
````warn
276
276
Приватные поля особенные.
@@ -293,28 +293,28 @@ class User {
293
293
294
294
В терминах ООП разделение внутреннего интерфейса от внешнего называется [инкапсуляция](https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%BA%D0%B0%D0%BF%D1%81%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5).
295
295
296
-
Это дает следующие выгоды:
296
+
Это даёт следующие выгоды:
297
297
298
298
Защита для пользователей, чтобы они не выстрелили себе в ногу
299
-
: Представьте себе,что есть команда разработчиков, использующая кофеварку. Она была изготовлена компанией «Best CoffeeMachine» и работает нормально, но защитная крышка была снята. Внутренний интерфейс обнажен.
299
+
: Представьте себе,что есть команда разработчиков, использующая кофеварку. Она была изготовлена компанией «Best CoffeeMachine» и работает нормально, но защитный кожух была снята. Внутренний интерфейс стал доступен извне.
300
300
301
301
Все разработчики культурны -- они используют кофеварку по назначению. Но один из них, Джон, решил, что он самый умный, и сделал некоторые изменения во внутренностях кофеварки. После чего кофеварка вышла из строя через два дня.
302
302
303
-
Это, конечно, не вина Джона, а скорее человека, который снял защитную крышку и позволил Джону делать свои манипуляции.
303
+
Это, конечно, не вина Джона, а скорее человека, который снял защитный кожух и позволил Джону делать свои манипуляции.
304
304
305
305
То же самое в программировании. Если пользователь класса изменит вещи, не предназначенные для изменения извне -- последствия непредсказуемы.
306
306
307
307
Поддерживаемость
308
-
: Ситуация в программировании сложнее, чем с реальной кофеваркой, потому что мы не просто покупаем ее один раз. Код постоянно подвергается разработке и улучшению.
308
+
: Ситуация в программировании сложнее, чем с реальной кофеваркой, потому что мы не просто покупаем её один раз. Код постоянно подвергается разработке и улучшению.
309
309
310
310
**Если мы строго разграничим внутренний интерфейс, то разработчик класса может свободно изменять его внутренние свойства и методы, даже не информируя пользователей..**
311
311
312
-
Гораздо проще разрабатывать, если вы знаете, что определенные методы можно переименовывать, их параметры можно изменять и даже удалять, потому что от них не зависит внешний код.
312
+
Гораздо проще разрабатывать, если вы знаете, что определённые методы можно переименовывать, их параметры можно изменять и даже удалять, потому что от них не зависит внешний код.
313
313
314
-
С выходом новой версии вы можете подностью все переписать, но для пользователя будет просто обновиться, если внешний интерфейс остался такой же.
314
+
С выходом новой версии вы можете полностью всё переписать, но пользователю надо будет просто обновиться, если внешний интерфейс остался такой же.
315
315
316
316
Сокрытие сложности
317
-
: Люди обожают использовать простые вещи. По крайней мере снаружи. Что внутри, это другое дело.
317
+
: Люди обожают использовать простые вещи. По крайней мере, снаружи. Что внутри -- это другое дело.
0 commit comments